APP下载

GPS与PDA的串口通信研究

2018-03-27张欣然

数字通信世界 2018年9期
关键词:波特率控件串口

张欣然

(中国石油大港油田分公司信息中心,天津 300280)

1 引言

随着企业信息化进程的推进,无论是哪个管理相关部门,都希望从工作的现场得到最新的数据,并对这些新的数据进行综合的分析。然而,不同的控制器来自不同的厂商,通过不同的标准,组成各自需要的系统,并进行控制,各个控制系统形成了互不相连的自动化孤岛,因为很多数据无法整体的采集到并进行整体的分析与研究。从而更无法建立统一的生产过程数据平台,难以实现管理控制的一体化。

2 GPS数据提取方法

GPS数据提取方法分为两个步骤:第一步,GPS数据的捕获;第二步,GPS数据的解析。前者采用串口通信的方式把GPS接口与主机相连接,利用VC++的MSComm控件实现对串口编程,捕获GPS接收机所发送的数据;后者根据捕获的GPS数据帧格式中的帧头确定要给哪个数据帧进行数据的解析,然后根据数据帧结构中的内容提取所需要的信息。

VC++6.0提供的MSComm控件可以通过串行端口捕获GPS信号接受机所发送过来的数据,为应用程序提供串行通信的功能。MSComm控件串口通信编程的基本流程如图1所示:

现以”$GPRMC”数据帧解析为例,首先针对串口通信下捕获的GPS数据,判定帧头是”$GPRMC”,其次根据所需要的信息(例如经纬度、时间、速度等)确定需要提取该帧头后的数据帧中哪些字段的内容,最后对所提取出来的内容进行恰当的变换,服务于后续的具体应用。

3 串口通信

3.1 Linux下串口通信基本原理

Linux系统将设备和文件的操作都作为对文件的处理,所以对设备的操作,内核会返回一个文件描述符,需要将其作为参数传给相对应的函数。Linux中所有的设备文件都放在“/dev”目录下,通过“ttyS+编号”命名相应的串口资源,所以对应路径是“/devttyS*”。因而可以相对文件读写那样访问一个串口设备。

3.2 Linux下的串口设置

首先要对串口进行设置,在termios.h完成对波特率等的设置。

struct termios

{tcflag t c iflag;

tcflag t c oflag;

tcflag t c cflag;

tcflag t c lflag;

cc t c cc[NCCS];

};

open() 函 数 :int fd=open(“/dev/ttyS *”,O RDWR|O NOCTTY|O NDELA Y);

然后调用read()和write()函数读写端口,返回实际读写的字节数,如果有错误发生则返回-1。

读取串口结束后,首先恢复串口原始属性,然后才可以关闭串口并退出程序。

3.3 串口控制应用程序

下面给出通过串口控制摄像头函数的一部分结构:

void sendMsg(int pan,int tilt)

{struct timeval timeout;

static char *driver=”/dev/ttyS1”;

timeout.tv_sec=0;

timeout.tv_usec=0;

formCmd(buf,pan,tilt);

fd=uart_open(driver,B9600);

write(fd,buf,16);

close(fd);

}

4 GPS与PDA的串口通信研究

4.1 参数获取、串口创建及初始化

在Win32中,串口和其他通信设备均被作为文件处理,串口的创建、打开、关闭和读写等操作所用的API函数与操作文件的函数相同。可通过CreateFile()函数创建或打开串口,并通过CloseFile()函数关闭串口,此外还可以设置串口状态。

部分源程序代码实现如下:

HANDLEhPort=INVALID_HANDLE_VAL2UE;//端口句柄

DCBPortDCB;

hPort=CreateFile(“COM7”,GENERIC_READ|

GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//打开COM7

SetupComm(hPort,512/3读缓冲3/,512/3写缓冲3/);//初始化通讯设备参数

if(!::GetCommState(hPort,&PortDCB))//获取串口当前属性参数

returnfalse;

PortDCB.BaudRate=4800;//设置波特率

PortDCB.StopBits=ONESTOPBIT;//设置停止位

PortDCB.Parity=NOPARITY;//设置奇偶校验位

if( ::SetCommState(hPort,&PortDCB)==0)//重设端口参数

returnfalse;

COMMTIMEOUTSCommTimeOuts;

CommTimeOuts.ReadIntervalTimeout=MAX2DWORD;//接 收两连续字节的最大时间间隔

CommTimeOuts.ReadTotalTimeoutMultiplier=10;//接收每字节的平均允许时间

CommTimeOuts.ReadTotalTimeoutConstant=1000;//接 收 时 间常数

SetCommTimeouts(hPort,&CommTimeOuts);//设置串口读写时间

PurgeComm(hPort,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);//对I/O进行设置

4.2 串口数据读取

在读取函数中可采取轮询串口和事件触发两种方式对数据进行接收处理。本文在此采取效率比较高的事件触发方式进行接收处理,通过指定端口监测并等待EV_RXCHAR事件的发生来启动ReadFile函数完成对GPS定位信息的接收任务。利用该函数从串口接收缓冲区中读取数据,通过一个循环使之不断读取GPS数据、写入文件直至读取结束或用户终止。在整个应用程序结束时,将串行设备关闭。部分源程序代码实现如下:

BYTEInByte;

DWORDBytesTransferred;DWORDfdwCommMask;

if(WaitCommEvent(hPort,&fdwCommMask,0))

SetCommMask(hPort,EV_RXCHAR);

bStopRead=false;

if(fdwCommMask&EV_RXCHAR){do

{ReadFile(hPort,&InByte,1,&BytesTransferred,0);

if(BytesTransferred==1)

ReadNMEA0183(InByte);//对串口读出数据进行解码

}while(!bStopRead&&1==BytesTrans2ferred);}

4.3 多线程设计

WindowsCE不支持重叠I/O,I/O操作函数在I/O操作结束前不能返回,这将挂起调用线程,直到I/O操作结束。使用多线程可以充分利用CPU资源,提高传输速度。在实现的过程中,对串口的读写可以定义在一个读线程函数中:

DWORDWINAPIReadThread(LPVOIDpvarg)。

5 结束语

本文介绍的GPS与PDA的串口通信软件可以嵌入到大部分的Palm OS的程序中,很好地完成现串口通信的基本任务。该串口通信软件现已集成在一家国外公司的自动售卡机产品中,且已投入使用。

猜你喜欢

波特率控件串口
UART 波特率检测电路的FPGA 设计算法与实现
浅谈AB PLC串口跟RFID传感器的通讯应用
基于.net的用户定义验证控件的应用分析
CAN 总线波特率自适应程序设计
关于.net控件数组的探讨
波特率自适应的CAN驱动在嵌入式Linux下的实现①
详解lAP15W4K58S4单片机的串行口通信
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
串口技术的实物调试和虚拟仿真联合教学模式