串口通讯问题

dl_zzc 2018-01-22 01:59:58
DCB PortDCB;
PortDCB.DCBlength = sizeof (DCB);

if(hPort)
{
return FALSE;
}

//打开串口
hPort = CreateFile (_T("COM2:"), GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING,0, NULL);

//如果打开端口出错, 返回FALSE

if ( hPort == INVALID_HANDLE_VALUE )
{
//不能打开端口
MessageBox(TEXT("直流打不开,请重启!!! "),TEXT("提示!"),MB_ICONASTERISK);
return FALSE;
}

//指定端口监测的事件集

SetCommMask (hPort, EV_RXCHAR);
//分配设备缓冲区
SetupComm(hPort,1024,1024);
//初始化缓冲区中的信息
PurgeComm(hPort,PURGE_TXCLEAR|PURGE_RXCLEAR);
//配置串行端口
//得到端口的默认设置信息
GetCommState (hPort, &PortDCB);
//改变DCB结构设置
PortDCB.fBinary = TRUE; //Win32不支持非二进制串行传输模式,必须为TRUE
PortDCB.fParity = TRUE; //启用奇偶校验
///////
PortDCB.fDtrControl = DTR_CONTROL_DISABLE; //启用DTR线DTR_CONTROL_ENABLE
PortDCB.fOutX=PortDCB.fInX=PortDCB.fTXContinueOnXoff=0;
PortDCB.fRtsControl = RTS_CONTROL_DISABLE; //启用RTS线 RTS_CONTROL_ENABLE RTS_CONTROL_DISABLE
PortDCB.BaudRate = 9600; //波特率 m_Btl
PortDCB.ByteSize = 8; //每字节的位数m_Sjw
PortDCB.Parity = NOPARITY; //奇偶校验m_Jybz SPACEPARITY;//EVENPARITY;//ODDPARITY;//NOPARITY
PortDCB.StopBits = ONESTOPBIT; //ONESTOPBIT每字节一位停止位m_Tzw

//根据DCB结构配置端口

SetCommState (hPort, &PortDCB);
以上是串口初始化,假如只是设置波特率、校验、数据位、停止位时,其余不设置用默认值,是否可行?

我的串口通讯,24小时不间断运行,有时过几天或者几十天甚至上百天就死机,一直没有找到原因。
还望得到高手指点!
...全文
546 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dl_zzc 2018-01-23
  • 打赏
  • 举报
回复
if (!mfAddSum(strProtocol, 0, 0)) { TRACE(_T("发送命令前的校验出错!\n")); return -1; } /// 清空串口输入缓冲区 PurgeComm(hPort, PURGE_RXCLEAR|PURGE_TXCLEAR); /// 发送命令 CDevServer::SvrWriteComm(hPort, strProtocol); Sleep(5); strProtocol = _T(""); int nReadLen = CDevServer::SvrReadComm(hPort, 1, strProtocol, 500, 1, dwReadLen); if (nReadLen <= 0) { TRACE(_T("没有收到应答数据!\n")); return -2; } if (!mfAddSum(strProtocol, 1, 0)) { TRACE(_T("收到的应答数据校验不对!\n")); return -3; }
dl_zzc 2018-01-23
  • 打赏
  • 举报
回复
这个问题是比较奇葩,因为这个程序我是从2011年开始用的,一直没有问题,只是现在换了新的硬件升级产品,就有这个死机现象了,所以说,内存泄露不会有,至于误码,ModBus协议是有校验的啊?误码的话校验不对会自动放弃的。 真不知道咋回事。
of123 2018-01-23
  • 打赏
  • 举报
回复
可能是内存溢出所致。在网上搜一下“内存泄漏”,对照一下你的程序中有哪些不断生成而没有释放的对象。 有些系统接口的 API 函数也需要特殊处理来释放内存。
tianxj001 2018-01-22
  • 打赏
  • 举报
回复
毛病必须是在数据处理容错上面,而肯定不是在串口定义上面,只有这样,才能解析出问题时间並不固定。 仔细分析一下数据接受处理部分代码吧。增加各种数据容错丢弃、重发等机制包括数据不完整、应答、数据包发送等的超时处理,串口数据本来误码率就比较高,波特率误差越界的话,就更容易出各种莫名其妙的问题,总而言之,反正增强程序的鲁棒性才是解决问题的方法。
91program 2018-01-22
  • 打赏
  • 举报
回复
长时间运行后死机,显然不是串口设置的原因。 LZ 需要从程序的其它方面来分析,可能能找到问题的原因。如:内存泄露、指针越界等。 也有一能可能,是接收到的数据异常,引起数据解析部分代码出现异常,而引起列机的现象。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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