《VC多线程串口通讯编程技术在GPS导航的应用介绍.pdf》由会员分享,可在线阅读,更多相关《VC多线程串口通讯编程技术在GPS导航的应用介绍.pdf(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、技 术在 GP S导航 的应用介 绍 张 九宴(武汉大学 G P S研究 中心4 3 0 0 7 9)摘 要:主要 阐述 了在 GP S导航 中,采 用多线程异步 串口通讯方式从 GP S接收 机 实 时读取 导航 定位 数据 的方 法和 过程。关 键词:串口通 讯,GP S,导航 1 引 言 GP S(G l o b a l P o s i t i o n i n g S y s t e m)又 称 全 球 定位系统。GP S定 位是通 过测定 用户 到卫 星之 间的距离从而确定用 户的位置的一种定位方法,在世界各 国有着广泛的应用。纵观 GP S的应用,总是和通讯技术紧密相连。从卫星星历发
2、播到差 分信息传送,以及从 GP S接收机实时读取数据均 和通讯有关。从 GP S接收机 实时读取数据使 用 的是串 口通讯技术,串口通讯技术一般应用 在实 时处理 中。GP S导航即是通过 GP S定位技术实 时给出用户所在的位置,这就要求 实时地 获取定 位数据,现在一般采用异步 串 口通讯方法。GP S 接收机和计算机按串行的方式进行通讯,这种通 讯方式使用的数据线少,但其传输速度比并行慢。采用多线程技术,即开设一辅助线程用 于读取数 据,这样可以避免读写阻塞时主程序死锁。2 串 口通讯 的基 本原理 串行端 口的本质功 能是作 为 C P U 的串行设 备间的编码转换器。当数 据从 C
3、 P U 经过串行端 口发送出去时,字节数 据转换为 串行 的位。在接 收数据时,串行的位被转换为字节数据。在 wi n d o ws 环 境(Wi n d o ws NT、wi n d o ws 9 8、Wi n d o ws 2 0 0 0)下,串 口是系统资源 的一部分。应 用程度使用 串口进行通信,必须在使用 之前 向操 作系统提出资源 申请要 求(打开串 口),通 信完成 后必须释放资源(关闭串口)。3 使 用 多线程 串 口编 程读 取 数 据 的 实现过程 3 2位 串 口通 信 可 以用 两种 方法 实 现:利 用 Ae t i v e X控件和 AP I 通信函数。这里主要介
4、绍使 用 AP I 通信 函数,因为用 AP I 通信函数虽然复杂 一点但 比控件灵活。1)定 义 变量 HAND L E h P o r t;准备打开 的串口的句 柄 H AND L E h C o mmWa t e h T h r e a d:辅 助 线程 的全局函数 上面的变量可在 Ma i n F r m e p p中定 义成全 局变量,也可在 自己定义的类 中定义为类的变量,通 过类 的对 象 引用。2)打 开 串 口 h P o r t=C r e a t e F i l e(“C O M2”,待打开的串口,2 0 0 2 6 全 球定位 系统2 1 维普资讯 http:/ 可 自
5、选 GE NE R I C RE AD J GE NE RI C WR I TE,允许读写 0,共享方式,此项必须 为 0 NUL L,指向安全属性的指针 OP E N E XI S TI NG,设置产生方式 F I L E F L AG O VE RL AP P E D,我们准备 使用异步通信,必须这样设置 NUL L);模板文件句柄,必须为 NUL L 上 面 的 函数 功 能是:用 异 步通 讯方 式 打 开 C OM2串 口,返 回 串 口 的 句 柄,如 果 要 打 开 C OM1,将 C OM2换成 COM1即可。3)配 置 串 口 打开串 口后还需要检测串 口是否被成功 的打 开
6、。如果打开成功则对 串口进行设置,否则退出。AS S ERT(h P o r t!一 I NVALI DH ANDLE VAL UE);检测打开串 口操作是否成功 D C B d c b;定义数据控制块结构 Ge t C o mmS t a t e(h P o r t,&d c b);读串 口原 来 的参数设置 下面是对 串口原来的参数进行重新设置。d c b B a u d Ra t e 一9 6 0 0;读取 数 据 的 波特 率,可改,如 4 8 0 0等。d c b B y t e S i z e=8;数据位数 d c b P a r i t y=NOP AR I TY;奇偶校验位 d
7、 c b S t o p B i t s=0 NE S T OP B I T d c b f B i n a r y=TR UE二进制 控制,必须 为 TR UE d c b f P a r i t y=F AL S E;奇偶校 验控 制,此 处奇偶无效 S e t C o mmS t a t e(h P o r t,&d c b);串 口参数 配置为上述的参数是对 D C B结构处置,实际工作 要 根据通信协议选择上述参数。4)对 接收 机进 行 设置 对接收机进行设置,即通过对 串口写命令,设 置输 出数据格式,定位模式,数据传输 速率,输 出 的电文类型等参数。不同型号的接收机命令不尽
8、相同,必须仔细阅读接收机 的说 明书。后面将介 绍向串 口写数据的函数。5)启动一个辅助线程,处理 串口事件 h Co m m W a t c h Thr e a d:=Cr e a t e Thr e a d (LP SE CURI TYAT TRI B UTE S)NUL L,安 全 属性 2 2 GP swo r l d o f c h i n a 2 0 0 2 6 0,初始化 线程栈 的大小,缺省 为与 主线程 大小 相同(LP THREAD S TART ROUTI NE)Fi l e Re a d Th r e a d,线程的全局函数 Ge t S a f e Hwn d(),此
9、处传人 了主框架 的句 柄 0,线程创建控制标志,缺省为零&d wTh r e a d l D);线程标识 上 函 数 启 动 了 一 辅 助 线 程,执 行F i l e R e a d Th r e a d()的功能,让读取数据在后 台进行,F i l e R e a d T h r e a d()必 须 定义 为 全局 函数。6)编写辅助 函数 F i l e Re a d Th r e a d(),读 取数 据 真正读 取 数据 功 能是 通过 F i l e Re a d Th r e a d ()函数实现 的。下 面是 使用重叠方式读取 串 口 数据 的实现代码。Fi l e Re
10、 a d Th r e a d(HWND h S e n d Wn d)DW ORD i Go t=0:u n s i g n e d c h a r I n B u f f e r -2 0 0 0 3;存放 读人 数据 的字符数组 OVE RL AP P E D o s R e a d e r 一 0);读 串 口 的重叠结构 HANDL E Wa i t E v e n t-2 ;等待事件 B OOL b C o n t i n u e Re a d=TR UE 是否继续 读串 口 DWORD d wRe s;等待事件的结果 C OMS TAT l p S t a t;串口设备状态信息
11、创建重事件结构中的事件句柄 o s Re a d e r h Ev e n t Cr e a t e Ev e n t(NULL,TRUE,F ALS E,NULL);Wa i t E v e n t-0 一o s Re a d e r h E v e n t wh i l e(h P o r t I I NVALI DH ANDLE VALUE)f i f(b Co n t i n u e Re a d)读数据,即接收数据 Re a d Fi l e(p mo t p o r t h Po r t,I n Bu f f e r,1,&i Go t。&o s Re a d e r)e l s
12、e b C o n t i n u e Re a d=F AL S E,延迟读到数据 重叠读数据 i f(!b Co n t i n u e Re a d)检测等待事件的状态 彗 幽。维普资讯 http:/ d wRe s W a i t Fo r Mu l t i p l e Ob j e c t s(1,W a i t E v e n t,F ALS E,2 0 0 0);s wi t c b(d wRe s)c a s e WAI T OB J E C T 0 奄 号 获取重叠操作的结果,成功则返回非零值 Ge t Ov e r l a p p e d Re s u l t(h P o
13、r t,&o s Re a d e r,&i Go t,FALS E);b Co nt i nu e Re a d TRU E;b r e a k;c a s e WAI T TI ME OUT:超时 br e a k;d e f a u l t:Cl e a r Co mm Er r or(p m o t pr o t hPo r t,i G o t,&l p S t a t);清除串口发生 的错误 br e a k;Cl o s e Ha n d l e(o s Re a d e r h Ev e n t);r e t u r n(0);7)在主线程 中向串口写数据发送命令 下面 的代码是
14、实现 向串 口发送数据,发数据 和接收数据相似。DW ORDW r i t e Co mm(HANDL E h Co m,L PVOl D p Bu f,DW ORD d wW r i t e,DW ORD n Ti me)如果 串口句柄无效 i f(h Co m 一 一 I NVAL I DHAN DLE VAL UE l l h C o m=一NUL L)设置最后 的返 回的错误代码非法 的 串 口句柄错误 Se t La s t Er o r(ERRORI NVALI D HANDLE);r e t u r n 0;i f(d wWr i t e=一0 l l d wWr i t e 2
15、 0 4 8)设置最后的返 回的错误代码无效的数 据 S e t La s t Er r o r(ERRORI NVA LI DDA TA);r e t u r n 0;如果数据缓冲区指针为空 i f(p Bu f=NULL)设置最后 的返回的错误代码 无效 的参 数 S e t La s t Er r o r(ERROR I NVALI D PA RAM E I ER);r e t u r n 0;DWO RD d wWr i t t e n一0,d wR e s;总共 发 送的数据和重叠事件返 回的结果 OVE RL AP P E D o s Wr i t e=0 ;写文件 的 重 叠结
16、构 C OMS T AT l p S t a t;串 口设备状态信息 创建事件结构中的事件句柄 O S W r i t e h Ev e n tCr e a t e Ev e n t(NULL,TRUE,FALS E,NULL);创建重事件句柄没有成功 i f(o s W r i t e h Ev e n t=一 NULL)r e t u r n 0;发送数据到 串口 i f(!W r i t e Fi l e(h Co m,p Bu f,d wW r i t e,&d wWr i t t e n,&o s W r i t e)i f(Ge t La s t Er r o r()一 一 ERR
17、OR I O PE NDI NG)采用重叠方式发送 d wRe s=W a i t Fo r Si n g l e Ob j e c t(o s Wr i t e hE v e n t,n Ti me);s wi t c h(d wRe s)获取重叠读串口数据 的结果 c a s e W AI T OB J ECT 0;S e t La s t Er r o r(E RROR S UCCE S S);Ge t Ov e r l a p p e d Re s u l t(h Co m,&o s W r i t e,&d wW r i t t e n,FALSE);br e a k;c a s e
18、 WAI T TI ME OUT:超时 br e a k;d e f a u l t:清除串口发 生的错误 l e a r Co mmEr r o r(h Co m,&d wW r i t t e n,&l p S t a t):b r e a k;Cl o s e Ha n d l e(o s W r i t h Ev e n t);r e t u r n d wWr i t t e n;8)关 闭 串口和 线 程 Cl o s e Ha n d l e(h Co mmW a t c h Th r e a d);Cl o s e Ha n d l e(h Po r t);应用程序结束之前执行
19、此项操作,可在 Vi e w 类 的 O n D e s t r o y()函数中执行。(下转 第 5 3页)2 0 0 2 6 全球定位 系统2 3 维普资讯 http:/ Zue r c h e r s t r a s s e 68 8 8 0 0 Th a l wi l。S wi t z e r l a n d Ph o n e:+4 1 1 7 2 2 7 4 6 2 Fa x:+4 1 1 7 2 2 7 4 4 7 E ma i l:s a l e s u-b l o x c o m WWWu-bl o x c o m Vet r on i x Cor po r a t i on
20、2 0 3 0 Al a m e d a Pa dr e Se r r a S an t a Ba r ba r a,Ca l i f o r n i a 9 31 03 1 71 6 P h o n e:8 0 0 9 6 6 2 0 0 0 0 Fa x:8 05 9 6 5 3 49 7 E-ma i l:d p e t e r s o n v e t r o n i x C Om WWW ve t r oni x c o m Vi n di go 2 59 W e s t 3 ot h St,4 t h Fl o or Ne w Yo r k。Ne w Yo r k 1 0 01 Ph
21、o ne:2 1 2-59 0-6 90 0 Fa x:2 1 2-59 0 69 9 9 E ma i l:b i z d e v we b v i n d i g o:COm WWW v i nd i go c o m W e br a s k a 22,r ue Gu yne m e r B P1 0 7,7 8 6 02 M a i s o ns-La f f i t t e Ce d ex,Fr a nc e P h o n e:+3 3 1 3 9 1 2 8 8 0 0 F a x:+3 3 1 3 9 1 2 8 8 8 8 E-ma i l:i n f o we b r a
22、s k a c o m WWW we br a s ka c o m wh er eo n ea r t h Roy e x Hous e,A l de r m a nbur y Sq ua r e,Lon don SE1 6 4 PA,Uni t e d Ki n gd om Pho ne:0 2 07 24 61 4 0 0 Fa x:0 2 07 24 61 4 01 E-ma i l:e n q u i r i e s wh e r e o n e a r t h c om WWW whe r e o ne a r t h c o m W h er i f y W i r el es
23、s 2 0 0 0 Br i d g e P a r k wa y,S u i t e 2 0 1 Re d wo o d S h o r e s Ca l i f o r n i a 9 4 06 5 Phon e:6 50-5 5 1-52 0 0 Fax:6 50 5 5 1 52 2 5 E-ma i l:i n f o wh e r i f y c o m www whe r i f y c om(上接 第 2 3页)4 结束语 上述是用多线程编程技术进行 串口通信的过 程和代码,能实现 GP S接收机和计算机之间实时 的通信,从而 实现 导航 功能。所有 的串 口通信 的 问题 都
24、可 用上 述 方法。参考 文献 1 王广运,郭秉 义,“差 分 GP S定位技术 与应 2 3 4 用”,电子 式 业 出版社,1 9 9 6 E u g e n e Ol a f s e n等著 “MF C Vi s u a l C+6编程技术 内幕”,机械工业 出版社,2 0 0 0 G0F T0N P W“精 通 串行 通 信”,北 京:电 子 工 业 出版 社,1 9 9 5 张力,吕振 肃,赵 庆林,“VC 十+下行 串通 信 的编程 方 法”,计 算机 应 用,1 9 9 9(3)Appl i c a t i o n o f VC mu l t i t hr e a d j ng
25、s e r i a l c o mmu ni c a t i o n p r o g r a mmi n g i n GPS n a v i g a t i o n ZHANG J i u y a n (GPS Re s e a r c h Ce n t e r,Wu h a n Un i v e r s i t y 4 3 0 0 7 9)Ab s t r a c t:Thi s pa p e r de s c r i be s t he m e t hod a nd p r oc e s s of ob t a i ni n g n a vi ga t i on d a t um f r o m t he r e c e i v e r b y mu l t i t h r e a d i n g s e r i a l c o mmu n i c a t i o n p r o g r a mmi n g t e c h n o l o g y Ke y wo r d s:s e r i a l c omm un i c a t i on,GPS,na v i ga t i on 2 0 0 2 6 全 球定位 系统5 3 维普资讯 http:/
限制150内