C51源程序集合
包括以下目录源码
├─AD-MSP430f149D
├─ADC8535
├─bin
├─c51源程序
├─c51源程序锦集
├─ct2Timer
├─
源代码在线查看: 串口数据收发的算法问题.txt
C51编程:串口数据收发的算法问题 [lemonskin] [89次] 01-6-6 上午 09:55:30
C51单片机在同PC机进行串口通信时所采用的数据包协议如下所示:(以字节为单位)
消息类型(有限个消息代号)
消息长度(高字节)
消息长度(低字节)
消息内容(消息长度所指示的字节数)
校验字(从消息类型开始到消息内容结束所有字节的按位异或值)
串口速率4800bps
现在有下面两种算法可供采用:
1.超时(超长)废弃
使用单个的数据缓冲区,长度稍大于所有消息中的最大长度。首先初始化串口的状态为
等待态,发生串口中断时状态转移到接受态,判断一个消息包结束的标志是接收到的字节数
等于消息长度所指示的字节数,这时状态转移到结束态。在程序的主循环中有一个函数用来
检验并处理接收到的一个完整的数据包,只有当状态处在结束态时,才进行数据包的类型和
校验字的检验,正确就继续处理,否则将数据包废弃掉,再把状态该为等待态。同时在接受
数据时(处于接受态),预先设置的一个定时器开始计时。存在一个最大时间值用来反映可
能接受的最大的数据包所需要的时间,当计数值超过了这一最大值也认为消息包出错予以废
弃,定时器清零,状态仍然返回到等待态。
这一算法的优点是处理实时性好,速度快,占用RAM空间少;缺点是可靠性不好,当一
条消息出错时,紧接着到来的下一条消息即使是正确的也很可能被废弃掉。
2.缓存消息,逐个检验
使用大量的空间(同时能容纳很多条消息)组成循环消息队列。只要发生串口中断就保
存数据到队列中(从队尾插入)。主程序循环中有一个函数从队列中取出数据(从队头取
出)进行检验。依次搜索每一个字节,当属于某一种消息类型时再取出长度字段,按照长度
的指示寻找到校验字,正确就继续处理,否则恢复原先的队头位置并后移一个字节,继续下
一轮消息头的搜索。当搜索成功或者当队列中的数据已经少于最短消息的长度时退出函数。
这一算法的优点是可靠性好,不易造成数据包的丢失;缺点是处理实时性不好,后台PC
往往得不到及时的响应,另外当遇到最坏的情况时付出的代价是相当大的。当队列中存有大
量数据时,如果一旦接收数据发生了失步(重新搜索消息头),则必须逐字节的进行检测,
同时要是消息类型较多的话,执行效率就更低了。
不知道大虾们在处理串口通信时采用什么样的算法,有什么好的经验请多多传授,在下
感激不尽,先行谢过。
我的方式 [yaodong_wu] [72次] 01-6-6 上午 10:40:44
对于比较简单的应用,我一般倾向于使用简单的通信方式。
我的方式是:
1、通信协议
桢头(一个或两个固定的字节来表示一桢的开始)
信息类型
信息内容
校验
这里去除了信息长度,每一桢采用固定的长度,可以防止由于信息长度接收错误冲掉RAM
使用中断的方式来检测桢头,检测到桢头后就进入查询接收状态,查询接收时可以设一个超
时退出,防止等死,接收完一桢后校验,正确就处理,不正确就退出
如果数据量不大的话,这样做一般是可以接受的,并且简单可靠
2、使用半双工的通信方式
一般采用半双工的通信方式,一方发出数据请求后,另一方在固定时间内响应请求,如果不
响应请求方就放弃本次请求,转入下一轮循环。也就是说,让通信的发生是可预测的
你这个协议很合理,可惜我们单位已经把协议固定下来了,没办法啦 [lemonskin] [6次] 01-6-6 上午 10:47:25
大家多出出主意嘛,串口通信的应用应该是很广泛的。 [lemonskin] [11次] 01-6-6 下午 02:27:52
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2001