最近在做一个导航仪的检测工具,检测搜星时间和经纬度、dB值的一个小工具,第一次用VC++做串口通讯的程序,花了不少时间。昨天终于把程序调完了,今天来理一下,做一个总结,免得下一次又忘记。
首先是串口的初始化,因为师傅说不要用MScomm控件,所以就用API函数进行初始化。基本的方法就是创建文件的形式进行初始化: DCB dcb; COMMTIMEOUTS TimeOuts; hCom=CreateFile(L"COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); 然后获取串口状态,将状态百村在dcb中: GetCommState(hCom,&dcb); 接下来就是根据自己的硬件设置进行串口各个参数的设置: dcb.BaudRate=9600; dcb.ByteSize=8; dcb.Parity=NOPARITY; dcb.StopBits=ONESTOPBIT; dcb.fBinary=TRUE; dcb.fParity=FALSE; dcb.DCBlength=sizeof(DCB); SetCommState(hCom,&dcb); 然后要进行超时的设置: 最后要设置输入输出缓冲区的初始化: ———————————————————————————————————————————————— 在读取串口缓冲区的时候,也是用readfile函数,和文件操作一样的。 ———————————————————————————————————————— 我的程序主要功能还是对GPS信息的处理,要提取经纬度、漂移值、搜星时间等。 搜星时间指的是冷启动的时候GPS接收器搜到4颗星所用的时间,本机器标准是42秒之内,这样就要对GPRMC和GPGSV的字符串进行信息的提取。字符的处理一直是我和发愁的事情,这一次并没有用什么API库函数,基本上都是循环一个字符一个字符来处理的。根据逗号计数器来提取想要的数据,比较重要的是要设置一些标志变量,而且这些标志的赋值一定要在适当的位置。而且逗号计数器一定要在字符串开始和结束的时候清零。 —————————————————————————————————————————— 从缓冲区提取出来的字节型数据,判断的时候可以用相应的十六进制或是本身的字符,例如判断是否是逗号时可以用以下两种方法:if(buffer[i]==',')或是if(buffer[i]==0x2c)。在输出的时候,如果要直接输出接收的字符串,可以将每一个字节转化为CString类型,然后将它们加起来。例如要提取纬度,在第3个逗号时用Format函数将buffer[i+1]转化并赋值给已经定义好的CString变量。通过循环处理将9位纬度字节相加便可得到实际的纬度信息。 |
|
来自: bayji > 《Wince 串口》