Visual c++ 不完全读取数据串行端口

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

我想用“握手”方法将6个数据传感器从arduino读取到VC++中,我将“1”发送到arduino,然后该设备将数据发送到PC。 我的数据格式是:
&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计时器来检查这种情况