曲成华
摘要:雷达天线的控制系统与雷达任务处理系统之间的通信多采用串口通信方式,交互的内容包括雷达天线方位、状态和对天线的控制命令等。该文先介绍了串口及linux串口设备文件,然后详细设计了Linux系统下的串口编程以及需要注意的相关参数设置。经长期运行证明,该设计能够满足数据交互的要求并具有相当高的可靠性。
关键词:Linux系统;串口通信;串口设置;雷达;天线方位
中图分类号:TP391文献标识码:A文章编号:1009-3044(2012)12-2908-04
Design of the Radar Azimuth Data Exchange Based on Serial Conminucation in Linux
QU Cheng-hua
(The 38thResearch Institute of CETC, Hefei 230088, China)
Abstract: The communication between radar antenna control system and radar-tasking system ulually uses serial communication; the inter? action data includes radar antenna azimuth, status and the radar antenna control commands, etc. This paper described the seial ports and Linux serial device file, and then designed Linux system serial programming, as well as the need to pay attention to the relevant parameter settings. It is proved this design could meet the requirements of data exchange and had a very high reliability.
Key words: Linux system ; serial port data communation; serial port set; radar antenna; azimuth
在某海关监视雷达中,雷达天线的控制系统与雷达任务处理系统之间需要采用串口通信方式,且为满足系统长时间工作的需要,要求任务处理系统运行在Linux操作系统。任务处理系统需要实时接收雷达天线当前方位和状态信息,并发送天线控制命令给天线控制系统。本雷达的总体设计中,信号处理系统生成的雷达点迹情报没有方位信息,这就要求任务处理系统接收的方位信息间隔非常短,经综合考虑和多次实验,确定天线方位的数据周期为15毫秒,因此需要对linux系统下的串口通信进行优化设计以满足高数据率的要求。
1串口简介
串行接口简称串口,也称为串行通信接口,是采用串行通行方式的扩展接口,数据一位一位地顺序传送,其特点是通信线路简单,并可以利用电话线进行远距离通信,但是传送速度较慢。根据信息的传送方向,串行通信可以进一步分为单工、半双工和全双工三种。串口通信具有两种最基本的方式:同步串行通信方式和异步串行通信方式。串行接口按电气标准分为RS-232-C、RS-422、RS485等,这种分类方法仅对接口的电气特性作出规定,不涉及接插件、电缆或协议。由于串口(COM)不支持热插拔及传输数率较低,目前串口多用于工控和测量设备以及部分通信设备中。
2 Linux串口设备文件
Linux的文件系统是操作系统的重要组成部分之一,和其他操作系统一样用于管理和存储文件。Linux将所有的软件、硬件都作为文件来管理,每个文件被保存在特定的目录中,目录中还可以包含子目录,子目录中还可以包含文件和其他子目录。Linux有四种基本的文件类型:普通文件、目录文件、设备文件、连接和特殊文件。Linux将所有的设备都用文件来表示,大多数设备文件都放在/dev目录中,它们的内容就是所有设备名的一个完整清单。这里,设备名Hd代表IDE硬盘驱动器,sd代表SCSI硬盘驱动器,sr代表SCSI CD-ROM驱动器,fd代表软盘驱动器,tty代表终端,lp代表打印机。ttySN就表示第N个串口。对串口的操作也就是对串口设备文件的操作,如open()、read()、write()、close()等。Linux内核提供给用户进程一个设备节点,如/dev/ttyS0,并提供标准的文件系统接口,用户可以用操作普通文件一样操作终端设备;用户的操作必须经过称为终端行规范( terminal line discipline)的模块中进行规范处理;最后终端设备对应的驱动程序对终端设备进行操作。
3通信编程设计
本节首先结合该海关雷达的总体设计进行数据流程设计,然后对终端标准接口进行解释,最后给出Linux系统串口编程的一般步骤和关键的软件代码。
3.1数据处理流程设计
在该雷达中,任务处理系统通过CPCI总线从信号处理分系统中获取点迹信息,该点迹信息不具有方位信息,需要任务处理系统在收到点迹时根据当前的天线方位给点迹方位赋值,因此要求任务处理系统接收的方位信息间隔非常短才能有效的降低点迹方位误差。考虑Linux系统是多用户多任务的操作系统,设计独立的线程来进行天线方位处理,从串口中读取数据并进行报文解释处理,在每成功取得一组天线方位数据后,线程休眠15毫秒,释放CPU资源给其他进程和线程处理。
termios结构共5个成员变量,其中c_iflag用来控制终端设备驱动程序的输入,c_oflag用来控制驱动程序的输出,c_cflag用来描述基本的终端硬件控制,c_lflag控制驱动程序与用户之间的接口,c_cc数组定义特殊控制字符,控制串口的元数个数。
串口操作的主要控制函数如表1所示。其中tcgetattr和tcsetattr函数中返回的结果就是termios类型,tcgetattr函数用于获取终端的相关参数,tcsetattr函数则用于设置终端参数。这些函数提供了对串口的有效控制和操作,完成串口设备数据传输处理功能。
在设置串口属性时需要取出原属性,如果要设置某个选项,那么就使用"|="运算,如果关闭某个选项就使用"&="和"~"运算。
表1串口操作函数
3.3.1打开串口
在Linux中,打开串口设备和打开普通文件一样,使用的是open函数。串口名从ttyS0开始依次为ttyS1、ttyS2等。在本程序中,使用ttyS0作为通信串口。
iDeviceID = open("/dev/ttyS0", O_RDWR | O_NOCTTY |O_NDELAY);
"/dev/ttyS0"表示打开串口ttyS0;选项O_RDWR表示可以进行读操作和写操作,O_NOCTTY表示不能把本串口当成控制终端,否则用户的键盘输入信息将影响程序的执行;O_NDELAY表示打开串口的时候不关心DCD信号线状态,即不关心另一端的串口是否在使用中,否则会在DCD信号线为低电平时停止。
3.3.2设置串口属性
串口打开后还需要对串口进行属性配置即对termios结构体中的成员进行设置才能正常传输和接收数据。总体原则是传输方式设置为原始方式以实现实时通信,不对输入和输出字符进行任何处理,不等待字符汇聚成一行,而是立即读写串口。在设置串口属性前,需要保留原来的串口设置属性,以便在关闭串口前恢复。
串口设置的属性主要包括波特率、数据位、停止位、校验位和其他一些属性。
1)波特率设置
在串口传输中,用波特率来表示传输的速度,1波特表示在1秒钟内可以传输1个比特。波特率有B115200,B57600,B38400,B19200,B9600,B4800,B2400,B1200,B600,B300等多种常用的选项,需要对输入和输出的波特率进行设置。获得端口波特率信息是通过cfgetispeed函数和cfgetospeed函数来实现的,设置端口的输入/输出波特率是通过cfsetispeed函数和cfsetospeed函数来实现。一般情况下,输入和输出波特率是相等的。函数原型如下所示
3.3.3数据接收与发送
接收数据只需调用read函数即可。Ret = read (iDeviceID,buf,N); N表示一次读取的数据个数。串口默认的打开方式是非阻塞的,因此本函数只是接收缓冲中的数据,而并非直接操作IO。如果缓冲中有接收到的数据,那么本函数将返回实际接收到的数据长度,当然不会超过指定的N个字节。如果缓冲中没有数据,那么将返回0。如果接收失败,那么将返回-1,错误代码放在errno中。
发送数据只需调用write函数即可。ret = write(iDeviceID,buf,N);返回值表示实际发送的数据长度。
3.3.4串口属性还原和关闭串口
在使用完串口后,需要还原串口原有的属性并关闭串口,设置如下所示。