Ho un dispositivo Arduino e un PC. Ho provato il seguente codice sulla scheda:La comunicazione seriale con Arduino non riesce solo sul primo messaggio dopo il riavvio
gpsdata data;
char needtosend;
void setup() {
Serial.begin(9600);
Serial.flush();
data.id = 0;
data.src= 500;
data.lat= 1;
data.lon= 2;
data.alt= 3;
strcpy(data.date, "test date format");
}
void loop() {
if(Serial.available() > 0)
{
needtosend = Serial.read();
if (needtosend == '2')
{
data.id = ++data.id % 10;
}
byte* buff = (byte*)&data;
Serial.write(buff, sizeof(data));
}
delay (200);
}
L'applicazione per PC è scritto in C++ e utilizza la libreria spinta per comunicare con il dispositivo di Arduino. Questo è il codice PC:
Serial serial("/dev/ttyUSB0",9600);
gpsdata *data;
char *values = new char[sizeof(gpsdata)];
while(true)
{
try {
serial.writeString("2",1);
serial.read(values,sizeof(gpsdata));
data = (gpsdata *)values;
cout<<data->id<<endl;
}
catch(boost::system::system_error& e)
{
cout<<"Error: "<<e.what()<<endl;
}
catch(timeout_exception& e)
{
cout<<"Error: "<<e.what()<<endl;
}
}
delete[] values;
Serial::Serial(std::string port, unsigned int baud_rate): io(), serial(io,port)
{
serial.set_option(boost::asio::serial_port_base::baud_rate(baud_rate));
}
void Serial::read(char *data, size_t size)
{
boost::asio::read(serial,boost::asio::buffer(data,size));
}
void Serial::writeString(const char* s, int length)
{
boost::asio::write(serial,boost::asio::buffer(s,length))<<std::endl;
}
Quando accendo il dispositivo e quindi avviare l'applicazione per PC per la prima volta, si invia la stringa "2" al dispositivo allora il read() blocchi e mai riceve i dati da l'Arduino. Se uccido l'applicazione e la avvio nuovamente senza riavviare Arduino, tutto inizia a funzionare correttamente. Ho provato con la lettura asincrona e il risultato è stato lo stesso, i timeout di lettura sul primo messaggio e quindi tutto inizia a funzionare correttamente. Il secondo messaggio che viene ricevuto nell'applicazione PC è con id 1 che significa che Arduino non ha ricevuto il primo messaggio. Qualche idea di dove è il mio errore?
Il codice in loop() non ha senso. Dopo aver chiamato read(), available() sta per essere 0. Fino a quando il PC invia un altro byte. –
Siamo spiacenti. Copia errore incolla. Il codice effettivo è di chiamare letto dopo disponibile. Ho aggiornato il post precedente. Quindi qualche idea del perché questo non funziona? –
Hmm, codice che ** esattamente ** spiega che il problema è raramente un errore di copia/incolla. –