串口收发数据 for循环中 或者Ontimer中发出指令,接收不到反馈信号。

LuckySmall6 2019-05-10 02:51:17
用MFC做编程,有关数据的收发,用的串口类。
PC与温度采集ADAM4015模块数据交互。
我PC 发送指令读取温度,ADAM反馈回温度值,PC读取结果。
单独发送指令:
SerialPort.WriteToPort((LPCTSTR)("#030\r")); //发送读数指令
接收:
LONG CSetExDlg::OnComm(WPARAM ch,LPARAM port)
{
dateLength++;
CString str(_T(""));
str.Format("%c",ch);
if (dateLength > 8 )
{
if(dateLength > 9){
dateLength = 1;
m_strRxMsg.Empty();
}
}
m_strRxMsg += str; //将接收到的字符存入编辑框对应的变量中
UpdateData(FALSE); //将接收到的字符显示在接受编辑框中

可以实现。
但是比如 用多次发送
for(i=0;i<10;i++)
{
SerialPort.WriteToPort((LPCTSTR)("#030\r")); //发送读数指令
}
这时候就不能收到十次的反馈值,只有一次的反馈值可以接收到。
另外
在使用OnTimer函数时候,在Ontimer中:
void CProofDlg::OnTimer(UINT nIDEvent) //
{
if (1 == nIDEvent)
{
SerialPort.WriteToPort((LPCTSTR)("#030\r")); //发送读数指令
}
}

接收:
LONG CSetExDlg::OnComm(WPARAM ch,LPARAM port)
{
......
}
不能够接收到反馈的值。

采用Ontimer的意思是改成自动化,IO信号交互中,触发即可采集温度。
最上面直接发SerialPort.WriteToPort((LPCTSTR)("#030\r")); //可以理解为手动采集。
...全文
196 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
走好每一步 2019-05-10
  • 打赏
  • 举报
回复
SerialPort 老版本是不支持多次发送的,你最好下最新版本的。 https://blog.csdn.net/itas109/article/details/51337538 老版本的串口类你这样发是不行的 OnBtnClick { writeToPort(); 1秒后 writeToPort(); 1秒后 writeToPort(); }
OrdinaryCoder 2019-05-10
  • 打赏
  • 举报
回复
那你加一个按钮发送 多点几次 看每次是不是都有反馈
LuckySmall6 2019-05-10
  • 打赏
  • 举报
回复
引用 9 楼 OrdinaryCoder 的回复:
SerialPort这个类是系统类还是你自己封装过的 如果是自己封装的可能就需要看一下这里的代码了
这个是网上找的一个串口类。SerialPort.cpp SerialPort.h 应该问题不大。我在想是不是 这个Oncomm与ONtimer或者for的运行机制冲突呀。。。就是这个优先级高 , OnComm根本插不上话那种意思。。。
OrdinaryCoder 2019-05-10
  • 打赏
  • 举报
回复
SerialPort这个类是系统类还是你自己封装过的 如果是自己封装的可能就需要看一下这里的代码了
LuckySmall6 2019-05-10
  • 打赏
  • 举报
回复
引用 6 楼 OrdinaryCoder 的回复:
串口发送和接收是一个异步的过程 不是你发了就马上可以收到 可以在for循环发送之后加一个Sleep试一下 看看是不是因为发送太快导致的
哦哦 好的 我用串口调试的测试一下。 设备没在身边。 先模拟试试。 for循环里里面有很多控制轴运动代码 两次发送之间 间隔很长。 问题是 接收oncomm整个流程根本没触发断点 ,仅仅最后一次send之后才触发。 我不用for单独 就send一次,立刻就触发断点。
LuckySmall6 2019-05-10
  • 打赏
  • 举报
回复
引用 2 楼 puthon 的回复:
不知道你的模块的工作频率是多少,所以看能不能定时器延时加大一点测试一下呢
哦哦SetTimer(1,10,NULL) 挺短的 但是 Ontimer里面有运动轴的指令 就是这个轴运行完事得好几十秒呢 然后才发送温度串口指令。 有百度到一种说法 采用多线程试试,然而不太会多线程。
OrdinaryCoder 2019-05-10
  • 打赏
  • 举报
回复
串口发送和接收是一个异步的过程 不是你发了就马上可以收到 可以在for循环发送之后加一个Sleep试一下 看看是不是因为发送太快导致的
LuckySmall6 2019-05-10
  • 打赏
  • 举报
回复
引用 3 楼 puthon 的回复:
调串口建议你用一下虚拟串口软件,这样结合串口调试助手来模拟你的下位机,方便调试呀
嗯嗯 好的 我试试 我用串口监视精灵 看串口收发的字节数据 发现问题 但是还没解决。。是不是OnComm接收数据 有什么优先级之类说法呢 就是必须得For()循环发送完了 或者者Ontimer中的函数执行完了 它才能收数据呢? 对于这个接受字符数据的机制 不太了解。
LuckySmall6 2019-05-10
  • 打赏
  • 举报
回复
引用 1 楼 OrdinaryCoder 的回复:
1.串口发送间隔不能太短把 每次发送加个延时试一下 2.下个断点看一下Timer中的SerialPort.WriteToPort((LPCTSTR)("#030\r")); //发送读数指令 函数被没被调用 }
断点调试 时候,发送SerialPort.WriteToPort((LPCTSTR)("#030\r")); 是可以执行的。 单独发一次 不用for循环发 也是可以触发OnComm的接收的。 但是for() 里面的 每一次发送都可以 就只有最后一次触发 接收。 问题 类似于 https://bbs.csdn.net/topics/330173049?list=lz这个帖子中的问题。
puthon 2019-05-10
  • 打赏
  • 举报
回复
调串口建议你用一下虚拟串口软件,这样结合串口调试助手来模拟你的下位机,方便调试呀
puthon 2019-05-10
  • 打赏
  • 举报
回复
不知道你的模块的工作频率是多少,所以看能不能定时器延时加大一点测试一下呢
OrdinaryCoder 2019-05-10
  • 打赏
  • 举报
回复
1.串口发送间隔不能太短把 每次发送加个延时试一下
2.下个断点看一下Timer中的SerialPort.WriteToPort((LPCTSTR)("#030\r")); //发送读数指令 函数被没被调用
}

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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