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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第5章串口調試助手代碼分析1、建立基于對話框的工程SCOMM2、繪制界面,如下圖:接收區(qū)串口 組合框:IDC_COMBO_COMSELECT, m_Com波特率組合框:IDC_COMBO_SPEED, m_Speed停止位組合框:IDC_COMBO_STOPBITS, m_StopBits數據位組合框:IDC_COMBO_DATABITS, m_DataBits校驗位組合框:IDC_COMBO_PARITY, m_Parity十六進制顯示(接收):IDC_CHECK_HEXRECIEVE, m_ctrlHexReceieve 接收編輯框:IDC_EDIT_RECIVE , m_ReceiveD

2、ata m_ctrlReceiveDataStyle : Vertical Scroll MultiLine打開串口 IDC_BUTTON_OPENPORT, m.ctrlOpenPort串口開關標志圖標 IDC _STATIC_OPENOFF,m_ctrIIconOpenoff數據文件保存路徑 IDC _EDIT_SAVEPATH, m_strCurPath保存顯示數據文件路徑 IDC _EDIT_SAVEPATH, m_ctrlSavePath接收計數 IDC_STATIC_RXCOUNT , m_ctrlRXCOUNT發(fā)送區(qū)3、添加CSeraiPort類文件將類文件SerialPort.

3、h SerialPort.cpp復制到工程所在文件夾中(選擇改進后的 類),然后單擊 VC6.0 菜單 Projrct -> Add to Projrct ->Files. 在打開的文件 選擇對話框中選擇SerialPort.h和SerialPort.cpp,點擊OK,就把類文件加入當前 工程,并在SCOMMDlg.h中加入頭文件,include ,SerialPort.hn,通過上述步 驟就在當前工程中加入了 CSeraiPort類。4、完成串口消息處理函數OnConmnmicatiom在CserailPort類中有多個串口事件可以響應。在一般串口編程中,只需要處理 WM_COM

4、M_RXCHAR消息就可以了,該類所有的消息均需要人工添加消息處理 函數。我們將處理函數名定義為OnComm ()。首先在SCOMMDlg.h中添加串 口字符接收消息WM_COMM_RXCHAR (串口接收緩沖區(qū)內有一個字符)響應函 數的聲明:如下圖oool r Npetftrt; HICOH Rubicon;/ Gnirratffd nrssiigr furKtisns /< < ftFX_«c( cscn kiw 1 g)K OnrilcSeiKlingEMJedCrAiKAH wParanLPRRfiM port);然后,在SCOMMDlg.cpp文件中進行WM_C

5、OMM_RXCHAR消息映射:如下圖;8EC1H_MEXSACE_I«F( CSCOIMlg .>/< KtC Nftl'CCKCOHM) Io >JIXIHT! V_trilC7(®. 0UiI “辦“ 1耐胡記)QN MW SYSCCMMRfVO nu MM BA I MT/ %接著,在 SCOMMDlg.cpp 文件中加入函數 OnCommunication'VPARAM ch,LPARAM port的實現,暫不添加代碼。LONG CSCOMMDlg:OnCommunlcation(WPARAM ch, LPARAM portretu

6、rn 0;以上步驟需要手工完成。至此完成了程序的對話框模板,在工程中插入了串口操作類CserailPort類。5、添加串口初始化及關閉程序中有兩種方法大開串口,一是程序啟動,調用OnlnitDialog ()函數,就可以 打開串口,缺少的串口號為COM1,如果COM1不存在或占用,就會給出提示;另 外,單擊“打開串口''按鈕也可以打開串口。在初始化中打開串口BOOL CSCOMMDlg: :OnInitDialog(m_nBaud=9600;/ 波特率m_nCom=l;/串 口號m_c Parltj'N*;奇偶校驗m_nDatabits=8;/ 數據位m_nStopbi

7、ts=l; 停止位m_dwCoinmEvents = EV_RXFLAG I EV_RXCHAR;串 口事件/if (m_Port.InitPort(this, 1,9600,*N,8,l,dwCommEventsl2CString strStatus;if(m_Port.InltPort(this,m_nCoin, m_nBaiid,m_cParity,m_nDatabits,m_nStopbits,m_dwCoinmEvents,512/ 如果啟動 串口成功m_Port StartMonitoring(;/ 啟動監(jiān)測輔肋線程strStatus.FormatCTATUS : COM%d OP

8、ENED, %d,%c,%d,%dn,m_nCoin, m_nBaud,m_cParity,m_nDatabits,in_nStopbits; 打印串 口狀態(tài)及參數m_ctrlIconOpenoff.SetIcon(m_hIconRe(l;/m_ctrlIconOpenofT.SetIcon(m_hIconOff;”當前狀態(tài):串口打開,無奇偶校驗,8數據位,1停止位“;else/如果啟動失敗AfxMessageBox沒有發(fā)現此串口 H;m_ctrlIconOpenoff.SetIcon(mJiIconOff;m_ctrlPortStatus.SetWindowText(strStatus; 顯

9、示串口 的狀態(tài)及參數return b;6、在Class Wizard中為按鈕“打開串口”控制IDC_BUTTON_OPENPORT添加單擊 響應函數。打開,關閉串口void CSCOMMDlg: :OnButtonOpenport(/ TODO: Add vour control notification handler code herem_bOpenPort=!m_bOpenPort; 取反if(m_bOpenPort 關閉串口if(m_ctrlAutoSend.GetCheck(m_bOpenPort=!m_bOpenPort;AfxMessageBoxC-it先關掉自動發(fā)送”;retu

10、rn;m_ctrlOpenPort.SetWindowText(H 打開串口 H;m_Port.ClosePort(;/ 關閉串口in_ctrlPortStatus.SetWindowText(HSTATUS : COM Port Closed1*;m_ctrlIconOpenoff.SetIcon(m_hIconOff;else /打開串口m_ctrlOpenPort.SetWindowText(n 關閉串口 n;CString strStatus;lf(m_Port.InitPort(this,m_nCom,m_nBaud,m_cParity4n_nDatabits,m_nStopbits

11、3n_dwCommEvents,512m_Port.StartMonitoring(;m_ctrlIconOpenoff.SetIcon(m_hIconRed;/ m_hIconRed;串 口打開時的紅燈圖標句柄strStatus.FormatCTATUS : COM%d OPENED, %d,%c,%(l,%d,m_nCom, m_nBaud,m_cParity4n_nDatabitsm_nStopbits;”當前狀態(tài):串口打開,無奇偶校驗,8數據位,1停止位“;else/如果沒有打開串口成功AfxMessageBox(H沒有發(fā)現此串口或被占用”;m_ctrlIconOpenoff.SetI

12、con(m_hIconOff; / m_hIconOff 串 口關閉時的紅燈指示圖標句 柄m_ctrlPortStatus.SetWindowText(strStatus;7、為了在程序關閉時通過關閉串口并釋放占用資源,在ClassWizard中為 CSCOMMDlg添加了 WM_DISTROY的消息響應函數OnDestroy (),函數在主 窗口即將銷毀時調用。為主窗口關閉時添加關閉響應函數void CSCOMMDlg:OnDestroy(CDialog:OnDestroy(;ni_ctrlAutoSend.SetCheck(O; 強行關閉自動發(fā)送KillTimerd;/關閉定時器KillT

13、imer(4;m_Port.ClosePort(; /關閉串口m_ReceiveData.Empty(; 清空接收數據字符串8、十六進制數據發(fā)送處理首先為CSCOMMDlg類添加兩個成員函數Str2Hex ()和HexChar,前者對后者 進行了調用,StrlHex ()的作用是將一個字符串作為十六進制轉化為一個字符 組,其中,data即為返回的數組,函數的返回值為data數組的長度。將一個字符串作為十六進制轉化為一個字符數組,字節(jié)間可用空格分隔,返回轉換后的字節(jié)數組長度,同時字節(jié)數組長度自動設置int CSCOMMDlg: :Str2Hex(CString str, char* datain

14、t t,tl;int rlen=O,len=str.GetLength(;/data.SetSize(leii/2;for(int i=0;ichar l,h=stri;if(h" 7/如果有空格i+;continue;/跳出本次循環(huán),進入下次循環(huán)i+;if(i>=lenbreak;l=strIJ;t=HexChar(h;tl=HexChar(l;if(t=16ll(tl=16break;elset=t*16+tl;i+;datarlen=(chart;rlen+;return rlen;char CSCOMMDlg:HexChar(char cif(c>-0&&

15、amp;(c<=f9freturn c-0x30;else lf(c>=fAf&&(c<= Ffreturn cA'+10;else lf(c>=,a,&&(c<=Treturn ca'+10;elsereturn 0x10;9、手動發(fā)送處理在ClassWizard中為手動發(fā)送按鈕IDC_BUTTON_、IANUALSEND添加單擊處理 函數(或直接在對話框模板中雙擊該控件),在OnButtonManualsend(t添加如下 代碼:long TX_count=0;void CSCOMMDlg:OnButtonMan

16、ualsend(/ TODO: Add your control notification handler code hereif(m_Port.m_hComm=NULL/發(fā)送時要檢驗串口是否打開,否則會出錯m_ctrLutoSend.SetCheck(0;AfxMessageBoxC'串口沒有打開,請打開串口“;return;elseUpdateData(TRUE;lf(m_ctrlHexSend.GetCheck(/發(fā)送十六進制數據char data512;int len=Str2Hex(m_strSendData,data;m_Port.WriteToPort(data,len;

17、TX_count+=(long(m_strSendData.GetLength(+l/3;/計數發(fā)送的十六進制數據,注意這里的計算方法,只有嚴格按照規(guī)則輸入才能正確計算/m_Port. W riteToPort(hexdata;else 發(fā)送ASCII文本m_Port.WriteToPort(LPCTSTRm_strSendData;/ 發(fā)送數據TX_count+=m_strSendData.GetLength(; 發(fā)送計數CString strTemp;strTemp.Forma tC' TX: % d ” ,TX_count;m_ctrlTXCount.SetVVIndowText

18、(strTemp;/ 顯示計數1()、自動發(fā)送處理自動發(fā)送時,需要用到定時器。打開ClassWizard,為CSCOMMDlg類添加 WM.TIMER消息處理函數OnTimer (UINT nIDEvent)。需要注意的是,在 VC6.0中,每個定時器都有自己的ID號,所有定時器處理均要在該函數中,因 此,必須事先為相應的定時器設置ID號,OnTimer (UINT nIDEvent)函數則根 據調用的nIDEvent值來確定是哪個定時器的定時時間到,再做相應的處理。void CSCOMMDlg:OnTimer(UINT nIDEvent/ TODO: Add your message han

19、dler code here and/or call defaultCString strStatus;switch(nIDEventcase 1:/定時器ID=1為自動發(fā)送時間到OiiButtonManualsenclf;/調用手動發(fā)送處理函數break;case 2:/其他定時器m_ctrlSavePath.SetWindowText(m_strCurPath;KillTiiner(2;break;case 3:in_ctrlManualSen(LEnableWindow(TRUE;m_ctrlAutoSend.EnableWindow(TRUE;m_ctrlSendFile.Enable

20、Winclow(TRUE;m_strSendFilePathName=m_strTeinpSendFilePathName;in_ctrlEditSendFlle.SetWindowText(m_strSendFllePathName;/m_strSendFilePath NameKillTlmer(3;lf(!(m_ctrlAutoSend.GetCheck(if (m_PortJnitPort(this, ncnConi, m_nBaud,m_cParlty,m_nDatabitsjn_nStopbitsjn_dwCoinmEvents512m_Port .StartMonitorl ng

21、(;strStatus.Format(' STATUS : COM%d OPENED, %d,%c,%d,%d,m_nCom, m_iiBaud,m_cParlty,m_nDatabitsjn_nStopblts;m_ctrlIconOpenoff.SetIcon(mJiIconRed;elseAfxMessageBox(HFailed to reset send buffer slze!H;m_ctrlIconOpenoff.SetIcon(mJiIconOff;m_ctrlPortStatus.SetWindowText(strStatus;break;case 4:m_aniin

22、Icon.ShowNextImage(;break;default:break;CDialog:OnTimer(nIDEvent;我們再來看看如何設置定時器1,在ClassWizar中,為自動發(fā)送選項 IDC_CHECK_AUTOSEND添加響應函數OnCheckAutosend(,或者在對話框模 板中直接雙擊該控件。在OnCheckAutosend沖添加如下代碼:void CSCOMMDlg: :OiiCheckAiitosend(/ TODO: Ack! your control notification handler code here m_bAutoSend=!m_bAiitoSen

23、(l; 標志是否打開自動發(fā)送 lf(m_bAutoSendif(m_Port.mJiComm=NULLm_bAutoSend=!m_bAutoSend;m_ctrlAutoSend.SetCheck(0;AfxMessageBoxC串口沒有打開,請打開串口 “;return;elseSetTimer(l,m_nCycleTime,NULL; /i§置定時器 1,啟動Else/如果自動發(fā)送標志沒有打開KillTimerd;/關掉定時器1在自動發(fā)送時,如果輸入編輯框中的內容改變時,要及時將串口發(fā)送的內容改 變,在ClassWizar中編輯框IDC_EDIT_SEND添加響應函數。void

24、 CSCOMMDlg: :OnChangeEditSend(/ TODO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDIalog:OnInitDialog(/ function and call CRIcliEditCtrl(.SetEventMask(/ with the ENM_CHANGE flag ORed into the mask./ TODO: Add vour control notification handler

25、code hereUpdateData(TRUE;同樣,當自動發(fā)送周期改變后,也需要將發(fā)送周期更新,但實際的發(fā)送周期需要重 新用SetTin)er(函數對定時器的定時間進行設置,在這個程序里,必須先關閉串口 的“自動發(fā)送”然后再打開,新設的自動發(fā)送周期才能生效。void CSCOMMDlg:OnChangeEditCycletime(/ TODO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDialog:OnInitDialog(/ f

26、unction and call CRichEditCtrl(.SetEventMask(/ with the ENM_CHANGE flag ORed into the mask-/ TODO: Add vour control notification handler code hereCEdit* pEdit=(CEdit*GetDIgItem(IDC_EDIT_CYCLETIME;CString strText;pEdit->GetVVIndowText(strText;m_nCycleTime=atoi(strText;11、接收處理及十六進制顯示接收處理均在串口事件消息處理函

27、數OnCommunication(WPARAM ch, LPARAM port函數中實現。其中,十六進制的接收顯示時并不像發(fā)送那樣麻煩,只要將數 據直接以十六進制打印輸出就可以了,注意中間插入一個空格。LONG CSCOMMDlg:OnCommunication(WPARAM ch, LPARAM port if (port <= 0 II port > 4return -1;rxdatacount+; 接收的字節(jié)計數CString strTemp;strTemp.Forma t(M % Id119rxdatacount;strTeinp=MRX:n+strTemp; m_ctrlRXCOUNT.SetWlndowText(strTemp;/ 顯示接收計數 if(m_bStopDispRXData如果選擇了“停止顯示”接收數據,則返回return-1;/»意,這種情況下,計數仍在繼續(xù),只是不顯示若設置了“自動清空",則達到50行后,自動清空接收編輯框中顯示的數據if(m_ctrlAutoClear.GetCheck(&&(m_ctrlReceivcData.GetLincCount(>=50m_ReceiveData.Empty(;UpdateData(F

溫馨提示

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

評論

0/150

提交評論