最近在做一個(gè)導(dǎo)航儀的檢測(cè)工具,檢測(cè)搜星時(shí)間和經(jīng)緯度、dB值的一個(gè)小工具,第一次用VC++做串口通訊的程序,花了不少時(shí)間。昨天終于把程序調(diào)完了,今天來理一下,做一個(gè)總結(jié),免得下一次又忘記。
首先是串口的初始化,因?yàn)閹煾嫡f不要用MScomm控件,所以就用API函數(shù)進(jìn)行初始化。基本的方法就是創(chuàng)建文件的形式進(jìn)行初始化: DCB dcb; COMMTIMEOUTS TimeOuts; hCom=CreateFile(L"COM1:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); 然后獲取串口狀態(tài),將狀態(tài)百村在dcb中: GetCommState(hCom,&dcb); 接下來就是根據(jù)自己的硬件設(shè)置進(jìn)行串口各個(gè)參數(shù)的設(shè)置: 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); 然后要進(jìn)行超時(shí)的設(shè)置: 最后要設(shè)置輸入輸出緩沖區(qū)的初始化: ———————————————————————————————————————————————— 在讀取串口緩沖區(qū)的時(shí)候,也是用readfile函數(shù),和文件操作一樣的。 ———————————————————————————————————————— 我的程序主要功能還是對(duì)GPS信息的處理,要提取經(jīng)緯度、漂移值、搜星時(shí)間等。 搜星時(shí)間指的是冷啟動(dòng)的時(shí)候GPS接收器搜到4顆星所用的時(shí)間,本機(jī)器標(biāo)準(zhǔn)是42秒之內(nèi),這樣就要對(duì)GPRMC和GPGSV的字符串進(jìn)行信息的提取。字符的處理一直是我和發(fā)愁的事情,這一次并沒有用什么API庫(kù)函數(shù),基本上都是循環(huán)一個(gè)字符一個(gè)字符來處理的。根據(jù)逗號(hào)計(jì)數(shù)器來提取想要的數(shù)據(jù),比較重要的是要設(shè)置一些標(biāo)志變量,而且這些標(biāo)志的賦值一定要在適當(dāng)?shù)奈恢?。而且逗?hào)計(jì)數(shù)器一定要在字符串開始和結(jié)束的時(shí)候清零。 —————————————————————————————————————————— 從緩沖區(qū)提取出來的字節(jié)型數(shù)據(jù),判斷的時(shí)候可以用相應(yīng)的十六進(jìn)制或是本身的字符,例如判斷是否是逗號(hào)時(shí)可以用以下兩種方法:if(buffer[i]==',')或是if(buffer[i]==0x2c)。在輸出的時(shí)候,如果要直接輸出接收的字符串,可以將每一個(gè)字節(jié)轉(zhuǎn)化為CString類型,然后將它們加起來。例如要提取緯度,在第3個(gè)逗號(hào)時(shí)用Format函數(shù)將buffer[i+1]轉(zhuǎn)化并賦值給已經(jīng)定義好的CString變量。通過循環(huán)處理將9位緯度字節(jié)相加便可得到實(shí)際的緯度信息。 |
|