1.根据数据发送时间间隔判断的,这个是大多数单片机设备使用的方法,每两个数据包之间都有一段间隔,cptFrameTimeout 就是根据这个间隔判断数据包结束的。
2.发送数据的时候要发送首尾标识字节,并且数据里面要用转义符避开做标识的字节,这个要修改通讯协议,但是数据包之间没有间隔了,传输速度快,并且更可靠。
线程是在一个程序里面,独立运行的一段代码,他会和主线程同时运行,在后台中运行的。
线程和中断是完全不同的概念。中断是主程序停下来,执行中断的内容,中断结束再继续主程序。而线程在后台运行,不影响主程序。
Windows 的程序都至少有一个线程,即主线程。主线程的主要任务是界面的处理,所有界面的显示和处理都在主线程。
并且在未特殊声明的情况下,Windows 控件的事件也都是在主线程里面执行的。
事件有点像中断,如果一个线程产生事件,这个线程就会停下来执行事件里面的内容,实际上这个事件也属于这个线程。
如果不在主线程里面处理显示,而在另外一个线程里面处理显示,就会与主线程冲突,
因为线程里面处理显示的同时,主线程里面也很可能正在处理显示,因为两个线程是同时运行的,不是中断的。
在 OnCommNotify 里面如果不处理显示,是不会有任何问题的,但是系统缓存有限,在这里停下来处理数据的同时,串口收到的数据在系统缓存里面,如果缓存满了,就会丢数据,而在其它线程里面工作,不会影响接收数据,收到的数据将储存在控件的 FIFO 缓存,这个缓存的容量是可以任意设置的。
在 OnCommNotify 里面要慎重处理显示,因为这个事件可以响应很及时,可以在这里处理数据,然后使用 PostMessage 向主线程发送一个消息,让主线程去处理显示,是最完美的。
如果不考虑发送消息和接收消息的时间,可以在 OnCommNotify 里面直接用 PostMessage 发送到主线程,然后数据和显示都在主线程里面做。
--------------------next---------------------
YbCommDevice1->PackageType = cptFrameTimeout; //用判断超时的方法接收数据包
YbCommDevice1->UsePackage = true; //启动数据包 (可以随时启动和停止, 与 Active 属性无关)
不是已经使用数据包(有帧头和帧尾)传输了,怎么又用到超时判断接收呢?
我现在想写一个PC机与单片机通讯的程序。PC机主动发命令召唤单片机的数据,然后等待接收;单片机在收到相关的命令后,返回相关的数据,同一个命令,单片机可能需要返回若干帧的数据。如果超过一定的时间PC机没有收到对相应命令的回复,就重复发送该命令。若干次后,仍未收到相应的回复,则给出错误信息。PC机大概有20多条不同的命令。
我想利用OnCommNotify事件来接收数据,尽量不要丢帧;利用PostMessage,在主线程里对接收到的数据帧进行协议的解释(包括显示和画图),如果收到对相关命令的回复,就置一个标志FLAG1;开一个定时器,发完一个命令后,启动定时器,定时时间到,检测FLAG1,如果满足,关掉定时器,如果不满足,则置错误标志ERRFLAG,进行重发等相关处理。 我现在不知把检测ERRFLAG的程序放到哪里比较合适。
不知我表述的是否清楚,您能不能提供一些思路呢?
谢谢!
--------------------next---------------------
阅读(1163) | 评论(0) | 转发(0) |