《现代电子技术》2006年第19期摘录:王静等:基于I)elphi的串
-
如发现有乱码,请点击下面链接浏览原文
正文摘录:
王静等:基于I)elphi的串口通信实践4.1数据大于127时的数据发送在通信程序中,以单字符方式逐个发送数据时,每一个数据范围O~255(即十六进制的00~FF)。但是在实际应用中当字符的AS(:II码超过127时就收不到对应的字符。造成这种结果的原因在于中文windows使用的是双字节字符集(I)BCS)系统。I)BCS系统使用O~127之间的数字表示AS(:II字符,大于127的数字仅作为前导字符,他只是显示一个非拉丁语系的字符,而并不代表实际意义。那么,如何发送大于127的数据呢?答案是使用动态数组或可变数组。将要发送的字符转换成对应的数字,存入动态数组或可变数组发送。例如要发送十六进制数‘AA’,他的ASCII码大于127,这时就将‘AA’转换为数字170存入后面介绍的二进制数组后发送。发送二进制数时,一般用数组进行传输,由于.MS(:omm控件的output属性在I)elphi中是variant变量,而【)elphi数组跟variant变量不兼容,即【)elphi中字节数组不能直接赋值给MSComm控件的ouIput属性。因此我们用可变数组或动态数组进行二进制通信。下面给出动态数组的例子:tmpl‘n1.:array[1..max]ofbyte;//定义二进制数组为全局变量,值由程序其他部分给出proeedm。etforml.sendatablnclick(sender:tobject);varcount:integer;serialoutput:variant.;beginserialoutput:一vararraycreat([1,max]。varbyte);//创建一个代表字节类型的可变数组,长度为传输的串行数据长度maxforcount:==1tomaxdo//count小于传输的串行数据的长度时执行以下操作serialoutput[count]:一tmpm’t[count];//将二进制数组的值赋给可变数组mscomml.output:一serialout.put;end;4.2串口数据接收中的问题及解决办法数据通信一般都有一定的数据格式,比如定义开始字符和结束字符也叫帧头和帧尾。按理说这样就很容易进行数据的接收,但在实际通信编程中还是容易出现一些比较隐蔽的通信错误。下面就常用方法分别进行分析。4.2.1定时器轮循法定时器轮循法是定时对数据进行接收,所间隔的时间到达时对数据进行一次接收,当下一个间隔的时间到达时进行第二次接收,依此类推。假定每个轮循期数据接收完毕,并在每个轮循期处理数据,由于有开始字符和结束字符很容易确定接收数据的完整性。好象合理设定轮循时间值就万无一失了,但被动接收数据时无论如何也找不出】28合适的轮循时间值,因为启动定时器和数据到来基本不同步,这就会出现一次发送的数据被分在两个轮循期接收。解决这类问题的办法是要检测接收到的数据的完整性。4.2.2on(“omm事件法当有串口通信事件发生时会触发On(:omm事件,若为接收数据事件时,Comevent值为ComEvReceive或数字2,程序设计者可以通过判断Comevent的值来进行数据的接收。一般在数据接收时还要设定MSComm控件的Rthreshold属性,他指定接收缓冲区有多少个字符后将触发0n(“omm事件。但是在使用Rthreshold属性时,经常会遇到这样的问题。例如将MSComm控件的Rthreshold属性设置为1,接收缓冲区应该在收到每一个字符时都会使MSComm控件产生()nComm事件,但实际上OnC0mm事件并不是每收到一个字符就触发一次C)nComm事件,他是在缓冲区收到几个甚至几十个字节数据后才被触发的,这可能是windows多任务使操作系统不能实时响应造成的。另外在用MSComm控件的()nComm事件接收数据时也会发现接收的数据不完整的现象。例如,将MSComm控件的Rthreshold属性设置为1,当数据发送端发送AAEF、CBDDC65787BB一组数据时,尽管接收缓冲区定义为1024B,但是在数据接收端第一次可能接收到AAEF、CBDDC6这些数据,第二次接收到5787BB数据,数据没有一次接收而是被分为两次接收到的。原因也可能与操作系统有关。为了保证接收端能接收到一组完整的数据,必须对接收到的数据进行检测。4.2.3数据有效性的判断为了解决上面两种情况下出现的数据接收不完整的问题,这里提出了对接收数据进行校验的解决办法。即在接收端对接收数据的帧头和帧尾进行校验,取出帧头和帧尾中的数据。具体办法是在接收端用一个可变数组接收发送端传过来的数据,判断这些数据中是不是存在一对帧头和帧尾对应,如果存在则取出他们之间的数据,若取出后剩下的数据还有一对帧头和帧尾对应,则继续取出。直到没有一帧完整的数据时判断剩下的数据是否还存在帧头,若存在即将帧头及之后的数据一起存人一个全局变量数组中。全局变量数组为一动态数组,长度设为取出后所剩余数据的长度。若没有帧头,则丢弃该剩余数据。在下次数据来临时将全局数组中的数据取出存入可变数组,再将本次接收的数据也存入可变数组,两者和起来作为一组新的数据继续判断接收,方法同前所示。下面用图1来具体说明该方法,定义staticarray为全局动态数组,val。iantarray为可变数组。5MSComm控件应用实例以高速公路收费系统费额显示器的串口调试软件为
阅读此文(图):
点击此处在线翻阅