Raspberry, Arduino, Mini-PC a další
Moderátor: Moderátoři
paycz
Příspěvky: 283 Registrován: 13 říj 2014, 00:00
#1
Příspěvek
od paycz » 11 bře 2017, 17:02
Ahoj, chtěl jsem si vytvořit komunikaci mezi Visual studio a arduino, ale nevím proč se mi odeslané data neuloží do proměnné
code C sharp
Kód: Vybrat vše
SerialPort arduino = new SerialPort(); string[] ports = SerialPort.GetPortNames(); arduino_ports.DataSource = ports; string port = arduino_ports.SelectedItem.ToString(); arduino.PortName = port; arduino.BaudRate = 250000; arduino.WriteTimeout = 1000; arduino.Open(); string buffer = ( trackBar1.Value.ToString() + trackBar2.Value.ToString() + trackBar3.Value.ToString() + trackBar4.Value.ToString() + trackBar5.Value.ToString() + trackBar6.Value.ToString() + trackBar7.Value.ToString() + trackBar8.Value.ToString() + trackBar9.Value.ToString() ); byte[] buf = System.Text.Encoding.UTF8.GetBytes(buffer); arduino.Write(buf,0, buf.Length);code arduino
Kód: Vybrat vše
int recdata[10]; int bytes = 0; Serial.begin(250000); Serial.setTimeout(1000); while(Serial.available()) { if (bytes < 10) { recdata[bytes]=Serial.read(); bytes++; } } analogWrite(9,recdata[0]);
frpr666
Příspěvky: 1051 Registrován: 28 pro 2009, 00:00
#2
Příspěvek
od frpr666 » 11 bře 2017, 17:46
C sharp nevím, ale ten kód pro arduino vyhazuje chybu při překladu.
Tobě to přeložilo v pořádku ?
Zkusil bych snížit přenosovou rychlost na 19200. Nevím zda 250000 bps zvládne fyzická vrstva.
Edit 1 arduino program má většinou bloky
setup()
{}
a
loop()
{}
https://www.arduino.cc/en/Reference/HomePage
Cowley
Příspěvky: 3580 Registrován: 04 úno 2005, 00:00
#3
Příspěvek
od Cowley » 11 bře 2017, 17:51
Ten kod asi nebude cely, hlavne ten AnalogWrite pouze s prvni zachycenou a ulozenou hodnotou.
paycz
Příspěvky: 283 Registrován: 13 říj 2014, 00:00
#4
Příspěvek
od paycz » 11 bře 2017, 17:53
samozřejmě že tam mám loop z programu jsem vytáhl jen části potřebné pro komunikaci
Cowley analog write je tam pro kontrolu když jsem testoval jestli mezi sebou komunikují ale PWM se nemění takže tam je někde problém
Cowley
Příspěvky: 3580 Registrován: 04 úno 2005, 00:00
#5
Příspěvek
od Cowley » 11 bře 2017, 18:01
Tak to jo... jen ze by bylo lepsi nechat treba vypsat hodnotu promenne nebo bliknout LEDkou.
A co napojit nejaky terminal (treba Hercules) a zjistit, jestli je chyba na strane PC nebo v Arduinu.
Kdyz nevim kde by mohla byt chyba, prihraju do programu SoftwareSerial a hodnoty zachycene na jednom portu odesilam do druheho PC prave pres SoftwareSerial.
frpr666
Příspěvky: 1051 Registrován: 28 pro 2009, 00:00
#6
Příspěvek
od frpr666 » 11 bře 2017, 18:36
potom zjednoduš program a nasdílej.
Jinak neumím dát komentář k programu, který není celý a nejde zkompilovat...
paycz
Příspěvky: 283 Registrován: 13 říj 2014, 00:00
#7
Příspěvek
od paycz » 11 bře 2017, 18:57
frpr666 píše: potom zjednoduš program a nasdílej.
Jinak neumím dát komentář k programu, který není celý a nejde zkompilovat...
Kód: Vybrat vše
int recdata[9]; int bytes = 0; //setup------------------------------------------------- void setup() { Serial.begin(9600); Serial.setTimeout(1000); } //end-setup----------------------------------------------- //repeat-------------------------------------------------- void loop() { while(Serial.available()) { if (bytes < 9) { recdata[bytes]= Serial.read(); bytes++; } else if (bytes < 9) { bytes = 0; } Serial.println(recdata[0]); } } //end-repeat---------------------------------------------
ps. pardon zapomněl jsem upravit serial port a mazání int bytes
ještě jsem zapomněl dodat že posílám 9 čísel 0-255
Naposledy upravil(a) paycz dne 11 bře 2017, 19:27, celkem upraveno 2 x.
Cowley
Příspěvky: 3580 Registrován: 04 úno 2005, 00:00
#8
Příspěvek
od Cowley » 11 bře 2017, 18:59
Co je to za desku, ze mas SoftwareSerial na pinech 0,1 kde byva vnitrni UART?
A jeste pevne nastavene Input/Output u rx/tx jsem taky jeste nevidel...
A co nejake opakovani pri preteceni bytes nad 10?
A jeste pametova mista musi byt [10] jinak to pri bytes rovno 9 skonci mimo...
paycz
Příspěvky: 283 Registrován: 13 říj 2014, 00:00
#9
Příspěvek
od paycz » 11 bře 2017, 19:33
test z virtuálního com port monitoru
Nemáte oprávnění prohlížet přiložené soubory.
Cowley
Příspěvky: 3580 Registrován: 04 úno 2005, 00:00
#10
Příspěvek
od Cowley » 11 bře 2017, 19:49
Zahada, prvni tri jsou odpredu, poslednich sest vzdy od zadu...
paycz
Příspěvky: 283 Registrován: 13 říj 2014, 00:00
#11
Příspěvek
od paycz » 11 bře 2017, 20:08
záhada vyřešena předchozí program posílal za sebou bez mezer což znamená že např. ze stringů 255 255 0 3 udělal byte[0] 25525503
přikládám dále funkční vypisování stringů do Array Byte a oděsílaní do arduina (třeba se bude někomu hodit)
Kód: Vybrat vše
byte a1 = Convert.ToByte(trackBar1.Value.ToString()); byte a2 = Convert.ToByte(trackBar2.Value.ToString()); byte a3 = Convert.ToByte(trackBar3.Value.ToString()); byte a4 = Convert.ToByte(trackBar6.Value.ToString()); byte a5 = Convert.ToByte(trackBar4.Value.ToString()); byte a6 = Convert.ToByte(trackBar5.Value.ToString()); byte a7 = Convert.ToByte(trackBar9.Value.ToString()); byte a8 = Convert.ToByte(trackBar8.Value.ToString()); byte a9 = Convert.ToByte(trackBar7.Value.ToString()); byte[] buf = new byte[9] {a1,a2,a3,a4,a5,a6,a7,a8,a9}; arduino.Write(buf,0, buf.Length);
frpr666
Příspěvky: 1051 Registrován: 28 pro 2009, 00:00
#12
Příspěvek
od frpr666 » 11 bře 2017, 20:22
Cite:
Kód: Vybrat vše
if (bytes < 9) { recdata[bytes]= Serial.read(); bytes++; } else if (bytes < 9) { bytes = 0; }
1. máš 2x za sebou test na stejnou podmínku, část za else se tedy nikdy neprovede.
2. nikde není zaručeno, že v recdata[0] bude první odvysílaný znak, protože není mezi "vysílačem" a "příjmačem" žádná synchronizace.
T.j. první "odvysílaný znak" může být na jinačí pozici např. recdata[5] atd.
Nějaký úvod k sér. vysílání a přijmu je zde:
https://www.safaribooksonline.com/library/view/arduino-cookbook-2nd/9781449321185/ch04.html
paycz
Příspěvky: 283 Registrován: 13 říj 2014, 00:00
#13
Příspěvek
od paycz » 11 bře 2017, 20:46
frpr666 1) jo v kódu jsou nějaké chyby protože jsem ho několikrát přepisoval
tady máš už dokončený kód
Kód: Vybrat vše
int recdata[9]; int bytes = 0; //setup------------------------------------------------- void setup() { Serial.begin(9600); Serial.setTimeout(1000); } //end-setup----------------------------------------------- //repeat-------------------------------------------------- void loop() { while(Serial.available()) { if (bytes < 9) { recdata[bytes]= Serial.read(); bytes++; } else if (bytes >= 9) { bytes = 0; memset(recdata, 0, sizeof(recdata)); } analogWrite(9,recdata[0]); } } //end-repeat---------------------------------------------
2)nevím kde jsi vzal svojí ideologii že int recdata[0] nebude první číslo když je tam int bytes = 0;
Cowley
Příspěvky: 3580 Registrován: 04 úno 2005, 00:00
#14
Příspěvek
od Cowley » 11 bře 2017, 20:49
Zahada byla spis v tom, ze mas TrackBar v programu razene 1,2,3,6,4,5,9,8,7
Naposledy upravil(a) Cowley dne 11 bře 2017, 20:53, celkem upraveno 1 x.
Cowley
Příspěvky: 3580 Registrován: 04 úno 2005, 00:00
#15
Příspěvek
od Cowley » 11 bře 2017, 20:51
Treba pokud se data ztrati ci jinak preslechnou, tak ztratis synchronizaci.