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

来源:网络(转载) 作者:陈超 李灿平 韩立昌 发表于:2011-09-19 15:52  点击:
【关健词】SerialPort类;VC++;串口通信
以实际应用中串口通信的开发为例,分析了实时串口通信中数据的获取及处理方法。此例中要求接收雷达串口的数据并进行校验。过比较几种串口通信的编程方法,提出了基于Visual C++中SerialPort串口类的解决方案,并阐述了应用程序的编写过程。

 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; (责任编辑:南粤论文中心)转贴于南粤论文中心: http://www.nylw.net(南粤论文中心__代写代发论文_毕业论文带写_广州职称论文代发_广州论文网)

顶一下
(0)
0%
踩一下
(0)
0%


版权声明:因本文均来自于网络,如果有版权方面侵犯,请及时联系本站删除.