Hri*_*zov 5 c++ boost serial-port arduino
我有一个Arduino设备和PC.我在板上尝试了以下代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
PC应用程序是用C++编写的,并使用boost库与Arduino设备进行通信.这是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;
}
Run Code Online (Sandbox Code Playgroud)
当我打开设备然后第一次启动PC应用程序时,它会向设备发送字符串"2",然后read()阻塞并且永远不会从Arduino接收数据.如果我杀死应用程序并重新启动它而不重新启动Arduino一切都开始正常工作.我尝试使用异步读取,结果是相同的,第一条消息的读取超时,然后一切开始正常工作.在PC应用程序中接收的第二条消息是id为1,这意味着Arduino没有收到第一条消息.知道我的错误在哪里?
正如汉斯在评论中提到的,你的通信协议已关闭。
你的 Arduino 循环基本上是这样说的:
读取一个值。如果还有其他可用值,请做某事。等待 0.2 秒。然后重复。
你的电脑循环说:
发送“2”。然后读取值数组。然后重复。
您所发生的情况是,您的通信的 Arduino 端正在等待比发送的值更多的值。在 Arduino 上,轮询Serial.avaliable,然后进行读取。
在 PC 上,您可能不需要更改它。
当您断开连接并重新连接时,会发送一个额外的位来初始化波特率连接,这会欺骗您的协议工作。
编辑:请务必检查串行库正在连接的设置。以下是我在使用 Qt QextSerialPort 库之前用于连接 Arduino 板的设置。
port->setFlowControl(FLOW_OFF);
port->setParity(PAR_NONE);
port->setDataBits(DATA_8);
port->setStopBits(STOP_1);
port->setTimeout(500);
Run Code Online (Sandbox Code Playgroud)
这里有两个可能有用的链接:
http://www.webalice.it/fede.tft/serial_port/serial_port.html
https://www.google.com/search?q=arduino+and+boost%3A%3Aasio