2021-4-9 | 通信技术
0引言
远程通讯系统一般要求通信距离在30公里以上,所以通常情况下通信环境比较复杂,在较长距离下的电磁干扰和信号衰弱对通讯系统的稳定性都提出了较高的要求。串口是常用的计算机与外部设备之间的数据传输通道[1],由于使用其通信方便易行,且能实现数据的远距离传输,故可采用串口通信作为远程通信的渠道。同时要利用合理的通信帧定义模式进而实现远程通信协议的同步性问题,目前较为常用的方法有逐次比较法[2]、基于FIFO队列同步法[3]、状态机消息同步法[4]。实验表明状态机消息同步法最大限度地减少了系统的冗余运算和中断后数据丢失的问题,保证了控制站第一时间获得被控设备是否接受指令开始运行的信息,实现了控制的可视性,进而保证了系统的稳定运行。
1通讯设备配置
系统采用串口通讯的方式实现PC机与外部设备的连接,利用VC++编写的控制软件和指令接收软件实现系统指令的发送和执行。外部设备采用PDL35数传电台,这种电台能够实现最大19200比特每秒的传输速度,并且具有低功耗和前向纠错的能力,提高了抗干扰性和覆盖性。控制设备通过电台向工作设备发送标准化指令,双方基于特定频率的无线电互相访问。连接成功后进入设置主界面后可查看电台类型、频率范围、固定版号等信息。主要在”RadioLink”选项卡下设置通讯频率、波特率与通信灵敏度。特别需要注意的是通信频率和通信灵敏度需要基站和移动站完全一致。
2通讯帧格式定义
对于远程通讯系统,需要完成多个不同的工作,并且实时返回工作状态以保证远程控制的可靠性。这就需要对通信协议进行特殊的定义以进行解析同步,进而完成各项工作。本系统中定义通信协议帧结构如图2所示。帧头用于同步[5],一般为一个或两个ASCII字符,本系统中使用一个字节0xFF表示,系统接收此字符后开始接收中断。帧发送方用1字节表示,分别用0x01表示1号基站发送的命令,同时也意味着任何接收设备会向此基站反馈设备是否正常运行。帧接收方表示方法与发送方相同,0x01表示命令是发送给1号设备的,其他设备在接受此命令时不工作。帧类型定义了系统命令表征的不同功能,帧内容主要包含了指导接收设备如何执行功能的具体信息,而帧内容长度则作为帧内容的校验信息指导接收设备提取接收信息。在本系统采用一个字节的0xFE作为结束码,当系统检测到此数据段的时候跳出系统中断。表1为通信协议中帧内容的详细格式。
3串口通信数据解析及处理
3.1逐次比较法
这是一种比较基本的方法,首先等待串口数据,在串口接收中断服务程序中每收到一个数据就与已知的命令数据串进行比较[6],如果不一致则等待新数据直到接收的数据与包头信息的第1个数据相同。第1个字节的数据比较正确后将收到的第2个字节与已知数据串信息的第2个字节进行比较,如果不正确则退出此中断。程序流程如图3所示。此种方法代码量小、编程简单,可用于在主程序中数据量较小并且格式相对固定的程序。但是这种方法浪费了大量的中断进程,并且在每个中断过程中执行命令操作需要消耗较多的机器周期,无法满足串口数据量较大且传输较快的情况。
3.2基于数组的FIFO队列法
也有人提出对上述方法的改进,首先定义一个固定长度的全局数组,并将数组看做是一个先入先出的FIFO队列[8]。在串口接收中断中,每接收一个数据就保存在此数组中,将得到的数据与已知的命令格式串进行比较,如果正确则将数组中的所有数据向前移动一个字节,串口接收到的新字节存入数组末字节中,将整个数组与协议中的包头信息比较如果正确则置位已同步标志位然后开始接收存储有用数据[8],否则继续等待同步。其流程图如图4所示。此种方法与逐次比较的帧同步方法相比能够比较快速正确地检测出同步包头,但是对数据格式要求相对固定,特别是帧内容形式比较复杂的时候难以对数组的长度进行限制,在提取相关的信息的时候会浪费大量的时间。
3.3基于字符串的状态机消息相应机制
鉴于以上两种方法的缺点,在本系统中采用基于字符串的状态消息响应机制,首先将命令转化为字符串的格式,以十六机制代码发送给电台进行传输。在接收方,首先检测同步字符,当检测到同步字符时,响应状态机消息机制,同时将此字符串依次存入缓存中。由于传输距离比较远,一般存在字符串命令不能在一个机器周期内到达的情况,则指定系统一直处于写缓存状态中。当第一个机器周期没有检测到结束码,则将缓存内容写给一个过渡变量,同时清空缓存以完成下一步写缓存操作。依次进行以上操作,在每一次机器周期结束后将缓存中的数据累加到过渡变量中,直到系统检测到接收数据的最后一个字节变量为结束码,此时将缓存中的变量赋值给消息效应命令,开始状态机响应环节。状态机状态转移图如图5所示。当
数据完成初始检测校验,即检测到结束码0xFE之后,系统开始状态消息响应循环,否则超过一定时间没有结束校验,则默认此次命令消息发送失败,系统缓存清空,跳出串口中断。在消息响应循环中,系统会根据预先设定的字符串格式和所检测到的字符串标志位信息,对接收到的有效数据进行提取,并赋值给相应的变量做下一步的操作。指令操作结束后,工作设备将自动返回“命令接受正确”指令,向基站确认此次操作成功。否则任何一步出现错误,系统将自动跳出中断,并返回“命令格式错误”指令,提示基站重新发送命令。工作设备示例程序段如下:BYTEdata[1024];CStringstr;if(m_MSComm1.GetCommEvent()==2){m_input1=m_MSComm1.GetInput(;m_input2=m_input1;length=m_input2.GetOneDimSize();for(i=0;i<length;i++){m_input2.GetElement(&i,data+i);}m_receivedata.Empty();for(i=0;i<length;i++){chara=*(char*)(data+i);str.Format("%c",a);m_receivedata+=str;//串口消息获得}guodu+=m_receivedata;guodujieshu=m_receivedata.Mid(length-2,2);if(guodujieshu=="FE"){receivefasongfang=m_receivedata.Mid(2,1);receivejieshu=guodu.Mid(guodu.GetLength()-2,2);}}////////////////////数据接收本系统的设计思路由于采用了基于字符串的状态机消息响应机制,快速有效地实现了串口通信的同步,而且程序结构清晰、便于维护、也方便日后通讯系统功能升级。并且串口中断服务子程序中将有效数据提取为不同的字符串变量,方便操作的同时也减少了完成消息响应循环所需要的周期。