NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.

Diskuze: komunikace PC-Arduino

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
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.