我向设备发送了修改baudrate的命令后,然后就用新的baudrate来连接串口,由于接收数据是在线程里面,发完数据后就会去连接,导致接收数据不完整,怎样确保接收的数据是完整的呢?我在发完命令与连接的时候sleep 300,但是有时候还是会有接收数据不完整,这个怎么弄?
string result = string.empty
string msg = comport.ReadExisting();
msg = msg.replace("\n\r","\r\n");
result = msg;
ThreadPool.QueueUserWorkItem(new WaitCallback(handleReceivedResult),result);//handleReceivedResult方法是将接收的数据赋值给label这个是我接收数据的代码。串口

解决方案 »

  1.   

    发完数据后我会sleep一下,然后再进行新的串口的连接,但有时候接收的数据还是不完整
      

  2.   

    发完数据后我会sleep一下,然后再进行新的串口的连接,但有时候接收的数据还是不完整你说的串口连接是指什么?读取串口吗?
    你无法保证在你sleep的时间里,对方能将数据全部发送过来,而且即使对方发送完了,也无法确定这些数据都存入了串口缓存区。用线程的话就循环读取判断,用事件触发倒是可以省却点开销。
      

  3.   


    result 设为全局string msg = comport.ReadExisting();
    msg = msg.replace("\n\r","\r\n");
    result += msg;
      

  4.   

    发完数据后我会sleep一下,然后再进行新的串口的连接,但有时候接收的数据还是不完整你说的串口连接是指什么?读取串口吗?
    你无法保证在你sleep的时间里,对方能将数据全部发送过来,而且即使对方发送完了,也无法确定这些数据都存入了串口缓存区。用线程的话就循环读取判断,用事件触发倒是可以省却点开销。
    因为我发送的是修改波特率的命令,所以发送过去后设备的波特率就改了,相应的我的串口的连接得用新改的波特率去连接
      

  5.   

    while(true)
    {
       if(compact.BytesToRead>0)
        //你的代码
    }//线程里循环查询串口
    还有就是楼上说的,result要累加起来或者sleep足够长时间,确定对方数据都发送完了,并且都送入串口缓存区,这样可以一下子读取完整。
    要不就用事件触发的方式读取串口,省去了循环查询串口
      

  6.   

    用用Datareceive 事件 试试看
      

  7.   

    发完数据后我会sleep一下,然后再进行新的串口的连接,但有时候接收的数据还是不完整你说的串口连接是指什么?读取串口吗?
    你无法保证在你sleep的时间里,对方能将数据全部发送过来,而且即使对方发送完了,也无法确定这些数据都存入了串口缓存区。用线程的话就循环读取判断,用事件触发倒是可以省却点开销。
    因为我发送的是修改波特率的命令,所以发送过去后设备的波特率就改了,相应的我的串口的连接得用新改的波特率去连接波特率改了只要修改波特率就可以啦,comport.Baudrate=newValue,设置了这个值后,硬件上就会以新的波特率接收数据的。
      

  8.   

    就是发了修改波特率的命令后,设备会回复一个字符串过来,就是回复的字符串的接收会有数据的丢失
    额,丢失的是先发的还是后发的
    丢失的就是发送的修改波特率,然后它回复的信息,然后再就是连接串口你是不是发送了修改的波特率后就把串口关闭了?
    是发送完了之后,sleep了300毫秒,但是貌似有时候它就接收不完,然后就进行了重新连接的工作,然后数据就丢失了,我怎样确保它在连接前就把数据接收完了再进行新的连接?
      

  9.   

    试试这样
    while(comport.BytesToRead>0)
    {
      //接收代码
      Thread.Sleep(300);
    }
    先Sleep300ms,再查看串口是否有数据,300毫秒足够把数据存入缓存区了,如果300毫秒内都没有数据,再进入下一次连接