急,关于串口通信收发同步的问题

wang_daiwoo 2015-10-27 03:10:32
由于某种原因,串口发送被写在了一个循环里面,表示需要多次发送,然而希望是发-收-发-收这样的步调同步工作。根据跟踪,发现目前的程序必须在所有循环执行完毕,也就是所有发送动作完成后,才会去执行串口的DATARECIEVE事件,去读缓冲。如何实现这样的同步呢?
发送的代码是这样的:
foreach (int iFN in SelectedFN)
{
//** AFN,FN都有了,其他在界面上填入,开始组建通信帧
textFN.Text = iFN.ToString();
List<byte> frame = new List<byte>(512);
MakeFrame(ref frame, iFN);

//** 然后发送这个帧
string sframe = "";
foreach (byte b in frame)
{
sframe += b.ToString("X2");
sframe += " ";
}
sframe += "\r\n";
SendFrame(frame);
this.BeginInvoke((EventHandler)(delegate
{
richTextBox1.AppendText(sframe);
}));
Thread.Sleep(3000);
}
根据日志文件,发送动作确实是每3秒发送一下。而函数Sendframe(frame)只是简单的调用了串口的write方法。
问题是串口的DATARECIEVED是在这个循环执行完毕后,程序返回,才开始处理的。
想了很久,不知道该怎么实现?用全局变量来同步?也不行,因为调试发现是发送的循环执行完才触发了读串口缓冲的动作
...全文
666 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
兵工厂三剑客 2016-03-14
  • 打赏
  • 举报
回复
按照你的发-收-发-收的思想。你可以开一个线程,一直去接收串口来的字符串。 另一个线程根据你接收到的字符串数据,然后用正则表达式判断接收到的是什么字符串,根据判断结果去执行想做的事情。
feith001 2016-02-19
  • 打赏
  • 举报
回复
一般来说,通信最好放在Thread里执行,包括串口的通信,然后与界面的交互(一般为显示数据什么的),通过事件委托出来给主线程显示。 从你给的代码来看,仅仅是执行了发送的操作,中间还让主线程沉睡了3秒(这是你界面不实时更新的原因),一般数据接收由事件触发,需重新处理的,你展示出来的代码看不出什么
南天空 2015-11-02
  • 打赏
  • 举报
回复
将发送的过程写成一个void方法,用一个线程sendthread专门执行它,将datareceived事件添加到void方法中,用一个线程锁协调收发。具体的你看一下线程锁的简单用法就知道了。
changjiangzhibin 2015-10-29
  • 打赏
  • 举报
回复
试试:每次发送根据业务需要,控制发送数量或长度
true01 2015-10-29
  • 打赏
  • 举报
回复
试试新建一个Thread去执行这个循环
pizza_lyc 2015-10-27
  • 打赏
  • 举报
回复
我也不是很懂,因为用invoke去测试UI的同步更新,并没有效果。但我可以建议 你用一个TIMER,再用一个发送帧的LIST,然后用一个全局的静态BOOL参数去控制是否允许发送,TIMER定时检查发送帧的LIST,一旦发现有,且允许发送标识为真,则发送。这样串口的接收数据事件一旦触发,则首先置允许发送为FALSE,然后处理,处理完成再置允许发送标识为TRUE,这样就可以绕过你的问题。
wang_daiwoo 2015-10-27
  • 打赏
  • 举报
回复
另外,还一个现象就是,发送时虽然使用了BeginInvoke,然而界面更新也并没有同步更新,也是在循环执行完后,界面才刷新,并不是每1个循环,界面都实时更新
Visual C++/Turbo C串口通信编程实践及源代码 第1章 轻松体验串口通信编程与调试 1 1.1 使用串口调试助手来体验串口通信 1 1.2 体验windows环境下的visual c++串口通信编程 4 1.3 体验dos环境下turbo c串口通信编程 12 第2章 多线程串口编程工具cserialport类 16 2.1 cserialport类的功能及成员函数介绍 16 2.2 应用cserialport类编制基于对话框的应用程序 30 2.3 应用cserialport类编制基于单文档的应用程序 35 2.4 对cserialport类的改进 40 2.4.1 改进一:ascii文本和二进制数据发送方式兼容 40 2.4.2 改进二:也许能解决内存泄漏 43 2.4.3 改进三:彻底关闭串口,释放串口资源 44 第3章 控件mscomm串口编程 46 3.1 mscomm控件介绍 46 3.1.1 vc中应用mscomm控件编程步骤 46 3.1.2 mscomm控件串行通信处理方式 47 3.1.3 mscomm 控件的属性说明 48 3.1.4 mscomm控件错误信息 55 3.2 使用mscomm控件的几个疑难问题 56 3.2.1 使用variant 和safearray 数据类型从串口读写数据 56 .3.2.2 mscomm控件能离开对话框独立存在吗 59 3.2.3 如何发送接收ascii值为0和大于128的字符 60 3.2.4 在同一程序中用mscomm控件控制多个串口的具体操作方法 62 3.2.5 解决使用控件编程时程序占用的内存会不断增大的问题 62 3.2.6 在mscomm控件串口编程时遇到的其他问题 63 3.3 在基于单文档(sdi)程序中应用mscomm控件 63 3.4 应用mscomm控件控制多个串口实例 69 3.5 串口与modem拨号应用简例 76 3.5.1 创建工程 76 3.5.2 代码分析 78 3.5.3 应用 85 第4章 windows api串口编程 87 4.1 windows api串口编程概述 87 4.2 api串口编程中用到的结构及相关概念说明 89 4.2.1 dcb(device control block)结构 89 4.2.2 超时设置commtimeouts结构 92 4.2.3 overlapped异步i/o重叠结构 94 4.2.4 通信错误与通信设备状态 95 4.2.5 串行通信事件 96 4.3 windows api串行通信函数 97 4.4 win32 api串口通信编程的一般流程和特殊实例 116 4.4.1 win32 api串口通信编程的一般流程 116 4.4.2 用查询方式读串口 116 4.4.3 同步i/o读写数据 117 4.4.4 关于流控制的设置问题 118 4.5 cserialport类中的api函数编程应用剖析 119 4.6 win32 api串口编程tty(虚拟终端)实例 128 4.6.1 建立程序工程 128 4.6.2 建立串口设置对话框 129 4.6.3 编写ctermdoc类的相关代码 132 4.6.4 小结 141 4.6.5 在ctermview类中字添加符键入处理代码与串口接收处理代码 142 第5章 串口调试助手v2.2编程 147 5.1 建立scomm程序工程实现界面功能 147 5.2 串口的初始化及关闭 150 5.3 串口数据的发送与接收及十六进制数据的处理 151 5.3.1 十六进数据发送处理 152 5.3.2 手动发送处理 152 5.3.3 自动发送处理 153 5.3.4 接收处理及十六进制显示 154 5.4 其他辅助功能的实现 156 5.4.1 接收数据的文件保存 156 5.4.2 实现小文件发送 158 5.4.3 图钉按钮功能使程序能浮在最上层 161 5.4.4 对话框动画图标的实现 162 5.4.5 超链接功能的实现 164 5.4.6 如何打开帮助网页文件 164 第6章 dos环境下的turbo c串口编程及通用实例gserial类 168 6.1 pc机异步通信适配器8250及其编程操作 169 6.1.1 ins8250内部寄存器及其选择方式 169 6.1.2 波特率设置 169 6.1.3 数据位、奇偶校验、停止位等数据格式设置 170 6.1.4 查询i/o方式相关设置 171 6.1.5 中断i/o通信方式相关设置 171 6.1.6 modem寄存器 172 6.2 comrxtx程序实例 173 6.3 通用实例程序gserial类 175 6.4 用gserial类控制多串口 186 6.5 多串口编程pc机高号中断8259a可编程中断控制器的控制 195 第7章 串口通信用户层协议的编制与数据处理方法 197 7.1 通信协议的编制 197 7.1.1 为什么要编制用户通信协议 197 7.1.2 串口通信中用户层协议编制原则 199 7.1.3 在串口通信中几种常用的用户层协议 200 7.2 串口通信数据包处理方法编程实例 202 7.2.1 编程任务 203 7.2.2 编程步骤 203 7.2.3 程序测试 216 第8章 单片机串口通信 218 8.1 单片机串口硬件系统及c51程序开发 218 8.1.1 较典型的单片机硬件系统实例 218 8.1.2 c51语言及程序简介 220 8.1.3 开发c51程序的利器keil c51 uvision2及串口程序仿真 221 8.2 c51单片机串口通信程序实例 226 8.2.1 实例一 226 8.2.2 实例二 227 第9章 串口与网络结合的解决方案及编程 230 9.1 串口与网络结合的硬件解决方案 230 9.2典型串口与联网的设备 231 9.2.1 nport5400系列产品的特点 231 9.2.2 nport 5400系列产品的典型应用介绍 233 9.2.3 nport5400系列产品的设置与编程测试 235 9.3 与access数据库结合的串口通信实例 237 9.3.1 微机网络检测系统说明 237 9.3.2 创建odbc数据源 238 9.3.3 创建工程 239 9.3.4 程序简介 244 9.4 与winsock结合的串口通信实例 246 9.4.1 客户端应用程序 247 9.4.2 服务器应用程序 252 9.5 在已经编好的串口通信程序中加入网络通信功能 260 9.5.1参照mfc appwizard创建winsockets程序 261 9.5.2 利用windows sockets api和第三方提供的类进行编程 262 9.6 串口通信用于遥控操作简例 262 第10章 计算机串口与其他设备通信编程实例 266 10.1通过串口收发短消息 266 10.1.1 sms编码规范及编码与解码例程 266 10.1.2 at命令收发短消息实例 273 10.1.3 "实时"接收短消息的方法 281 10.1.4 用串口收发sms短信编程的一些讨论 283 10.2 计算机与rabbit 2000嵌入式系统通信编程实例 286 10.2.1 rabbit 2000微处理器介绍 286 10.2.2 动态c(dynamic c)语言介绍 287 10.2.3 某车载无线调度系统实例介绍 288 10.3 计算机与plc通信程序实例 294 10.4 matlab环境串口编程通信实例 295 10.4.1 matlab串口类serial应用 295 10.4.2 通过串口使matlab simulink与下位机通讯进行控制 299 10.4.3 xpc目标环境下串口通信实现 299 第11章 串口通信基本概念及标准 302 11.1 串口通信基本概念 302 11.1.1 串行通信概述 302 11.1.2 单工、半双工和全双工的定义 305 11.1.3 同步传送与异步传送 306 11.1.4 串行通信协议 306 11.2 rs-232-c串口标准 309 11.2.1 rs-232-c标准 309 11.2.2 rs-232-c串行通信接线实例 312 11.3 rs-422/485串口标准 314 11.3.1 概述 314 11.3.2 rs-422与rs-485串行接口标准 315 11.3.3 rs-422与rs-485的网络安装注意要点 317 11.3.4 rs-232、rs422、rs485电气参数对比 318 11.4 串口调试注意事项 318 11.5 常用数据校验法 318 11.5.1 奇偶校验 318 11.5.2 循环冗余码校验 319 11.6 串口连接和tcp/ip连接对比 320 11.7 现场总线与rs-232、rs-485的本质区别 320 11.8 modem通信技术 320 11.8.1 modem的基本工作原理 320 11.8.2 modem的功能 322 11.8.3 modem的分类 322 11.8.4 modem的安装 324 11.8.5 modem v.92标准介绍 326 11.8.6 modem的速度 327 11.8.7 modem优化方法 328 11.8.8 modem命令/at命令 329 第12章 不占用串口的串口数据捕捉 338 12.1 驱动程序的基本概念:vxd与wdm 338 12.1.1 虚拟设备驱动程序vxd 338 12.1.2 win32驱动程序模型wdm 340 12.1.3 在不同操作系统下选用哪种驱动程序模式 341 12.2 vxd示例程序介绍--vtoolsd中的commhook 341 12.3 串口数据捕捉实例程序 351 12.3.1 编程任务 351 12.3.2 编程步骤 351 12.4 虚拟串口简介 364 附录a turbo c说明 366 附录b ascii码表 376

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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