简单的串口助手程序开发
生活随笔
收集整理的這篇文章主要介紹了
简单的串口助手程序开发
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.簡介
之前在烽火集團(tuán)實(shí)習(xí)的時候,開發(fā)串口通信程序用的都是純C++。感覺串口程序開發(fā)很考驗(yàn)人的邏輯思考能力。不過,現(xiàn)在好了,科研工作中,一切已存在的“利器”都可以用來為自己的“idea”服務(wù)。 在串口程序開發(fā)過程中,有兩個很得力的助手——“CserialPort”和“MSCommon”。這里,僅嘗試了利用MSCommon空間進(jìn)行最基本的串口助手開發(fā),也是受益匪淺。2.一步一步開發(fā)程序
1.利用先前點(diǎn)擊打開鏈接介紹的加載MSCommon控件的方法設(shè)計對話框面板,如下圖所示:
2.改變各控件的ID號以及添加相應(yīng)的空間變量:
3.初始化串口,設(shè)置MSComm控件的屬性 OOL CSerialCommDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 將“關(guān)于...”菜單項添加到系統(tǒng)菜單中。// IDM_ABOUTBOX 必須在系統(tǒng)命令范圍內(nèi)。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);}}// 設(shè)置此對話框的圖標(biāo)。 當(dāng)應(yīng)用程序主窗口不是對話框時,框架將自動// 執(zhí)行此操作SetIcon(m_hIcon, TRUE); // 設(shè)置大圖標(biāo)SetIcon(m_hIcon, FALSE); // 設(shè)置小圖標(biāo)///初始化代碼///m_ctrlComm.put_CommPort(1);//選擇COM1m_ctrlComm.put_InputMode(1); //設(shè)置輸入方式為二進(jìn)制方式m_ctrlComm.put_InBufferSize(1024);//設(shè)置輸入緩沖區(qū)大小m_ctrlComm.put_OutBufferSize(512);//設(shè)置輸出緩沖區(qū)大小//通信協(xié)議:波特率9600 無校驗(yàn) 傳輸位數(shù)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);//每當(dāng)串口緩沖區(qū)又多于或等于1個字符的時候?qū)?/引發(fā)一個接收數(shù)據(jù)的OnCommon事件m_ctrlComm.put_InputLen(0); //設(shè)置當(dāng)前接受區(qū)數(shù)據(jù)長度為0m_ctrlComm.get_Input(); //先預(yù)讀緩沖區(qū)以清除殘留數(shù)據(jù)return TRUE;
}串口初始化部分其實(shí)就是三個過程:選擇串口及開辟緩存區(qū)、設(shè)定通信協(xié)議、打開串口并監(jiān)控串口線程消息。
4.添加串口消息處理函數(shù)OnComm() void CSerialCommDlg::Oncomm()
{//接收串口數(shù)據(jù)并傳遞到顯示窗口VARIANT variant_inp;COleSafeArray safearray_inp;LONG len, k;BYTE rxdata[2048];CString strtemp;if (m_ctrlComm.get_CommEvent() == 2 ) //事件值為2表示接受緩沖區(qū)內(nèi)有字符{variant_inp = m_ctrlComm.get_Input(); //讀緩沖區(qū)safearray_inp = variant_inp; //數(shù)據(jù)類型轉(zhuǎn)換len = safearray_inp.GetOneDimSize(); //得到有效數(shù)據(jù)長度for (k = 0; k < len; k++)safearray_inp.GetElement(&k, rxdata + k); //轉(zhuǎn)換為BYTE型數(shù)組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控件一般就是用事件驅(qū)動方式從串口接收數(shù)據(jù),也就是消息處理,當(dāng)串口有事件發(fā)生時,程序調(diào)用消息消息函數(shù)來處理數(shù)據(jù)。該函數(shù)代碼的主要任務(wù)是從串口接收數(shù)據(jù)并顯示在接收編輯框中。 在這里不得不說的是我們會經(jīng)常碰到的程序錯誤:“ const char* 與LPCTCTR類型不匹配 ”、“ const char 和 const wchar_t 類型不匹配”。在這里,我們利用“-T()”函數(shù)處理就好了。
5.發(fā)送消息設(shè)置 void CSerialCommDlg::OnClickedButtonManualsend()
{UpdateData(TRUE);m_ctrlComm.put_Output(COleVariant(m_strEditTxData));//發(fā)送數(shù)據(jù)
}首先通過更新命令,實(shí)時更新成員變量值,然后利用串口對象將該數(shù)據(jù)發(fā)送出去。
6.雙串口配置 利用虛擬串口軟件Virtual Serial Ports Driver XP設(shè)置一對串口,如下圖所示: 7.實(shí)驗(yàn)結(jié)果:
3.心得感受
利用MSComm進(jìn)行串口程序開發(fā)大大提高了編程效率!關(guān)鍵在于串口消息的實(shí)時監(jiān)控,并設(shè)定適當(dāng)?shù)南⑻幚砗瘮?shù)。最典型的就是獲得串口接收到的數(shù)據(jù)(當(dāng)然了也包括這些數(shù)據(jù)的算法處理)。 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
以上是生活随笔為你收集整理的简单的串口助手程序开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2015中配置MSComm通讯控件和
- 下一篇: 摄像机投射投影模型_综述及详解