如何检测串口连接正常

hufangzhe 2014-09-24 12:01:25
客户端和服务器为RS232串口通讯,客户端程序用一个5s的timer不停的给服务器发心跳信号,通过检测服务器端一段时间(15s)之后是否收到消息,来判断客户端是否连接断开。
具体步骤为:当服务器接收到一条不为空的消息时,取当前时间,然后循环读取时间直到时间差大于15s,这时候再ReadLine一次,通过判断消息是否为空,来判断客户端是否连接正常。
服务器代码:

while(1)
{
String^ receivedMsg1 = serialPort->ReadLine();
if (receivedMsg1 != "");
{
lLastMsgTime = System::DateTime::Now.Ticks;//取当前时间
while(1)
{
__int64 lNow = System::DateTime::Now.Ticks;
if((lNow - lLastMsgTime)/10000000 > 15){
String^ receivedMsg2 = serialPort->ReadLine();
if(receivedMsg2 == ""){
连接断开;
}
else if (receivedMsg2 != ""){
连接正常;
}
}
}
}
}

这段代码不能检测到连接断开,请帮我看下我的逻辑是不是有问题。小弟不才,还请各位指教如何才能实现检测串口连接是否正常。
...全文
1350 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hufangzhe 2014-09-24
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
串口用DataReceived的回调事件 心跳用timer 然后定义个整形变量 timer每秒给它-1 DataReceived收到消息就重置变成15 如果timer里-1之后,它变成0了,说明没有被重置过,判断为断开
您和2楼的方法类似,的确很合理,我下一步再试试,谢谢!
hufangzhe 2014-09-24
  • 打赏
  • 举报
回复
引用 2 楼 boss_george 的回复:
你可以分开2个部分说。 1.串口通讯,你不一定要现在这样轮询方式,如果是api操作,可以用信号量同步,如果SerialPort可以用DataReceived事件。 2.心跳检测,你可以开定时器,检查心跳状态即可。 两者并行,不要混为一谈,串口通过事件或信号量方式处理,收到心跳就设置标记,定时器到时间检测标记,并重置标记,仅此而已,简单问题别复杂化。
您说的很受用,我下一步试试看。
於黾 2014-09-24
  • 打赏
  • 举报
回复
串口用DataReceived的回调事件 心跳用timer 然后定义个整形变量 timer每秒给它-1 DataReceived收到消息就重置变成15 如果timer里-1之后,它变成0了,说明没有被重置过,判断为断开
hufangzhe 2014-09-24
  • 打赏
  • 举报
回复
引用 1 楼 gxingmin 的回复:
if(serialPort. BytesToRead==0) //断开连接 或 if(serialPort. IsOpen == false) //断开连接
成功了,非常感谢,我结贴了。
boss_george 2014-09-24
  • 打赏
  • 举报
回复
你可以分开2个部分说。 1.串口通讯,你不一定要现在这样轮询方式,如果是api操作,可以用信号量同步,如果SerialPort可以用DataReceived事件。 2.心跳检测,你可以开定时器,检查心跳状态即可。 两者并行,不要混为一谈,串口通过事件或信号量方式处理,收到心跳就设置标记,定时器到时间检测标记,并重置标记,仅此而已,简单问题别复杂化。
gxingmin 2014-09-24
  • 打赏
  • 举报
回复
if(serialPort. BytesToRead==0) //断开连接 或 if(serialPort. IsOpen == false) //断开连接
hufangzhe 2014-09-24
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
串口用DataReceived的回调事件 心跳用timer 然后定义个整形变量 timer每秒给它-1 DataReceived收到消息就重置变成15 如果timer里-1之后,它变成0了,说明没有被重置过,判断为断开
您和2楼的方法类似,的确很合理,我下一步再试试,谢谢!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧