IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Petr Adámek
Člen
Avatar
Petr Adámek:1.4.2020 13:36

Ahoj
Tvořím formulářovou aplikaci pro komunikaci mezi PC - Arduinem. Jedná se o odesílání dat a následné uožení do EEPROM arduina.

  1. Nejde mi šikovně aktualizovat combobox s aktuálně dostupnými porty
  2. Nejde mi sériově komunikovat s arduinem v případě, že ho k PC připojím až po zapnutí aplikace nebo při zapnuté aplikaci desku odpojím a pak připojím.

Zkusil jsem: 1.
Zkoušel jsem combox aktualizovat pomocí funkce click (combobox_click) -> combobox se aktualizuje až po otevření -> nutné otevřít dvakrát pro vybrání nového portu... řešení není adekvátní
Zkoušel jsem také aktualizovat pomocí timeru, také není fajn.

2.Vyzkoušel jsem otevřít/zavřít seriový port po každe komunikaci - nefunkční..

Chci docílit: 1. Představuju si průběžné aktualizovaný combobox s aktuálně dostupnými porty

2. Výsledné řešení by mělo komunikovat po odpojení a připojení desky. Jde o to, aby uživatel mohl připojit jinou desku a nahrávat na ni. Taktéž, docílit funkčnosti po připojení desky až po spuštění aplikace.

 
Odpovědět
1.4.2020 13:36
Avatar
Petr Adámek
Člen
Avatar
Petr Adámek:1.4.2020 13:38

Kód z Visual studia

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication21
{
    public partial class Form1 : Form
    {
        bool isConnected = false;
        String[] ports;
        SerialPort port;

        int hodnota;
        string hodnotaString;
        string odesli;
        string adresaODESLAT = "H1 ";
        string adresaNACIST = "h1 ";
        string nacist;

        public Form1()
        {
            InitializeComponent();
            disableControls();
            getAvailableComPorts();

            foreach (string port in ports)
            {
                comboBox1.Items.Add(port);
                Console.WriteLine(port);
                if (ports[0] != null)
                {
                    comboBox1.SelectedItem = ports[0];
                }
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (!isConnected)
            {
                connectToArduino();
            }
            else
            {
                disconnectFromArduino();
            }
        }

        void getAvailableComPorts()
        {
            ports = SerialPort.GetPortNames();
        }

        private void connectToArduino()
        {
            isConnected = true;
            string selectedPort = comboBox1.GetItemText(comboBox1.SelectedItem);
            port = new SerialPort(selectedPort, 9600, Parity.None, 8, StopBits.One);
            port.Open();
            button2.Text = "odpojit";
            enableControls();
        }

        private void disconnectFromArduino()
        {
            isConnected = false;
            port.Close();
            button2.Text = "pripojit";
            disableControls();
            resetDefaults();
        }

        private void enableControls()
        {
            comboBox1.Enabled = false;
            button1.Enabled = true;
            button3.Enabled = true;
            numericUpDown1.Enabled = true;
        }

        private void disableControls()
        {
            comboBox1.Enabled = true;
            button1.Enabled = false;
            button3.Enabled = false;
            numericUpDown1.Enabled = false;
        }

        private void resetDefaults()
        {

            label1.Text = "";

        }

        private void button1_Click(object sender, EventArgs e)
        {
            hodnota = Convert.ToInt32(numericUpDown1.Value);
            hodnotaString = Convert.ToString(hodnota);
            odesli = adresaODESLAT + hodnotaString;

            port.WriteLine(odesli);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            port.WriteLine(adresaNACIST);
            nacist = port.ReadLine();
            label1.Text = nacist;
        }

        private void comboBox1_Click(object sender, EventArgs e)
        {

            comboBox1.Items.Clear();
            ports = SerialPort.GetPortNames();
            //comboBox1.Items.Clear();

            //getAvailableComPorts();
            //nactiport();
            foreach (string port in ports)
            {
                comboBox1.Items.Add(port);

                if (ports[0] != null)
                {
                    comboBox1.SelectedItem = ports[0];
                }
            }

        }

    }
}

Kód arduina

#include <EEPROM.h>

int hodnota;


String inputString="";
byte stringComplete;


void writeToEEPROM(int adr, byte data){
  byte val = EEPROM.read(adr);
  if (data!=val){EEPROM.write(adr, data);}
}

void readSettings(){
  hodnota = EEPROM.read(0);

}

void setup() {
  Serial.begin(9600);
  readSettings();
}


void EEPROMka()
{
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
  }

  if (stringComplete){
    inputString.trim();
    char* data = inputString.c_str();
    char* part = strtok(data, " ");

      //////////////////////////////////////
      //////////////////////////////////////
      //Zápis

    if (strcmp(part, "H1") == 0){
      part = strtok(NULL, " ");
      int adr=0;
        int val = atoi(part);
            writeToEEPROM(adr,val);
            /*Serial.print("EEPROM[");
            Serial.print(adr,DEC);
            Serial.print("]<=");
         Serial.println(val,DEC);*/
      readSettings();
    }
      //Zápis



      //////////////////////////////////////
      //////////////////////////////////////
      //ČTENÍ
      if (strcmp(data, "h1") == 0)
      {
      //Serial.print("HODINA1=");
      Serial.println(hodnota,DEC);
      }


      //ČTENÍ
      //////////////////////////////////////
      //////////////////////////////////////


    inputString="";
    stringComplete=0;
  }
}





void loop() {

  EEPROMka();
}
 
Nahoru Odpovědět
1.4.2020 13:38
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.