Stránka 1 z 2

Komunikace VS + Arduino

Napsal: 11 bře 2017, 17:02
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]);

Napsal: 11 bře 2017, 17:46
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

Napsal: 11 bře 2017, 17:51
od Cowley
Ten kod asi nebude cely, hlavne ten AnalogWrite pouze s prvni zachycenou a ulozenou hodnotou.

Napsal: 11 bře 2017, 17:53
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

Napsal: 11 bře 2017, 18:01
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.

Napsal: 11 bře 2017, 18:36
od frpr666
potom zjednoduš program a nasdílej.
Jinak neumím dát komentář k programu, který není celý a nejde zkompilovat... :D

Napsal: 11 bře 2017, 18:57
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

Napsal: 11 bře 2017, 18:59
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...

Napsal: 11 bře 2017, 19:33
od paycz
test z virtuálního com port monitoru

Napsal: 11 bře 2017, 19:49
od Cowley
Zahada, prvni tri jsou odpredu, poslednich sest vzdy od zadu...

Napsal: 11 bře 2017, 20:08
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);

Napsal: 11 bře 2017, 20:22
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

Napsal: 11 bře 2017, 20:46
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;

Napsal: 11 bře 2017, 20:49
od Cowley
Zahada byla spis v tom, ze mas TrackBar v programu razene 1,2,3,6,4,5,9,8,7 :)

Napsal: 11 bře 2017, 20:51
od Cowley
Treba pokud se data ztrati ci jinak preslechnou, tak ztratis synchronizaci.