Grazie per la risposta!
il codice parte c++(che riguarda la trasmissione seriale):
void Serialout(int v)
{
int fd; // File descriptor for the port
fd = open(PORT, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1)
{
perror("open_port: Unable to open /dev/ttyUSB0 - ");
}
else
{
std::ostringstream oss;
int a,b,c;
v=111; // Per semplicità inviamo 111 che codificato tramite la funzione assegna corrisponde a "AAA"
// inizio assegnazione numeri a lettere //
if (v<=50 && v>=0)
v=50;
else if (v>255)
v=255;
else if (v<-255)
v=255;
a= v/100;
if (a!=0)
b=(v%100);
b= b/10;
if (b!=0)
c =(v%10);
// fine assegnazione numeri lettere ////
// Tre casi d'invio la struttura rimane sempre la stessa //
if(a==0 && b==0)
{
printf( " %c Q\n",assegna(v));
oss <<"S"<< assegna(v)<< "Q";
fcntl(fd, F_SETFL, 0);
int n = write(fd,oss.str().c_str(),3); // funzione d'invio
if (n < 0)
fputs("write() of 9 bytes failed!\n", stderr);
}
if(a==0 && b!=0)
{
printf( " %c %c Q\n",assegna(b),assegna(c));
oss <<"S"<<assegna(b) <<assegna(c)<< "Q";
fcntl(fd, F_SETFL, 0);
int n = write(fd,oss.str().c_str(),4); // funzione d'invio
if (n < 0)
fputs("write() of 9 bytes failed!\n", stderr);
}
if(a!=0 && b!=0)
{
printf( " %c %c %c Q\n", assegna(a),assegna(b),assegna(c));
oss <<"S"<< assegna(a)<<assegna(b) <<assegna(c)<< "Q";
fcntl(fd, F_SETFL, 0);
int n = write(fd,oss.str().c_str(),5);
if (n < 0)
fputs("write() of 9 bytes failed!\n", stderr);
}
// sleep(0.010);
}
struct termios options; // Get the current options for the port...
tcgetattr(fd, &options); // Set the baud rates to 19200...
cfsetispeed(&options, BAUDRATE);
cfsetospeed(&options, BAUDRATE); // Enable the receiver and set local mode...
options.c_cflag |= (CLOCAL | CREAD); // Set the new options for the port...
tcsetattr(fd, TCSANOW, &options);
close(fd);
}
Questo codice invia una serie di lettere precedute dal carattere S e terminati dal carattere Q se invio Serialout(111) lui invia SAAAQ
Il codice parte arduino:
//DEFINIZIONE PIN ARDUINO
[...]
// VARIABILI LETTURA SERIALE
char s[25]={"Z0Z0q\0"};
char ct;
int i=0,j,k,z=0,v;
int inizio,segno;
[...]
//VARIIABILI PER INTERVALLI DI TEMPO
long previousMillis = 0, previousMillis6=50;
#define interval 50 //INTERVALLO CALCOLO VELOCITA'
#define interval6 45 //INTERVALLO LETTURA STRINGA prima 50
[...]
//SETUP INZIALE PORTE ARDUINO
void setup() {
// Definizioni porte e BaudRate
Serial.begin(19200);
}
int converti(char z) // converte lettere in numeri
{
int x;
if (z=='A')
x=1;
if (z=='B')
x=2;
if (z=='C')
x=3;
if (z=='D')
x=4;
if (z=='E')
x=5;
if (z=='F')
x=6;
if (z=='G')
x=7;
if (z=='H')
x=8;
if (z=='I')
x=9;
if (z=='J')
x=0;
return x;
}
// CICLO LOOP
void loop()
{
//LETTURA STRINGA
if (millis() - previousMillis6 > interval6) // interval 6 è settato a 50 ms anche previousmillis6 a 50 ms
{
previousMillis6 = millis();
if (Serial.available() > 0)
{
// salva quel che è arrivato nella variabile char s
ct=char(Serial.read());
if (((ct-'0'>=0) && (ct-'0')<=9) || (ct-'A'>=0) && (s[j]-'A')<=26)
{
s[i] = ct;
i++;
}
for (z=0;z<=i;z++)
Serial.print(s[z]);
Serial.print("\n");
if (s[i-1]=='Q') // se la stringa ricevuta è terminata da Q
{
if (s[0]=='S') //se la strinfa è preceduta da S
{
velrichiesta1=0;
velrichiesta2=0;
for (v=1;(s[v]-'A'>=0) && (s[v]-'A')<=11 ;v++)
{
// Questa è la porzione di codice che si occupa della decodifica//////
velrichiesta1=velrichiesta1*10 + (converti(s[v]));
}
velrichiesta2=velrichiesta1;
velrichiesta1=-velrichiesta1;
//Serial.print(velrichiesta1);
}
i=0;
}// Q
}
}