Visual c++ 不完全读取数据串行端口
我想用“握手”方法将6个数据传感器从arduino读取到VC++中,我将“1”发送到arduino,然后该设备将数据发送到PC。 我的数据格式是:Visual c++ 不完全读取数据串行端口,visual-c++,serial-port,Visual C++,Serial Port,我想用“握手”方法将6个数据传感器从arduino读取到VC++中,我将“1”发送到arduino,然后该设备将数据发送到PC。 我的数据格式是: &data0、data1、data2、data3、data4、data5% 但是当我用VC++阅读它时,数据总是不完整的,甚至认为缓冲区的大小足以容纳所有的数据 这是我的vC++程序的快照,我把它放在定时器事件上 DWORD nbytes; char buffer[24]; //Read Sensors if(!W
&data0、data1、data2、data3、data4、data5%
但是当我用VC++阅读它时,数据总是不完整的,甚至认为缓冲区的大小足以容纳所有的数据
这是我的vC++程序的快照,我把它放在定时器事件上
DWORD nbytes;
char buffer[24];
//Read Sensors
if(!WriteFile( hnd_serial, "1", 1, &nbytes, NULL )){KillTimer(cTimer1);MessageBox(L"Write Com Port fail!");return;}
Sleep(5);
if(!ReadFile( hnd_serial, buffer, 23, &nbytes, NULL )){KillTimer(cTimer1);MessageBox(L"Read Com Port fail!");return;}
Sleep(50);
我改变了波特率,但结果还是一样。
但如果我减少一个数据,比如data5(变成5个传感器),数据就完整了。
我的程序有问题吗?您可以将ReadFile()函数放入do while循环中
do{
if(!ReadFile( hnd_serial, buffer, 23, &nbytes, NULL )){
//Process error
break;
}
if (nbytes>= 6)
{
//Put your flag - or process here
break;
}
}while(nbytes);
ReadFile()只返回当前缓冲区状态,它不会等待接收全部预期数据,因为您不知道使用的波特率是多少 您也不会说设置了什么接收超时(如果有) 假设是9600,这意味着端口每秒传输960字节。所以每字节超过1毫秒 如果您的睡眠(5)应该等待“1”被发送,等待数据返回,那么您应该等待足够长的时间,以便传输所有字节。假设设置了超时,以便ReadFile立即返回RX缓冲区中的任何字节,则有可能读取速度过快
尝试更大的延迟。您是否检查了arduino是否接收到“1”?是的,arduino正在接收1,并发送数据,但数据不完整(最后3个数据)每个数据有多少字节?(data0,data1,…)数据在0-255之间。谢谢,但是缓冲区的读取永远不会到达数据的末尾(%)。可能是因为串行端口的“缓冲区”有限。您可以尝试在调用ReadFile之前放置一个延迟1s计时器来检查这种情况