Komunikace VS + Arduino

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
paycz
Příspěvky: 282
Registrován: 13 říj 2014, 02:00

Komunikace VS + Arduino

#1 Příspěvek od paycz »

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]);

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#2 Příspěvek od frpr666 »

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

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#3 Příspěvek od Cowley »

Ten kod asi nebude cely, hlavne ten AnalogWrite pouze s prvni zachycenou a ulozenou hodnotou.

Uživatelský avatar
paycz
Příspěvky: 282
Registrován: 13 říj 2014, 02:00

#4 Příspěvek od paycz »

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

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#5 Příspěvek od Cowley »

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.

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#6 Příspěvek od frpr666 »

potom zjednoduš program a nasdílej.
Jinak neumím dát komentář k programu, který není celý a nejde zkompilovat... :D

Uživatelský avatar
paycz
Příspěvky: 282
Registrován: 13 říj 2014, 02:00

#7 Příspěvek od paycz »

frpr666 píše:potom zjednoduš program a nasdílej.
Jinak neumím dát komentář k programu, který není celý a nejde zkompilovat... :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;
  }
  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.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#8 Příspěvek od Cowley »

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

Uživatelský avatar
paycz
Příspěvky: 282
Registrován: 13 říj 2014, 02:00

#9 Příspěvek od paycz »

test z virtuálního com port monitoru
Přílohy
virtual_monitor.PNG
nahoře odeslaná data, dole přijatá data
(3.16 KiB) Staženo 125 x

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#10 Příspěvek od Cowley »

Zahada, prvni tri jsou odpredu, poslednich sest vzdy od zadu...

Uživatelský avatar
paycz
Příspěvky: 282
Registrován: 13 říj 2014, 02:00

#11 Příspěvek od paycz »

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);

Uživatelský avatar
frpr666
Příspěvky: 1051
Registrován: 28 pro 2009, 01:00

#12 Příspěvek od frpr666 »

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/libra ... /ch04.html

Uživatelský avatar
paycz
Příspěvky: 282
Registrován: 13 říj 2014, 02:00

#13 Příspěvek od paycz »

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;

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#14 Příspěvek od Cowley »

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.

Uživatelský avatar
Cowley
Příspěvky: 3087
Registrován: 04 úno 2005, 01:00

#15 Příspěvek od Cowley »

Treba pokud se data ztrati ci jinak preslechnou, tak ztratis synchronizaci.

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“