【关于CSerialPort串口类不能连续发送数据,大家有什么好的解决办法???】

大树学长 2015-03-23 04:32:28
如下:连续发送6次或者几次,都只能接受最前面和最后面的,如果没用延时就只能接收到最后面的疏浚。
我用串口监视工具查看的是直发送了最前面和最后面的数据,中间的数据都没用发送。

CString tempsend;
tempsend="(24106533)";
m_Commport.WriteToPort((char *)(LPCTSTR)tempsend);
Sleep(400);
tempsend="(150632454)";
m_Commport.WriteToPort((char *)(LPCTSTR)tempsend);
Sleep(400);
tempsend="(1062687)";
m_Commport.WriteToPort((char *)(LPCTSTR)tempsend);
Sleep(400);
tempsend="(10677582)";
m_Commport.WriteToPort((char *)(LPCTSTR)tempsend);
Sleep(400);
tempsend="(106457879)";
m_Commport.WriteToPort((char *)(LPCTSTR)tempsend);
Sleep(400);
tempsend="(10677127)";
m_Commport.WriteToPort((char *)(LPCTSTR)tempsend);
...全文
349 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
大树学长 2015-03-24
  • 打赏
  • 举报
回复
引用 13 楼 xianglitian 的回复:
你多用一些例如tempsend1,tempsend2... 这样的缓存分别存储数据用来发送试一下
3Q了,看楼下我已解决。
大树学长 2015-03-24
  • 打赏
  • 举报
回复
问题我自己解决了,因为这个类的数据发送是单线程的,如果发送多次就会把前面的冲掉,加延时只是延长时间但还是一样的效果。 我解决的办法就是用定时器,比如我发送12次,就做个循环调用,每次只发送一个数据,然后就调用一次定时器,定时器再调用发送函数,中间循环的变量用类变量就行,每次发送就累加一次, void CMyView::OnButton4() { //前面这个声明可用放到构造函数中,看着更规范。 CStgring m_mute1 = "11"; CString tempsend[12] = {"("+m_mute1+"$00000)","("+m_mute1+"$01000)","("+m_mute1+"$02000)","("+m_mute1+"$03000)","("+m_mute1+"$04000)","("+m_mute1+"$05000)","("+m_mute1+"$00000000)","("+m_mute1+"$01000000)","("+m_mute1+"$02000000)","("+m_mute1+"$03000000)","("+m_mute1+"$04000000)","("+m_mute1+"$05000000)"}; m_Commport.WriteToPort((char *)(LPCTSTR)tempsend[time1]);//time1可用设为全局变量也可设为类变量 SetTimer(1,100,NULL); } void CMyView::OnTimer(UINT nIDEvent) { switch(nIDEvent) { case 1: KillTimer(1); if(time1 < 11) { time1++; OnButton4(); } else if(time1 == 11) { time1 = 0; break; } break; }
向立天 2015-03-24
  • 打赏
  • 举报
回复
你多用一些例如tempsend1,tempsend2... 这样的缓存分别存储数据用来发送试一下
大树学长 2015-03-24
  • 打赏
  • 举报
回复
引用 9 楼 zgl7903 的回复:
CSerialPort 有很多版本 LZ说的这个估计是 WriteToPort 里有清空缓冲区的 PurgeComm 操作, 把WriteToPort 贴出来看看
是的,我这个版本好老了,连关闭串口的功能都没用。 WriteToPort 函数 void CSerialPort::WriteToPort(char* string) { assert(m_hComm != 0); memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer)); strcpy(m_szWriteBuffer, string); // set event for write SetEvent(m_hWriteEvent); }
大树学长 2015-03-24
  • 打赏
  • 举报
回复
引用 8 楼 DennisCPP 的回复:
建议使用PComm,上网下载一下,导入PComm.h和PComm.lib,直接调用打开串口和发送函数,简单又好用
一直用的CSerialPort 习惯了,PComm找到了
大树学长 2015-03-24
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
[quote=引用 5 楼 bigtree_mfc 的回复:] [quote=引用 2 楼 worldy 的回复:] sleep了400,发送之间不会有什么问题,即使下位机有反应,并且使用了485,都不会有什么问题; 但你的这个转换 (char *)(LPCTSTR)tempsend应该有问题,如果是unicode转完之后,不就只发送一个字符?
没有啊,我用串口监视查看的都是一个个数字显示的[/quote] 串口监视什么?[/quote] 监视的COM口,上位机给下位机发送数据,如果地址正确下位机就会返回同样的数据。我监视的是这几个数据从上位机到下位机是有的发送了有的没用发送。
zgl7903 2015-03-24
  • 打赏
  • 举报
回复
CSerialPort 有很多版本 LZ说的这个估计是 WriteToPort 里有清空缓冲区的 PurgeComm 操作, 把WriteToPort 贴出来看看
DennisCPP 2015-03-23
  • 打赏
  • 举报
回复
建议使用PComm,上网下载一下,导入PComm.h和PComm.lib,直接调用打开串口和发送函数,简单又好用
worldy 2015-03-23
  • 打赏
  • 举报
回复
引用 5 楼 bigtree_mfc 的回复:
[quote=引用 2 楼 worldy 的回复:] sleep了400,发送之间不会有什么问题,即使下位机有反应,并且使用了485,都不会有什么问题; 但你的这个转换 (char *)(LPCTSTR)tempsend应该有问题,如果是unicode转完之后,不就只发送一个字符?
没有啊,我用串口监视查看的都是一个个数字显示的[/quote] 串口监视什么?
大树学长 2015-03-23
  • 打赏
  • 举报
回复
引用 3 楼 fanlvlgh 的回复:
跟下位机也有关系吧,不加sleep是不行的
不加延时,前面的就都覆盖了,值会传输最后一个的数据,加了延时也只传输了最前面和最后面的数据
大树学长 2015-03-23
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
sleep了400,发送之间不会有什么问题,即使下位机有反应,并且使用了485,都不会有什么问题; 但你的这个转换 (char *)(LPCTSTR)tempsend应该有问题,如果是unicode转完之后,不就只发送一个字符?
没有啊,我用串口监视查看的都是一个个数字显示的
大树学长 2015-03-23
  • 打赏
  • 举报
回复
引用 1 楼 niezhiyuan 的回复:
不懂帮你顶下? 是不是发送有最大时间?
没有,不过我要一次发12条数据,太久也不行
fanlvlgh 2015-03-23
  • 打赏
  • 举报
回复
跟下位机也有关系吧,不加sleep是不行的
worldy 2015-03-23
  • 打赏
  • 举报
回复
sleep了400,发送之间不会有什么问题,即使下位机有反应,并且使用了485,都不会有什么问题; 但你的这个转换 (char *)(LPCTSTR)tempsend应该有问题,如果是unicode转完之后,不就只发送一个字符?
为争 2015-03-23
  • 打赏
  • 举报
回复
不懂帮你顶下? 是不是发送有最大时间?

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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