首页 > 范文大全 > 正文

SerialPort类在雷达串口通信中的应用

开篇:润墨网以专业的文秘视角,为您筛选了一篇SerialPort类在雷达串口通信中的应用范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:以实际应用中串口通信的开发为例,分析了实时串口通信中数据的获取及处理方法。此例中要求接收雷达串口的数据并进行校验。过比较几种串口通信的编程方法,提出了基于Visual C++中serialport串口类的解决方案,并阐述了应用程序的编写过程。

关键词:SerialPort类;VC++;串口通信

中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)24-5921-02

SerialPort Class in Radar Application of Serial Communication

CHEN chao1, LI Can-ping1, HAN Li-chang2

(1.School of Chengdu University of Technology, Chengdu 610051, China;2.Sichuan Academy of Aerospace Technology, Chengdu 610100, China)

Abstract: Taking the actual application of the development of the serial communicationfor example,it analyzed the method of gaining and processing real-time data in serial communication. In this case it is required to receive and check the radar data .Through the comparison of several programming methods of serial communication, it worked out the solution which is based on SerialPort class of Visual c++, and expounded the writing process of the application program.

Key words: SerialPort class; VC++; serial communication

串口通信因其实现简单、成本低廉、数据传输可靠等优点,而被广泛应用于工业控制系统中,是计算机与外部设备进行数据通信时经常使用的方式之一。此文中要根据具体的串口通信协议,对雷达串口发送的数据进行接收、校验及显示。

1 程序开发

Windows平台下串口通信程序通常有以下三种方法实现:

1)利用MSComm控件编程;

2)利用API底层函数编程;

3)利用第三方串口类进行编程。

MSComm(Microsoft Communications Control)控件是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它编程简单,但只能对应于一个串口,当程序开发需要使用多线程技术时,用MSComm控件难以实现。而与之相反,用API底层函数编程又过于复杂,必须对API底层编程及多线程技术特别熟悉,并且存在编写程序可移植性差的缺点。因此,本程序中选择第三方的开源串口类-SerialPort类来编程。这个类能高效地实现多线程串口编程。

1.1 串口通信协议

雷达对外接口采用RS422串行通信差分接口,通信格式为1位起始位、8位数据位、1位奇校验位、1位停止位,多字节数据则先传高字节、后传低字节,字节中,先传低位,后传高位,通信波特率为115.2kbps。 雷达对外接口通信协议见表1。

注:1)数据长度是指数据区内容长度,不包括帧头、数据长度本身及校验字节;

2)捕获/跟踪状态定义:0xAA捕获,0x55跟踪,0xCC记忆跟踪探索;

3)电源数据定义:高4位为0x1 表示7V加电正常,低4位为0x1表示模拟5V加电正常;

4)自检工作状态字节定义:

bit0; 100MHz晶振工作状态,1为正常;

bit1; 信处DSP工作状态,1为正常;

bit2; 信处FPGA工作状态,1为正常;

bit3; 伺服DSP工作状态,1为正常;

bit4; 伺服FPGA工作状态,1为正常;

bit5; 频综FPGA工作状态,1为正常;

bit6; 信处采样时钟工作状态,1为正常;

bit7; 上行本振频率工作状态,1为正常。

5)数据校验采用和校验方式,对数据区内容进行累加求和后,取反加1,数据区内容不包含帧头,数据长度及校验字节本身。

1.2 基于SerialPort类的串口程序开发

SerialPort类是一个采用Windows API技术开发的串口通信类。这个类基于多串口、多线程技术,只需要添加这个类到编写的程序框架中,就可以使用其成员函数开发程序。其工作流程是:首先设置好串口参数,再开启串口监测线程,串口监测线程监测到串口接收到的数据、流控制事件或其他串口事件后,就以消息方式通知主程序,激发消息处理函数,这是对接收数据而言的;发送数据可直接向串口发送。程序的开发步骤如下:

1)建立窗口框架。

建立一个基于对话框的MFC应用程序SerialPortTest,程序界面如图1所示。然后用ClassWizard为相应控件添加变量。

2)添加SerialPort类文件。

将SerialPort.h和SerialPort.cpp两个文件复制到工程文件夹中,点击Project->Add to Project->Files命令将上述两个文件加入工程,并在SerialPortTestDlg.h中加入#include”SerialPort.h” 。

3)手动添加串口消息响应函数。

首先在SerialPortTestDlg.h中添加串口字符接收消息WM_COMM_RXCHAR(串口接收缓冲区有一个字符)的响应函数声明。程序采用事件驱动来实现数据的实时接收,事件驱动消息机制会在串口收到一个字节数据后启动,激发消息响应OnComm(WPARAM ch,LPARAM port)来对事件作出反应。根据通信协议,在OnComm中对接收到的字符的处理,将接收到的字符显示到接收区的编辑框中。接收区部分代码如下:

LONG CSerialPortTestDlg::OnComm(WPARAM ch, LPARAM port)

{static int FrameSync = 0;//接收帧同步

static int ReceivedHead = 0;

static StartRec = 0;

int DataByte;

int RDataLen = 0;

int DataCounter = 0;

int framelen;

int byte;

for(;;)

{if((DataByte = getbyte()) == -1)//接收缓冲区空

return -1;

if(!FrameSync)

{if((DataByte == 0x55))//对数据包帧头的判断

{ReceivedHead = 1;

continue;

}

else

{if(ReceivedHead && DataByte == 0xAA)

{FrameSync = 1;

ReceivedHead =0;

StartRec = 1;

continue;

}else

{ReceivedHead = 0;

continue;

}}}

else

{if(StartRec)

{if(!RDataLen)

{RDataLen = DataByte;

}else

{TempReceiveBuff[DataCounter++] = DataByte;

RDataLen--;

if(!RDataLen)

{StartRec = 0;

FrameSync = 0;

ReceivedHead = 0;

framelen=DataCounter-2;

DataCounter = 0;

byte = checksum(&TempReceiveBuff[0],framelen+1);

if(TempReceiveBuff[framelen+2] == byte)

return 1;

else

return -1;

}}}}}}

此函数完成了对数据包的实时接收,对数据包进行校验。

4)初始化串口。

点击“打开串口”按钮时进行串口的初始化,添加m_SerialPort.InitPort(this, nPort, 115.2, 'N', 8, 1, EV_RXFLAG | EV_RXCHAR, 512)。

5)其他辅助功能开发。

程序还实现了保存数据的功能。分别添加单击“更改路径”和“保存数据”的响应函数OnButtonDirbrowser()和OnButtonSavedata(),并添加相应的代码即可。

至此,程序开发基本完成。

2 结束语

SerialPort串口类是一款可以实现多线程的开放源代码,代码可移植性高,可根据需要对成员函数进行适当的修改,以实现实际工程要求。当需要实现几个串口同时收发时,用它也能方便的实现。通过程序开发过程可知:用SerialPort类编写串口程序,开发简洁、方便,并具有运行稳定、可靠等优点,适用于通信及工业控制领域串口通信上位机程序开发要求。

参考文献:

[1] 龚建伟,熊光明.Visual C++/Turbo C串口通信编程实践[M].2版.北京:电子工业出版社,2007:27-61.

[2] 白宁,金华晋.基于VC++6.0的串口通信程序开发[J].电脑编程技巧与维护,2010(8):84-85.

[3] 李现勇.Visual C++串口通信技术与工程实践[M].2版.北京:人民邮电出版社,2004:12-16.

[4] 黄晖,柴剑勇,严兴,等.串口通信技术[J].科技创新导报,2010(27):20-21.

[5] 邱建华,彭志豪.串口通信技术在Visual C++中的实现[J].软件工程师,2010(z1):94-95.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文