TTY字符接受程序_第1頁
TTY字符接受程序_第2頁
TTY字符接受程序_第3頁
TTY字符接受程序_第4頁
TTY字符接受程序_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、TTY字符接受程序一、功能描述接受方接受發(fā)送方發(fā)送的字符,并顯示??梢詡魉妥址梢娪⑽淖址ˋSCII碼32126)和回車符。要求:,1. 采用MSComm控件實(shí)現(xiàn)(事件驅(qū)動方式)。2. 采用WinAPI方式,多線程(子線程檢測事件,主線程顯示),事件驅(qū)動方式,自定義消息二、采用MSCommTTY接受界面設(shè)計(jì)1. 主界面設(shè)計(jì)添加4個Button,一個Edit Control,三個Static Text控件。設(shè)置Caption。2. 通信界面設(shè)計(jì)添加3個Static Text,3個Combo Box控件。設(shè)置Caption。添加Combo Box 的data值。如通信端口添加COM1;COM

2、2;COM3;等。變量聲明聲明主界面成員變量和設(shè)置對話框的成員變量。1、 在主對話框類頭文件中聲明設(shè)置對話框?qū)嵗⒋谔?、奇偶校?yàn)類型以及波特率,并包含相應(yīng)頭文件保證編譯通過;CMSComm m_Comm;/ 串口控件對象CSetupDlg m_SetupDlg;/ 設(shè)置對話框?qū)ο驜YTE m_Com;/ 端口號CString m_BaudRate;/ 波特率CString m_Parity;/ 校驗(yàn)類型2、 利用“ClassWizard”創(chuàng)建主對話框及設(shè)置對話框控件變量。如圖所示添加相應(yīng)控件變量。更改對應(yīng)變量類型和類別。創(chuàng)建串口控件加載后,在主對話框OnInitDialog消息處理函數(shù)中創(chuàng)建

3、串口。BOOL Ctest22Dlg:OnInitDialog()CDialogEx:OnInitDialog();/ 設(shè)置此對話框的圖標(biāo)。當(dāng)應(yīng)用程序主窗口不是對話框時,框架將自動/ 執(zhí)行此操作SetIcon(m_hIcon, TRUE);/ 設(shè)置大圖標(biāo)SetIcon(m_hIcon, FALSE);/ 設(shè)置小圖標(biāo)/ TODO: 在此添加額外的初始化代碼DWORD style=WS_VISIBLE|WS_CHILD;if (!m_Comm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1)AfxMessageBox(創(chuàng)建MSComm控件失?。?

4、;m_OpenComm.EnableWindow(false);/使打開串口按鈕無效m_CloseComm.EnableWindow(false);/使關(guān)閉串口按鈕無效m_SetupComm.EnableWindow(false);/使設(shè)置按鈕無效return -1;m_Para=COM1,9600,N,8,1;UpdateData(false);return TRUE; / 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE設(shè)置串口 “設(shè)置”按鈕添加點(diǎn)擊事件響應(yīng)函數(shù):void Ctest22Dlg:OnClickedSetupcomm()/ TODO: 在此添加控件通知處理程序代碼if(m_Setup

5、Dlg.DoModal() = IDOK) / 打開設(shè)置對話框UpdateData(true); / 更新數(shù)據(jù) (從控件-成員變量)m_Com = m_SetupDlg.m_Com+1;/ 獲得端口號double baudRate = pow(2, (double)m_SetupDlg.m_BaudRate);baudRate = 19200/baudRate;m_BaudRate.Format(%.0f, baudRate);/ 轉(zhuǎn)化為字符串,得到波特率switch(m_SetupDlg.m_Parity) / 獲得校驗(yàn)類型case 0:m_Parity = N;break;case 1:m

6、_Parity = O;break;case 2:m_Parity = E;break;CString windowsTitle, temp;/ 設(shè)置窗口標(biāo)題windowsTitle = COM;temp.Format(%d, m_Com);windowsTitle += temp;windowsTitle += ,;windowsTitle += m_BaudRate;windowsTitle += ,;windowsTitle += m_Parity;windowsTitle += ,8,1;m_Para=windowsTitle;UpdateData(false);/ 更新控件內(nèi)容(從成

7、員變量-控件)打開串口 “打開串口”按鈕添加點(diǎn)擊事件處理函數(shù)“:void Ctest22Dlg:OnClickedOpencomm()/ TODO: 在此添加控件通知處理程序代碼CString strPara;/串口參數(shù)m_Comm.put_CommPort(m_Com);/指定串口號strPara=m_BaudRate;strPara+=,;strPara+=m_Parity;strPara+=,8,1;m_Comm.put_Settings(strPara);/通信參數(shù)設(shè)置m_Comm.put_InBufferSize(1024);/指定接收緩沖區(qū)大小m_Comm.put_InBuffer

8、Count(0);/清空接收緩沖區(qū)m_Comm.put_InputMode(1);/設(shè)置數(shù)據(jù)獲取方式,二進(jìn)制方式m_Comm.put_InputLen(0);/設(shè)置每次讀取長度,讀取整個緩沖區(qū)內(nèi)容m_Comm.put_RThreshold(1); /設(shè)置接收OnComm事件門限值,m_Comm.put_PortOpen(1);/打開串口m_OpenComm.EnableWindow(false);/使打開串口按鈕無效m_CloseComm.EnableWindow(true);/使關(guān)閉串口按鈕生效m_SetupComm.EnableWindow(false); /使設(shè)置按鈕無效AfxMessa

9、geBox(串口打開成功!);關(guān)閉串口 “關(guān)閉串口”按鈕添加單擊事件處理函數(shù):void Ctest22Dlg:OnClickedClosecomm()/ TODO: 在此添加控件通知處理程序代碼m_Comm.put_PortOpen(0);/關(guān)閉串口AfxMessageBox(串口關(guān)閉成功!);m_OpenComm.EnableWindow(true);/使打開串口按鈕生效m_CloseComm.EnableWindow(false);/使關(guān)閉串口按鈕無效m_SetupComm.EnableWindow(true);/使設(shè)置按鈕生效接收數(shù)據(jù)處理在MSComm控件的OnComm事件中接受數(shù)據(jù)。添

10、加OnComm事件處理函數(shù):void Ctest22Dlg:OnOncommMscomm1()/ TODO: 在此處添加消息處理程序代碼VARIANT input1; /定義VARIANT類型變量BYTE rxdata2048; /定義存放二進(jìn)制數(shù)據(jù)的數(shù)組COleSafeArray safearray1; /定義COleSafeArray類的實(shí)例CString strDis, strTemp;switch(m_Comm.get_CommEvent() case 2: input1=m_Comm.get_Input();safearray1=input1; /使用COleSafeArray類的成

11、員函數(shù)獲取數(shù)據(jù)長度long len1=safearray1.GetOneDimSize();for(long k=0;klen1;k+)/使用COleSafeArray成員函數(shù)將數(shù)據(jù)寫入數(shù)組safearray1.GetElement(&k,rxdata+k); /收到 RThreshold 個字符, 添加接收處理代碼/將接受緩沖區(qū)數(shù)據(jù)放入VARIANT變量;/將VARAIANT變量賦值給COleSafeArray類的實(shí)例/使用COleSafeArray類的成員函數(shù)獲取數(shù)據(jù)長度/使用COleSafeArray類的成員函數(shù)將數(shù)據(jù)寫入數(shù)組rxdatafor(long k=0;k1;k+)if(rxd

12、atak=13)/ 回車鍵/換行顯示m_Display.SetSel(1000000,1000000);m_Display.ReplaceSel(1512);UpdateData(false);else/ 可見字符if(rxdatak=32)strDis+=rxdatak;m_Display.SetSel(1000000,1000000);m_Display.ReplaceSel(strDis);strDis=;UpdateData(false);程序結(jié)果展示:三、采用API界面設(shè)計(jì):1. 主界面,設(shè)置參數(shù)界面同上:變量聲明(主對話框CthreadReceiveDlg.cpp中頭部添加聲明):

13、CSetupDlg mySetupDlg; /設(shè)置對話框?qū)ο驞WORD myfParity; /校驗(yàn)標(biāo)志LPCSTR myCom; /串口號BYTE myParity; /校驗(yàn)類型DWORD myBaudRate; /波特率HANDLE hCom; /串口句柄HANDLE hThreadEvent; /事件線程句柄DWORD ThreadProcEvent(LPVOID pParam); /事件響應(yīng)函數(shù)bool hEventRun; /事件線程函數(shù)執(zhí)行標(biāo)志HWND hWnd; /窗口句柄DWORD dwThreadID; /事件線程IDOVERLAPPED Eol=0; /事件線程使用的OVE

14、RLAPPED結(jié)構(gòu)OVERLAPPED Rol=0; /讀操作使用的OVERLAPPED的結(jié)構(gòu)bool fStopMsg; /事件線程向主線程發(fā)送消息標(biāo)志2、利用“ClassWizard”創(chuàng)建主對話框及設(shè)置對話框控件變量(同上)。3、設(shè)置串口按鈕添加單擊事件響應(yīng)函數(shù)(并保存參數(shù)到相應(yīng)變量以便打開串口設(shè)置DCB結(jié)構(gòu)時使用)。CString strStatus;if(mySetupDlg.DoModal()=IDOK)switch(mySetupDlg.m_Com)case 0:strStatus=COM1;myCom=COM1;break;case 1:strStatus=COM2;myCom=

15、COM2;break;case 2:strStatus=COM3;myCom=COM3;break;case 3: strStatus=COM4;myCom=COM4;break;case 4: strStatus=COM5;myCom=COM5;break;case 5:strStatus=COM6;myCom=COM6;break;strStatus+=,;switch (mySetupDlg.m_BaudRate)case 0: strStatus+=19200; myBaudRate=CBR_19200; break;case 1:strStatus+=9600;myBaudRate=

16、CBR_9600;break;case 2:strStatus+=4800;myBaudRate=CBR_4800;break;case 3:strStatus+=2400;myBaudRate=CBR_2400;break;default:break;strStatus+=,;switch (mySetupDlg.m_Parity)case 0:myfParity=false;myParity=NOPARITY;strStatus+=N;break;case 1:myParity=ODDPARITY;strStatus+=O;break;case 2: myParity=EVENPARITY

17、;strStatus+=E;break;default:break;strStatus+=,8,1;m_Para=strStatus; /將參數(shù)顯示在主對話框頭部以便觀察。UpdateData(false);/ 更新控件內(nèi)容(從成員變量-控件)4.添加打開串口單擊事件響應(yīng)函數(shù)。hCom=CreateFile(myCom,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); /創(chuàng)建串口if(hCom !=INVALID_HANDLE_VALUE)Setup

18、Comm(hCom,1024,512); /緩沖區(qū)設(shè)置DCB myDCB;GetCommState(hCom,&myDCB); /獲得串口DCB數(shù)據(jù)結(jié)構(gòu)myDCB.BaudRate=myBaudRate;myDCB.fBinary=TRUE;myDCB.fParity=myfParity;myDCB.ByteSize=8;myDCB.Parity=myParity;myDCB.StopBits=ONESTOPBIT; /設(shè)置DCB需要改動的相應(yīng)參數(shù)SetCommState(hCom,&myDCB); /使用新的DCB結(jié)構(gòu)設(shè)置串口AfxMessageBox(串口打開成功);elseAfxMess

19、ageBox(創(chuàng)建串口失??!);hWnd=GetSafeHwnd();DWORD dwParam; if(!SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY)AfxMessageBox(建立事件掩碼失敗);hThreadEvent=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProcEvent,&dwParam,0,&dwThreadID); /創(chuàng)建并立即執(zhí)行事件線程if(hThreadEvent=INVALID_HANDLE_VALUE)AfxMessageBox(事件線程創(chuàng)建失敗);hEventRun=tru

20、e;5、添加關(guān)閉串口,退出單擊事件響應(yīng)函數(shù)(1)關(guān)閉串口:hEventRun=false; /事件線程運(yùn)行標(biāo)志置0WaitForSingleObject(hThreadEvent,INFINITE); /等待事件線程函數(shù)退出CloseHandle(hThreadEvent); /關(guān)閉事件線程句柄if(CloseHandle(hCom) /關(guān)閉串口句柄并提示串口關(guān)閉AfxMessageBox(串口關(guān)閉成功);(2)退出:this-EndDialog(true);6、主對話框CthreadReceiveDlg.cpp 添加事件線程函數(shù)。DWORD ThreadProcEvent(LPVOID pP

21、aram)DWORD dwEvtMask,dwRes;Eol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);while(hEventRun) /循環(huán)檢測事件線程函數(shù)狀態(tài)。WaitCommEvent(hCom,&dwEvtMask,&Eol);dwRes=WaitForSingleObject(Eol.hEvent,100);switch(dwRes)case WAIT_OBJECT_0:switch (dwEvtMask)case EV_RXCHAR:if(!fStopMsg)fStopMsg=true;:PostMessage(hWnd,WM_MYMSG,

22、0,(LPARAM)EV_RXCHAR); /接受到數(shù)據(jù)通知自定義消息函數(shù)。break;case EV_TXEMPTY:AfxMessageBox(send buffer is empty);break;break;return true;7、自定義消息讀取數(shù)據(jù)(1)在主對話框ThreadReceiveDlg.h中頭部添加 自定義消息ID #define WM_MYMSG WM_USER+100 /自定義消息WM_MYMSG ID為WM_USER+100 (2)在ThreadReceiveDlg類定義中添加消息函數(shù)聲明 afx_msg LONG OnReceiveEvent(WPARAM wP

23、aram,LPARAM lParam); (3) 在CthreadReceiveDlg.cpp中添加自定義消息映射 BEGIN_MESSAGE_MAP(CThreadReceiveDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_SETUPCOM, &CThreadReceiveDlg:OnBnClickedSetupcom)ON_BN_CLICKED(IDC_OPENCOM, &CThreadReceiveDlg:OnBnClickedOpencom)ON_BN_CLICKED(IDC_CLOSECOM, &

24、CThreadReceiveDlg:OnBnClickedClosecom)ON_BN_CLICKED(IDC_EXIT, &CThreadReceiveDlg:OnBnClickedExit)ON_MESSAGE(WM_MYMSG,OnReceiveEvent) /接受數(shù)據(jù)消息映射END_MESSAGE_MAP()(4)在CthreadReceiveDlg.cpp中添加自定義消息函數(shù)實(shí)現(xiàn)(接收數(shù)據(jù)實(shí)現(xiàn))LONG CThreadReceiveDlg:OnReceiveEvent(WPARAM wParam,LPARAM lParam)CString strDis, strTemp;BYTE myByte50;DWORD dwRes;DWORD dwRead;DWORD dwErrors;COMSTAT Rcs;fStopMsg=true;Cle

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論