【关于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);
...全文
351 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
  • 打赏
  • 举报
回复
不懂帮你顶下? 是不是发送有最大时间?
资源下载链接为: https://pan.quark.cn/s/5c50e6120579 在本文中,我们将详细探讨如何利用 Visual Studio 2010 和 MFC(Microsoft Foundation Classes)框架开发一款串口助手程序。该程序的核心功能包括自动检测串口和循环发送指令,这使其在串行通信调试与测试中极为实用。以下是本文关注的重点内容: MFC库简介:MFC 是微软提供的 C++ 库,用于开发 Windows 应用程序。它封装了 Windows API,简化了窗口、菜单、对话框等组件的创建与管理,为开发者提供了面向对象的编程接口。 串口通信:串口通信是一种通过串行端口进行数据传输的方式,广泛应用于嵌入式系统、工业设备和实验室仪器之间。在 Windows 环境下,可以通过 WinAPI 函数或特定库(如 MFC 的 CSerialPort )实现串口操作。 自动识别串口:在“VS2010+MFC 串口助手”中,自动识别串口功能是指程序能够自动枚举计算机上可用的串行端口,并提供给用户选择。这通常通过调用 SetupDiGetClassDevs 和 CMFCSerialPort::EnumPorts 等函数实现,遍历所有可能的 COM 端口并验证其有效性。 CSerialPort :这是 MFC 库中用于串口操作的,封装了打开、关闭、读写串口以及设置串口参数(如波特率、数据位、停止位和校验位)等常用操作。在本项目中,开发者对 CSerialPort 进行了修改,以满足自动识别串口的需求。 循环发送指令:循环发送指令功能允许用户设置一个命令序列,程序将按照设定的间隔持续发送这些命令。这一功能在测试设备响应或连续数据流场景中非常有用,通常通过定时器(如 Ctimer)和串口发送函数配合实现,确保在指定时间间隔内可靠地发送数据。 源码分析:Ser

15,473

社区成员

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

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