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

问题描述

由于某种原因,串口发送被写在了一个循环里面,表示需要多次发送,然而希望是发-收-发-收这样的步调同步工作。根据跟踪,发现目前的程序必须在所有循环执行完毕,也就是所有发送动作完成后,才会去执行串口的DATARECIEVE事件,去读缓冲。如何实现这样的同步呢?发送的代码是这样的:foreach(intiFNinSelectedFN){//**AFN,FN都有了,其他在界面上填入,开始组建通信帧textFN.Text=iFN.ToString();List<byte>frame=newList<byte>(512);MakeFrame(refframe,iFN);//**然后发送这个帧stringsframe="";foreach(bytebinframe){sframe+=b.ToString("X2");sframe+="";}sframe+="rn";SendFrame(frame);this.BeginInvoke((EventHandler)(delegate{richTextBox1.AppendText(sframe);}));Thread.Sleep(3000);}根据日志文件,发送动作确实是每3秒发送一下。而函数Sendframe(frame)只是简单的调用了串口的write方法。问题是串口的DATARECIEVED是在这个循环执行完毕后,程序返回,才开始处理的。想了很久,不知道该怎么实现?用全局变量来同步?也不行,因为调试发现是发送的循环执行完才触发了读串口缓冲的动作

解决方案

解决方案二:
另外,还一个现象就是,发送时虽然使用了BeginInvoke,然而界面更新也并没有同步更新,也是在循环执行完后,界面才刷新,并不是每1个循环,界面都实时更新
解决方案三:
我也不是很懂,因为用invoke去测试UI的同步更新,并没有效果。但我可以建议你用一个TIMER,再用一个发送帧的LIST,然后用一个全局的静态BOOL参数去控制是否允许发送,TIMER定时检查发送帧的LIST,一旦发现有,且允许发送标识为真,则发送。这样串口的接收数据事件一旦触发,则首先置允许发送为FALSE,然后处理,处理完成再置允许发送标识为TRUE,这样就可以绕过你的问题。
解决方案四:
试试:每次发送根据业务需要,控制发送数量或长度
解决方案五:
试试新建一个Thread去执行这个循环
解决方案六:
将发送的过程写成一个void方法,用一个线程sendthread专门执行它,将datareceived事件添加到void方法中,用一个线程锁协调收发。具体的你看一下线程锁的简单用法就知道了。
解决方案七:
一般来说,通信最好放在Thread里执行,包括串口的通信,然后与界面的交互(一般为显示数据什么的),通过事件委托出来给主线程显示。从你给的代码来看,仅仅是执行了发送的操作,中间还让主线程沉睡了3秒(这是你界面不实时更新的原因),一般数据接收由事件触发,需重新处理的,你展示出来的代码看不出什么
解决方案八:
按照你的发-收-发-收的思想。你可以开一个线程,一直去接收串口来的字符串。另一个线程根据你接收到的字符串数据,然后用正则表达式判断接收到的是什么字符串,根据判断结果去执行想做的事情。

时间: 2024-09-09 22:50:43

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

字符-MFC使用串口通信收发数据问题

问题描述 MFC使用串口通信收发数据问题 我使用VS2010的MSCOM控件编写串口程序,程序需要向下位机发送一些数据,而下位机收到数据是会作出应答.我用的是 :m_com1.put_Output(COleVariant(_T(""12""))); //m_com1为MSCOM控制变量但发现后面下位机接收的是1和2的ASCII码对应的字符:想问问各位大神有没有可以直接给下位机12数字而不是ASCII码的 解决方案 发送数字12,你就直接写12,不要使用双引号.使用

linux编程-linux串口通信问题,急急急!!!

问题描述 linux串口通信问题,急急急!!! 我在开发板上qt程序,开发板跟PC机的虚拟机通过USB转串口线连接,上面运行的是Ubuntu12.04系统,我在PC上发送字符串,然后在开发板上接收,接收的数据单个单个字符接收,为什么不是一整个字符串接收呢?并且接收不到第一个字符,而且差不多接收10秒之后就不在接收数据了!!!!.请各位大神赐教!!! int fd,num,rtn; struct termios options; fd = open("/dev/ttyUSB0", O_R

linux串口通信!求大神!急

问题描述 linux串口通信!求大神!急 我现在有一块7444的开发板,想实现7444通过串口传输命令给7444开发板上的另一模块cc2530(zigbee中的协调器),然后发送给给第三方开发板(只要当前cc2530能接收到命令就能直接发送数据到zigbee终端,以实现),然后终端zigbee模块的温度数据回传到7444开发板上的CC2530协调器,再从串扣回传给7445,已知我当前的串口设备文件是tty1,怎么编写C程序读取改开发板上cc2530传来的温度数据,和通过串口给cc2530发送命令

c++问题-MFC串口通信,急求答案!

问题描述 MFC串口通信,急求答案! 我是基于对话框的mfc.在主对话框里添加菜单,单击一个菜单项弹出对应功能的对画框,在其中一个对话框添加的MSComm控件,编写了串口通信命令.现在想在其他对话框里也使用串口通信,要如何做呢?(每一个对话框新生一个类)

缓冲-CC2530,串口通信,收发字符问题。

问题描述 CC2530,串口通信,收发字符问题. 本人单片机新手.下面的程序是正确可达到目的. 对于这个程序我有2个地方不太理解,望大神不吝赐教. 第一个:[设置发送字符串的函数]这个块儿,不太能理解.特别是我注释的地方. 第二个:[主方法中]接收那部分,有一个注释的地方,搞不懂.求解释... 没有金币,,,不知道有大神赐教没...跪谢... /* 设置串口波特率115200bps,8N1 串口调试助手给CC2530发送字符串,开发板则返回同样字符. */ #include<ioCC2530.h

串口通信-有关线程收发串口数据的问题

问题描述 有关线程收发串口数据的问题 最近写一个项目里面用到的是基于串口通信的. 由于我需要一直处于接收数据状态,并且可以随时发送数据(我的串口是RS232,支持全双工),于是想到了用两个线程去做. 一个处于收状态,一个发包用. 现在的问题是:我只有一个SerialPort对象 ,通过跨类的信号和槽得到这个对象,但是一放在线程的run函数读写就会报错. 我曾想过把串口的设置和连接放在线程类里面做,但是我这边两个线程呢,一个链接的话,端口就会被占用,另外一个线程就没法连接 困了一天了 不知道该怎么

C# 串口显示不同步

问题描述 我现在通过以硬件发送数据波特率115200数据一秒一发.上位机接收数据用的是C#winform使用DataReceived这个自带的方法接收数据.前台用了一个RichTextBox控件显示.我设置了一个变量i只要一进DataReceived方法自加一次,值赋给RichTextBox.现在的显示就应该是RichTextBox显示的数一秒加一次1,2,3,4.....一直加下去.但是现在的显示是1,3,,6,9,12.请大神指点.voidSp_DataReceived(objectsend

C#编写串口数据收发程序,收发频繁,求教多线程处理机制!

问题描述 C#编写串口数据收发程序,收发频繁,求教多线程处理机制! C#编写串口数据收发程序,点击界面按钮发送指令数据,等待接收返回的数据,此外还有周期性数据需要不断接收:接收到的数据要判断重复帧和是否是最后一帧,然后去掉帧头帧尾并显示在界面控件内:目前程序开了三个线程:接收.处理.发送,三个线程都是一直循环判断指针是否有更新,但这样导致界面切换太卡,请问该怎么处理这三个线程之间的关系才能使界面切换流畅呢,初学C#,如果能给出具体修改代码方法更佳,请大神帮帮忙啊~急! 解决方案 不要过度同步UI

基于vb设计pc与gsm模块串口通信,发收text格式短信

问题描述 基于vb设计pc与gsm模块串口通信,发收text格式短信 小白一个,花好几天都没搞出来,跪求各位大大帮忙设计一个程序,最好有解释的.要求可以收发删除text格式短信... 解决方案 http://download.csdn.net/detail/hedilong0123/4611789