我向设备发送了修改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这个是我接收数据的代码。串口
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这个是我接收数据的代码。串口
解决方案 »
- 获得悬浮窗离屏幕上边界和右边界的距离
- sql表更新问题
- 又出现问题了
- API发送方向键出现问题,请高手来帮忙
- 菜鸟问题 请问C#窗体程序中要实现图片打印功能 应该怎么写 最好能给点原代码
- **************非常弱智的WinSock问题,和QQ有关************在线等!!!!
- 窗体间如何跳转并返回?
- 基于windowsForm的程序,我创建了一个User Control,但没法直接拖放到主窗体上,请教大家!
- 咋办尼,WCF看不懂欸
- .net工程做好后要怎么配置和部署呢?
- 用Granados连接linux返回有乱码
- 怎么写一个windows服务和应用程序,让他们之间可以互相写读数据。
你无法保证在你sleep的时间里,对方能将数据全部发送过来,而且即使对方发送完了,也无法确定这些数据都存入了串口缓存区。用线程的话就循环读取判断,用事件触发倒是可以省却点开销。
result 设为全局string msg = comport.ReadExisting();
msg = msg.replace("\n\r","\r\n");
result += msg;
你无法保证在你sleep的时间里,对方能将数据全部发送过来,而且即使对方发送完了,也无法确定这些数据都存入了串口缓存区。用线程的话就循环读取判断,用事件触发倒是可以省却点开销。
因为我发送的是修改波特率的命令,所以发送过去后设备的波特率就改了,相应的我的串口的连接得用新改的波特率去连接
{
if(compact.BytesToRead>0)
//你的代码
}//线程里循环查询串口
还有就是楼上说的,result要累加起来或者sleep足够长时间,确定对方数据都发送完了,并且都送入串口缓存区,这样可以一下子读取完整。
要不就用事件触发的方式读取串口,省去了循环查询串口
你无法保证在你sleep的时间里,对方能将数据全部发送过来,而且即使对方发送完了,也无法确定这些数据都存入了串口缓存区。用线程的话就循环读取判断,用事件触发倒是可以省却点开销。
因为我发送的是修改波特率的命令,所以发送过去后设备的波特率就改了,相应的我的串口的连接得用新改的波特率去连接波特率改了只要修改波特率就可以啦,comport.Baudrate=newValue,设置了这个值后,硬件上就会以新的波特率接收数据的。
额,丢失的是先发的还是后发的
丢失的就是发送的修改波特率,然后它回复的信息,然后再就是连接串口你是不是发送了修改的波特率后就把串口关闭了?
是发送完了之后,sleep了300毫秒,但是貌似有时候它就接收不完,然后就进行了重新连接的工作,然后数据就丢失了,我怎样确保它在连接前就把数据接收完了再进行新的连接?
while(comport.BytesToRead>0)
{
//接收代码
Thread.Sleep(300);
}
先Sleep300ms,再查看串口是否有数据,300毫秒足够把数据存入缓存区了,如果300毫秒内都没有数据,再进入下一次连接