Wince串口通信
(2011-01-24 10:08:39)
最近在做一個導航儀的檢測工具,檢測搜星時間和經(jīng)緯度、dB值的一個小工具,第一次用VC++做串口通訊的程序,花了不少時間。昨天終于把程序調完了,今天來理一下,做一個總結,免得下一次又忘記。
首先是串口的初始化,因為師傅說不要用MScomm控件,所以就用API函數(shù)進行初始化?;镜姆椒ň褪莿?chuàng)建文件的形式進行初始化:
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ù)的設置:
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);
然后要進行超時的設置:
GetCommTimeouts(hCom,&TimeOuts);
TimeOuts.ReadIntervalTimeout=MAXDWORD; //接收兩個連續(xù)字節(jié)最大時間間隔ms
TimeOuts.ReadTotalTimeoutMultiplier=MAXDWORD; //接收每兩個字節(jié)的平均允許時間
TimeOuts.ReadTotalTimeoutConstant=10000;
SetCommTimeouts(hCom,&TimeOuts);
最后要設置輸入輸出緩沖區(qū)的初始化:
SetupComm(hCom,1024,1024); //設置輸入輸出緩沖區(qū)
PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);//清空緩沖區(qū)
————————————————————————————————————————————————
在讀取串口緩沖區(qū)的時候,也是用readfile函數(shù),和文件操作一樣的。
————————————————————————————————————————
我的程序主要功能還是對GPS信息的處理,要提取經(jīng)緯度、漂移值、搜星時間等。
搜星時間指的是冷啟動的時候GPS接收器搜到4顆星所用的時間,本機器標準是42秒之內,這樣就要對GPRMC和GPGSV的字符串進行信息的提取。字符的處理一直是我和發(fā)愁的事情,這一次并沒有用什么API庫函數(shù),基本上都是循環(huán)一個字符一個字符來處理的。根據(jù)逗號計數(shù)器來提取想要的數(shù)據(jù),比較重要的是要設置一些標志變量,而且這些標志的賦值一定要在適當?shù)奈恢?。而且逗號計?shù)器一定要在字符串開始和結束的時候清零。
——————————————————————————————————————————
從緩沖區(qū)提取出來的字節(jié)型數(shù)據(jù),判斷的時候可以用相應的十六進制或是本身的字符,例如判斷是否是逗號時可以用以下兩種方法:if(buffer[i]==',')或是if(buffer[i]==0x2c)。在輸出的時候,如果要直接輸出接收的字符串,可以將每一個字節(jié)轉化為CString類型,然后將它們加起來。例如要提取緯度,在第3個逗號時用Format函數(shù)將buffer[i+1]轉化并賦值給已經(jīng)定義好的CString變量。通過循環(huán)處理將9位緯度字節(jié)相加便可得到實際的緯度信息。
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請
點擊舉報。