java串口监听超时_串口通信之超时

超时分串口读超时和串口写超时,主要是读超时,即ReadTimeout与Read方法之间的超时。下面谈谈他们之间的意义和实现。

Read方法是阻塞的,它一直在读串口接收缓冲区中的数据,如果接收缓冲区有数据,Read方法则返回一个或多个字节数据;如果Read方法在等待ReadTimeout毫秒时间内,串口接收区一直没有任何数据,则Read方法将甩ExceptionTimeout异常。注意,Read(outBuf, offset, count)阻塞读取的不是非等到count个字节数据,而是当前接收缓冲区大于等于1小于等于count个字节数据,即只要有数据Read方法就立刻返回。

由于Read方法的阻塞性,所以我们必须防止(如串口物理断开) Read永远不返回,而导致程序卡死。方法有:

1. 设置ReadTimeout属性为合理值,其默认值为-1,即Read永不可能因为ReadTimeout而超时返回。

2. 先判断serialPort.BytesToRead大于0,再调用Read方法,则Read肯定会返回。

代码段一:

int nStartTime = Environment.TickCount;

while(true)

{

int nNowTime = Environment.TickCount;

if(nNowTime – nStartTime > 360)   //等待360ms

{

Console.WriteLine(“等待360ms后超时”);

break;

}

if(serialPort.BytesToRead > 35)      //用户业务数据包长度

{

int nLen = serialPort.Read(outBuf, 0, 35);

DealData(outBuf, nLen);     //验证合法包,然后处理业务

break;

}

//时间消耗在循环过程中,可在这加一行 Thread.Sleep(20);

}

代码段二:

serialPort.ReadTimeout = 1000;     //等待1000ms  初始化

//接收处理函数

try

{

int nLen = serialPort.Read(outBuf, 0, serialPort. BytesToRead);  //如果接收区一直没数据,时间消耗在这,等1000ms后甩TimeoutException异常

if(nLen > 0)

{

DealData(outBuf, nLen);     //进全局数据队列,然后分析队列里的合法数据包

}

}

catch (TimeoutException ex)

{

Console.WriteLine("通信超时");

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值