Diskuze: komunikace mezi c# a arduino

Ostatní jazyky Ostatní programovací jazyky komunikace mezi c# a arduino

Aktivity (1)
Avatar
dawes12
Člen
Avatar
dawes12:2.4.2015 21:08

Ahoj chtěl bych se zeptat jestli někdo neví jak přenášet číslo z C# do arduina.
Zkoušel jsem to takto:
C#:

SerialPort sp = new SerialPort("COM4",9600);
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            sp.Open();
            string s = textBox1.Text;
            sp.Write(s);
            sp.Close();
        }

Arduino:

int a=0;
string s="0";

void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
}

void loop() {
s=Serial.write();
a=s.toInt();

        }
 
Odpovědět 2.4.2015 21:08
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:2.4.2015 21:17

Ahoj,

pokud chceš přenést číslo z PC (C#) do Arduina, tak bys měl v Arduinu z toho sériového portu číst, ne do něj zapisovat (Serial.Write).

Nejsem si jistý, zda vůbec Serial.Write() má variantu bez parametrů.

Jinak co se týče čtení ze sériového portu, pravděpodobně budeš muset uvést počet znaků, které chceš načíst. Buď tedy používej nějaký znak jako ukončovač odesílaného řetězce, nebo zkus více prostudovat dokumentaci ohledně sériového portu.

Nahoru Odpovědět 2.4.2015 21:17
2 + 2 = 5 for extremely large values of 2
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:2.4.2015 21:28

Jednoduše - potřebuješ tim tlačit stovky čísel za vteřinu?
Asi ne. Jednoduše ŽAVES, v C# serial.println(cis­lo.ToString()), v Arduinu to pak přečti jako string a udělej z toho int (myslím int vstup = Serial.readStrin­g().ToInt(); ), není co řešit.

Editováno 2.4.2015 21:28
Nahoru Odpovědět  +1 2.4.2015 21:28
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
dawes12
Člen
Avatar
dawes12:2.4.2015 21:51

Tak už to skoro funguje (dioda se rozsvítí a tak po 2 vteřinách zhasne) a okno s tlačítkem se zasekne ale nehodí to žádnou vyjímku.
c#

SerialPort sp = new SerialPort("COM4",9600);
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            sp.Open();
          //  string s = textBox1.Text;
            int a = 17;
            sp.Write(a.ToString());
            string zprava = sp.ReadLine();
            label1.Text = zprava;
            sp.Close();

        }

arduino:

int led=13;
void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
        pinMode(led,INPUT);
}

void loop() {

int vstup = Serial.readString().toInt();

if(vstup>15)
{
  digitalWrite(led,HIGH);
  }
  else
  {
    digitalWrite(led,LOW);
  }
}
 
Nahoru Odpovědět 2.4.2015 21:51
Avatar
dawes12
Člen
Avatar
dawes12:2.4.2015 22:06

Tak vyjímka je: UnauthorizedAc­cessException

 
Nahoru Odpovědět 2.4.2015 22:06
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na dawes12
Adam Ježek:3.4.2015 9:43

pokud se nepletu, tak ta vyjímka je v řádku sp.Close();. Můžeš to zkusit odkrokovat přes breakpointy, ale na 99% tu vyjímku nedostaneš. Proč? Ty přečteš ze sériovýho portu a hned ho chceš uzavřít, to na to jdeš moc rychle, tam stále běží to naslouchání. Mělo by stačit před sp.Close(); přidat ještě Thread.Sleep(300);, když to nepomůže, tak dej víc než 300ms. Každopádně mi nepřijde dobrý nápad zavírat port po každém přečtení, já bych zavření dělal až při ukončení aplikace (myslím FormClosed event).

Nahoru Odpovědět  +1 3.4.2015 9:43
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Adam Ježek:3.4.2015 9:49

ještě k tomu zhasínání ledky - to je asi špatně, co? :D
podle mě za to může to, že z portu čteš i ikdyž tam nic neni, ten řádek pouprav na

if(Serial.available()) //pokud jsou data k přečtení
    int vstup = Serial.readString().toInt();
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 3.4.2015 9:49
Pokud chceš odpovědět, klikni na odpovědět. Pokud chceš vložit zdroják, klikni na vložit zdroják (</>)
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:3.4.2015 10:06
pinMode(led,INPUT);

Ten pin bys měl asi nastavit jako výstupní, když tam zapisuješ, ne (OUTPUT)?

Krom toho pozor na to, že rutina loop() se volá periodicky, což znamená, že se Arduino bude pokoušet číst ze sériového portu asi vícekrát, než stihneš tisknout tlačítko. V dokumentaci k Serial.readString() se píše, že ta funkce může skončit timeoutem (a tedy nenačte žádná data). Serial.available to ale bude řešit, to je pravda.

Nahoru Odpovědět  +1 3.4.2015 10:06
2 + 2 = 5 for extremely large values of 2
Avatar
dawes12
Člen
Avatar
dawes12:3.4.2015 11:12

Jo dík už to funguje ..jenom jsem to musel dát do konstruktoru.Na tlačítko to nereagovalo ale stím si už nějak pohraju dík moc.

 
Nahoru Odpovědět 3.4.2015 11:12
Avatar
dawes12
Člen
Avatar
dawes12:3.4.2015 12:54

Ještě jeden dotaz bych měl.
Nemá jiné kódování arduino než c# ? protože když přenáším čísla pomocí string tak diody na výstupu svítí jinak než by měli.

 
Nahoru Odpovědět 3.4.2015 12:54
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na dawes12
Martin Dráb:3.4.2015 13:02

Ano, měl bysis zjistit, jaké kódování je použito u toho řetězce v C#. U Arduina bych to tipoval na ANSI.

U toho C# řetězce by ani nevadilo, kdyby byl v UTF8 (pro "číselné" hodnoty by to byšlo stejně jako ANSI), ale skoro bych řekl, že tam bude Unicode.

Nahoru Odpovědět 3.4.2015 13:02
2 + 2 = 5 for extremely large values of 2
Avatar
dawes12
Člen
Avatar
dawes12:3.4.2015 13:18

tak pokuď nevadí ANSI tab Unicode by také nemělo vadit protože čísla se nachází na stejné pozici(30-39).Jenom samý problémy se sériovým portem

 
Nahoru Odpovědět 3.4.2015 13:18
Avatar
dawes12
Člen
Avatar
dawes12:3.4.2015 14:01

tak už to jde jenom musím odeslat data pomocí tlačítka protože když to odešlu pomocí události na Texbox(nebo trackbar) tak to ukazuje nesmysli.

 
Nahoru Odpovědět 3.4.2015 14:01
Avatar
lazenska.wewerka:24. ledna 12:27

Zdravím všechny. Blbnu si s vyměňováním dat mezi arduinem a aplikačkou napsanou v C#. Pokud použiju desku s spřevodníkem (třeba UNO), je vše ok. Nastavím název portu, baudrate a otevřu port. Všechno funguje podle očekávání. Pokud tohle ale udělám s deskou bez převodníku (arduino Micro, Leonardo, ...), port se sice z pohledu aplikace na PC jeví jako otevřený, ale ardujino nekomunikuje, nereaguje na příchozí data(i když RX bliká jako zběsilý) a nic neposílá.. Neví někdo, jak ho donutit povídat. Serial monitor to dokáže bez problému, ale moje appka ne. Díky za nápady :-)

 
Nahoru Odpovědět 24. ledna 12:27
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 14 zpráv z 14.