串口調(diào)試助手代碼分析3_第1頁
串口調(diào)試助手代碼分析3_第2頁
串口調(diào)試助手代碼分析3_第3頁
串口調(diào)試助手代碼分析3_第4頁
串口調(diào)試助手代碼分析3_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——串口調(diào)試助手代碼分析3第5章串口調(diào)試助手代碼分析1、建立基于對話框的工程SCOMM2、繪制界面,如下圖:

接收區(qū)

串口組合框:IDC_COMBO_COMSELECT,m_Com波特率組合框:IDC_COMBO_SPEED,m_Speed

中止位組合框:IDC_COMBO_STOPBITS,m_StopBits數(shù)據(jù)位組合框:IDC_COMBO_DATABITS,m_DataBits校驗(yàn)位組合框:IDC_COMBO_PARITY,m_Parity十六進(jìn)制顯示(接收):IDC_CHECK_HEXRECIEVE,m_ctrlHexReceieve接收編輯框:IDC_EDIT_RECIVE,m_ReceiveDatam_ctrlReceiveDataStyle:VerticalScrollMultiLine

開啟串口IDC_BUTTON_OPENPORT,m_ctrlOpenPort

串口開關(guān)標(biāo)志圖標(biāo)IDC_STATIC_OPENOFF,m_ctrlIconOpenoff數(shù)據(jù)文件保存路徑IDC_EDIT_SAVEPATH,m_strCurPath

保存顯示數(shù)據(jù)文件路徑IDC_EDIT_SAVEPATH,m_ctrlSavePath接收計(jì)數(shù)IDC_STATIC_RXCOUNT,m_ctrlRXCOUNT

發(fā)送區(qū)

…。。。。。。。。。。。。。。

3、添加CSeraiPort類文件

將類文件SerialPort.hSerialPort.cpp復(fù)制到工程所在文件夾中(選擇改進(jìn)

后的類),然后單擊VC6.0菜單Projrct->AddtoProjrct->Files…,再在開啟的文件選擇對話框中選擇SerialPort.h和SerialPort.cpp,點(diǎn)擊OK,就把類文件參與當(dāng)前工程,并在SCOMMDlg.h中參與頭文件,#include\,通過上述步驟就在當(dāng)前工程中參與了CSeraiPort類。4、完成串口消息處理函數(shù)OnCommunicatiom

在CserailPort類中有多個(gè)串口事件可以響應(yīng)。在一般串口編程中,只需要處理WM_COMM_RXCHAR消息就可以了,該類所有的消息均需要人工添加消息處理函數(shù)。我們將處理函數(shù)名定義為OnComm()。首先在SCOMMDlg.h中添加串口字符接收消息WM_COMM_RXCHAR(串口接收緩沖區(qū)內(nèi)有一個(gè)字符)響應(yīng)函數(shù)的聲明:如下圖

然后,在SCOMMDlg.cpp文件中進(jìn)行WM_COMM_RXCHAR消息映射:如下圖;

接著,在SCOMMDlg.cpp文件中參與函數(shù)OnCommunication(WPARAMch,LPARAMport)的實(shí)現(xiàn),暫不添加代碼。

LONGCSCOMMDlg::OnCommunication(WPARAMch,LPARAMport){

return0;}

以上步驟需要手工完成。

至此完成了程序的對話框模板,在工程中插入了串口操作類CserailPort類。

5、添加串口初始化及關(guān)閉

程序中有兩種方法大開串口,一是程序啟動(dòng),調(diào)用OnInitDialog()函數(shù),就可以開啟串口,缺少的串口號為COM1,假使COM1不存在或占用,就會(huì)給出提醒;另外,單擊“開啟串口〞按鈕也可以開啟串口。//在初始化中開啟串口

BOOLCSCOMMDlg::OnInitDialog(){

m_nBaud=9600;//波特率m_nCom=1;//串口號m_cParity='N';//奇偶校驗(yàn)

m_nDatabits=8;//數(shù)據(jù)位m_nStopbits=1;//中止位

m_dwCommEvents=EV_RXFLAG|EV_RXCHAR;//串口事件//if(m_Port.InitPort(this,1,9600,'N',8,1,dwCommEvents,512))CStringstrStatus;

if(m_Port.InitPort(this,m_nCom,

m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512))//假使啟動(dòng)串口成功{m_Port.StartMonitoring();//啟動(dòng)監(jiān)測輔助線程strStatus.Format(\:COM%dOPENED,%d,%c,%d,%d\m_nBaud,m_cParity,m_nDatabits,m_nStopbits);//打印串口狀態(tài)及參數(shù)m_ctrlIconOpenoff.SetIcon(m_hIconRed);//m_ctrlIconOpenoff.SetIcon(m_hIconOff);//\當(dāng)前狀態(tài):串口開啟,無奇偶校驗(yàn),8數(shù)據(jù)位,1中止位\}

else//假使啟動(dòng)失敗{AfxMessageBox(\沒有發(fā)現(xiàn)此串口\m_ctrlIconOpenoff.SetIcon(m_hIconOff);}

m_ctrlPortStatus.SetWindowText(strStatus);//顯示串口的狀態(tài)及參數(shù)returnb;}

6、在ClassWizard中為按鈕“開啟串口〞控制IDC_BUTTON_OPENPORT添加單擊響應(yīng)函數(shù)。//開啟,關(guān)閉串口

voidCSCOMMDlg::OnButtonOpenport(){

//TODO:Addyourcontrolnotificationhandlercodeherem_bOpenPort=!m_bOpenPort;//取反if(m_bOpenPort)//關(guān)閉串口{if(m_ctrlAutoSend.GetCheck()){m_bOpenPort=!m_bOpenPort;AfxMessageBox(\請先關(guān)掉自動(dòng)發(fā)送\return;}m_ctrlOpenPort.SetWindowText(\開啟串口\m_Port.ClosePort();//關(guān)閉串口m_ctrlPortStatus.SetWindowText(\:COMPortClosed\

m_ctrlIconOpenoff.SetIcon(m_hIconOff);}

else//開啟串口{m_ctrlOpenPort.SetWindowText(\關(guān)閉串口\CStringstrStatus;if(m_Port.InitPort(this,m_nCom,

m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512)){m_Port.StartMonitoring();m_ctrlIconOpenoff.SetIcon(m_hIconRed);//m_hIconRed;串口開啟時(shí)的紅燈圖標(biāo)句柄

strStatus.Format(\:COM%dOPENED,%d,%c,%d,%d\m_nBaud,m_cParity,m_nDatabits,m_nStopbits);//\當(dāng)前狀態(tài):串口開啟,無奇偶校驗(yàn),8數(shù)據(jù)位,1中止位\}else//假使沒有開啟串口成功{AfxMessageBox(\沒有發(fā)現(xiàn)此串口或被占用\m_ctrlIconOpenoff.SetIcon(m_hIconOff);//m_hIconOff串口關(guān)閉時(shí)的紅燈指示圖標(biāo)句柄}m_ctrlPortStatus.SetWindowText(strStatus);}}

7、為了在程序關(guān)閉時(shí)通過關(guān)閉串口并釋放占用資源,在ClassWizard中為CSCOMMDlg添加了WM_DISTROY的消息響應(yīng)函數(shù)OnDestroy(),函數(shù)在主窗口即將銷毀時(shí)調(diào)用。

//為主窗口關(guān)閉時(shí)添加關(guān)閉響應(yīng)函數(shù)voidCSCOMMDlg::OnDestroy(){

CDialog::OnDestroy();

m_ctrlAutoSend.SetCheck(0);//強(qiáng)行關(guān)閉自動(dòng)發(fā)送KillTimer(1);//關(guān)閉定時(shí)器KillTimer(4);

m_Port.ClosePort();//關(guān)閉串口

m_ReceiveData.Empty();//清空接收數(shù)據(jù)字符串}

8、十六進(jìn)制數(shù)據(jù)發(fā)送處理

首先為CSCOMMDlg類添加兩個(gè)成員函數(shù)Str2Hex()和HexChar,前者對后者進(jìn)行了調(diào)用,Str2Hex()的作用是將一個(gè)字符串作為十六進(jìn)制轉(zhuǎn)化為一個(gè)字符組,其中,data即為返回的數(shù)組,函數(shù)的返回值為data數(shù)組的長度。

//將一個(gè)字符串作為十六進(jìn)制轉(zhuǎn)化為一個(gè)字符數(shù)組,字節(jié)間可用空格分隔,//返回轉(zhuǎn)換后的字節(jié)數(shù)組長度,同時(shí)字節(jié)數(shù)組長度自動(dòng)設(shè)置intCSCOMMDlg::Str2Hex(CStringstr,char*data){

intt,t1;

intrlen=0,len=str.GetLength();//data.SetSize(len/2);for(inti=0;i=len)break;l=str[i];t=HexChar(h);t1=HexChar(l);if((t==16)||(t1==16))

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論