Diskuze: komunikace mezi c# a arduino

Člen

Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.
Jednoduše - potřebuješ tim tlačit stovky čísel za vteřinu?
Asi ne. Jednoduše ŽAVES, v C# serial.println(cislo.ToString()), v
Arduinu to pak přečti jako string a udělej z toho int (myslím int vstup
= Serial.readString().ToInt(); ), není co řešit.
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);
}
}
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).
ještě k tomu zhasínání ledky - to je asi špatně, co?
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();
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.
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.
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
Zdravim s Arduinem blbnu uz mesic. A kodovani ma klasickou ASCI tablukou takze cisla zacinaj na hodnote 48 coz je 0. Na programovani komunikace pouzivam Proccesing.
Zobrazeno 15 zpráv z 15.