Avatar
dawes12
Člen
Avatar
dawes12:

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:

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:

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:

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:

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:

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:

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:
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:

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:

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:

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:

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:

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
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 13 zpráv z 13.