利用vc++中的MSComm控件來進行串口的編程,方便快捷。c++
- BOOL CSCommTestDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- 。。。
- if(m_ctrlComm.GetPortOpen())
- m_ctrlComm.SetPortOpen(FALSE);
- m_ctrlComm.SetCommPort(1); //選擇com1
- if(!m_ctrlComm.GetPortOpen())
- m_ctrlComm.SetPortOpen(TRUE);//打開串口
- else
- AfxMessageBox("cannot open serial port");
- m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,無校驗,8個數據位,1箇中止位
- m_ctrlComm.SetInputMode(1); //1:表示以二進制方式檢取數據
- m_ctrlComm.SetRThreshold(1);
- //參數1表示每當串口接收緩衝區中有多於或等於1個字符時將引起一個接收數據的OnComm事件
- m_ctrlComm.SetInputLen(0); //設置當前接收區數據長度爲0
- m_ctrlComm.GetInput();//先預讀緩衝區以清除殘留數據
- return TRUE; // return TRUE unless you set the focus to a control
- }
- void CHDF_GUIDlg::OnOnCommMscomm1()
- {
- VARIANT variant_inp;
- COleSafeArray safearray_inp;
- static rxdata_len = 0;
- LONG len,k;
- BYTE rxdata[500]; //設置BYTE數組 An 8-bit integerthat is not signed.
- CString strtemp;
- if(m_ctrlComm.GetCommEvent()==2) //事件值爲2表示接收緩衝區內有字符
- { ////////如下你能夠根據本身的通訊協議加入處理代碼
- variant_inp=m_ctrlComm.GetInput(); //讀緩衝區
- safearray_inp=variant_inp; //VARIANT型變量轉換爲ColeSafeArray型變量
- len=safearray_inp.GetOneDimSize(); //獲得有效數據長度
- for(k=0;k<len;k++)
- safearray_inp.GetElement(&k,rxdata+k+rxdata_len);//轉換爲BYTE型數組
- rxdata_len+=len;
- for(k=rxdata_len-len;k<rxdata_len;k++) //將數組轉換爲Cstring型變量
- {
- strtemp.Format("%.2x",rxdata[k]); //將字符送入臨時變量strtemp存放
- m_strRXData+=strtemp; //加入接收編輯框對應字符串
- }
- m_strRXData+="\r\n";
- UpdateData(FALSE); //更新編輯框內容
- //對數據進行處理,若是大於設定字符長度6,則先處理前6個字符再接着處理餘下字符
- for(;rxdata_len>=6;) //只要數據緩衝區數據大於6個字節,則進行一次處理
- {
- if(0x58==rxdata[0]&&0x58!=rxdata[1]&&0x59==rxdata[5])//爲真表示爲數據開頭
- {
- unsigned char ucdata[4]={rxdata[1],rxdata[2],rxdata[3],rxdata[4]};
- for(k=0;k<rxdata_len-6;k++)
- {
- rxdata[k]=rxdata[k+6];
- }
- rxdata_len-=6;
- ProcessData(ucdata);//對收到的一幀可用數據進行處理,更新各個狀態寄存器 }
- else
- {
- for(k=0;k<rxdata_len-1;k++)
- {
- rxdata[k]=rxdata[k+1];
- }
- rxdata_len-=1;
- }
- }
- }
- }
5.發送數據(爲發送按鈕添加函數)編程
爲發送按鈕添加一個單擊函數,既BN_CLICKED,打開創建類嚮導,選中IDC_BUTTON_MANUALSEND,雙擊BN_CLICKED添加OnButtonManualsend( )函數,代碼以下:數組
- void CSCommTestDlg::OnButtonManualsend()
- {
- // TODO: Add your control notification handler code here
- UpdateData(TRUE); //讀取編輯框內容
- m_ctrlComm.SetOutput(COleVariant(m_strTXData));//發送數據
- }
6.串口調試less
下載運行VSPM虛擬串口v2.65,一切按默認進行,運行後COM3和COM4串口相連。將本身的vc程序改爲控制串口COM3。運行串口調試助手v2.2,選擇串口COM4,調試串口之間的通訊。ide