簡單的串列埠助手程式開發
阿新 • • 發佈:2019-01-29
1.簡介
之前在烽火集團實習的時候,開發串列埠通訊程式用的都是純C++。感覺串列埠程式開發很考驗人的邏輯思考能力。不過,現在好了,科研工作中,一切已存在的“利器”都可以用來為自己的“idea”服務。 在串列埠程式開發過程中,有兩個很得力的助手——“CserialPort”和“MSCommon”。這裡,僅嘗試了利用MSCommon空間進行最基本的串列埠助手開發,也是受益匪淺。
2.一步一步開發程式
1.利用先前點選開啟連結介紹的載入MSCommon控制元件的方法設計對話方塊面板,如下圖所示:3.心得感受
2.改變各控制元件的ID號以及新增相應的空間變數:
3.初始化串列埠,設定MSComm控制元件的屬性串列埠初始化部分其實就是三個過程:選擇串列埠及開闢快取區、設定通訊協議、開啟串列埠並監控串列埠執行緒訊息。OOL CSerialCommDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 將“關於...”選單項新增到系統選單中。 // IDM_ABOUTBOX 必須在系統命令範圍內。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 設定此對話方塊的圖示。 當應用程式主視窗不是對話方塊時,框架將自動 // 執行此操作 SetIcon(m_hIcon, TRUE); // 設定大圖示 SetIcon(m_hIcon, FALSE); // 設定小圖示 ///////////////////////初始化程式碼/////////////////////////// m_ctrlComm.put_CommPort(1);//選擇COM1 m_ctrlComm.put_InputMode(1); //設定輸入方式為二進位制方式 m_ctrlComm.put_InBufferSize(1024);//設定輸入緩衝區大小 m_ctrlComm.put_OutBufferSize(512);//設定輸出緩衝區大小 //通訊協議:波特率9600 無校驗 傳輸位數8 停止位1 m_ctrlComm.put_Settings(_T("9600,n,8,1"));//提示const char* 與 LPCTSTR不相容 //開啟串列埠 if (!m_ctrlComm.get_PortOpen()) m_ctrlComm.put_PortOpen(TRUE); m_ctrlComm.put_RThreshold(1);//每當串列埠緩衝區又多於或等於1個字元的時候將 //引發一個接收資料的OnCommon事件 m_ctrlComm.put_InputLen(0); //設定當前接受區資料長度為0 m_ctrlComm.get_Input(); //先預讀緩衝區以清除殘留資料 return TRUE; }
4.新增串列埠訊息處理函式OnComm()MSComm控制元件一般就是用事件驅動方式從串列埠接收資料,也就是訊息處理,當串列埠有事件發生時,程式呼叫訊息訊息函式來處理資料。該函式程式碼的主要任務是從串列埠接收資料並顯示在接收編輯框中。 在這裡不得不說的是我們會經常碰到的程式錯誤:“ const char* 與LPCTCTR型別不匹配 ”、“ const char 和 const wchar_t 型別不匹配”。在這裡,我們利用“-T()”函式處理就好了。 5.傳送訊息設定void CSerialCommDlg::Oncomm() {//接收串列埠資料並傳遞到顯示視窗 VARIANT variant_inp; COleSafeArray safearray_inp; LONG len, k; BYTE rxdata[2048]; CString strtemp; if (m_ctrlComm.get_CommEvent() == 2 ) //事件值為2表示接受緩衝區內有字元 { variant_inp = m_ctrlComm.get_Input(); //讀緩衝區 safearray_inp = variant_inp; //資料型別轉換 len = safearray_inp.GetOneDimSize(); //得到有效資料長度 for (k = 0; k < len; k++) safearray_inp.GetElement(&k, rxdata + k); //轉換為BYTE型陣列 for (k = 0; k < len; k++) { BYTE bt = *(char*)(rxdata + k); //字元型 strtemp.Format(_T("%c"),bt); //將字元送入臨時變數中儲存 //const char 與 const wchar_t不相容 m_strEditRxData += strtemp; } } UpdateData(FALSE); }
首先通過更新命令,實時更新成員變數值,然後利用串列埠物件將該資料傳送出去。 6.雙串列埠配置 利用虛擬串列埠軟體Virtual Serial Ports Driver XP設定一對串列埠,如下圖所示: 7.實驗結果:void CSerialCommDlg::OnClickedButtonManualsend() { UpdateData(TRUE); m_ctrlComm.put_Output(COleVariant(m_strEditTxData));//傳送資料 }
利用MSComm進行串列埠程式開發大大提高了程式設計效率!關鍵在於串列埠訊息的實時監控,並設定適當的訊息處理函式。最典型的就是獲得串列埠接收到的資料(當然了也包括這些資料的演算法處理)。