简单的串口助手程序开发
生活随笔
收集整理的這篇文章主要介紹了
简单的串口助手程序开发
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.簡介
之前在烽火集團實習的時候,開發串口通信程序用的都是純C++。感覺串口程序開發很考驗人的邏輯思考能力。不過,現在好了,科研工作中,一切已存在的“利器”都可以用來為自己的“idea”服務。 在串口程序開發過程中,有兩個很得力的助手——“CserialPort”和“MSCommon”。這里,僅嘗試了利用MSCommon空間進行最基本的串口助手開發,也是受益匪淺。2.一步一步開發程序
1.利用先前點擊打開鏈接介紹的加載MSCommon控件的方法設計對話框面板,如下圖所示:
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);//選擇COM1m_ctrlComm.put_InputMode(1); //設置輸入方式為二進制方式m_ctrlComm.put_InBufferSize(1024);//設置輸入緩沖區大小m_ctrlComm.put_OutBufferSize(512);//設置輸出緩沖區大小//通信協議:波特率9600 無校驗 傳輸位數8 停止位1m_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); //設置當前接受區數據長度為0m_ctrlComm.get_Input(); //先預讀緩沖區以清除殘留數據return TRUE;
}串口初始化部分其實就是三個過程:選擇串口及開辟緩存區、設定通信協議、打開串口并監控串口線程消息。
4.添加串口消息處理函數OnComm() 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);
}MSComm控件一般就是用事件驅動方式從串口接收數據,也就是消息處理,當串口有事件發生時,程序調用消息消息函數來處理數據。該函數代碼的主要任務是從串口接收數據并顯示在接收編輯框中。 在這里不得不說的是我們會經常碰到的程序錯誤:“ const char* 與LPCTCTR類型不匹配 ”、“ const char 和 const wchar_t 類型不匹配”。在這里,我們利用“-T()”函數處理就好了。
5.發送消息設置 void CSerialCommDlg::OnClickedButtonManualsend()
{UpdateData(TRUE);m_ctrlComm.put_Output(COleVariant(m_strEditTxData));//發送數據
}首先通過更新命令,實時更新成員變量值,然后利用串口對象將該數據發送出去。
6.雙串口配置 利用虛擬串口軟件Virtual Serial Ports Driver XP設置一對串口,如下圖所示: 7.實驗結果:
3.心得感受
利用MSComm進行串口程序開發大大提高了編程效率!關鍵在于串口消息的實時監控,并設定適當的消息處理函數。最典型的就是獲得串口接收到的數據(當然了也包括這些數據的算法處理)。 與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的简单的串口助手程序开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2015中配置MSComm通讯控件和
- 下一篇: 摄像机投射投影模型_综述及详解