mfc初步探索——串列埠配置與通訊
阿新 • • 發佈:2019-01-10
本文采用vs2013+mfc,使用mscomm進行串列埠通訊
首先註冊mscomm外掛,
新增ActiveX控制元件——Microsoft Communications Control,version 6.0,右鍵控制元件新增變數,並將主程式中DDX_Control(pDX, IDC_MSCOMM, m_mscomm)這行刪除掉。
開啟串列埠
if (m_mscomm.get_PortOpen()) m_mscomm.put_PortOpen(FALSE); //關閉串列埠 CButton* pBtnOpencomm = (CButton*)GetDlgItem(IDC_BUTTON_OPENCOMM); CComboBox* pComboBoxComm = (CComboBox*)GetDlgItem(IDC_COMBO_COMM); int nSelComm = pComboBoxComm->GetCurSel(); m_mscomm.put_CommPort(nSelComm + 1); //設定串列埠為COM4 m_mscomm.put_Settings(_T("115200,N,8,1")); //設定波特率115200,無奇偶校驗,8位資料位,1位停止位 m_mscomm.put_InputMode(1); //設定資料接收模式,1為二進位制,0為文字 m_mscomm.put_InputLen(0); //設定當前接收區資料長度,0表示全部讀取 m_mscomm.put_InBufferSize(1024); //設定輸入緩衝區大小為1024 byte m_mscomm.put_OutBufferSize(1024); //設定輸出緩衝區大小為1024 byte m_mscomm.put_RThreshold(8); //每接收到1個字元時,觸發OnComm事件 m_mscomm.put_SThreshold(0); //設定每傳送多少個字元觸發OnComm事件,0表示不觸發OnComm事件 if (!m_mscomm.get_PortOpen()) { m_mscomm.put_PortOpen(TRUE); //開啟串列埠 pBtnOpencomm->SetWindowText(_T("串列埠已開啟")); } else AfxMessageBox(_T("can't open serial port"));
初始化串列埠
CComboBox* pComboComm = (CComboBox*)GetDlgItem(IDC_COMBO_COMM);
ASSERT(pComboComm);
//初始化串列埠視窗
for (int i = 1; i <= 10; i++)
{
CString strComm;
strComm.Format(_T("COM%d"), i);
pComboComm->AddString(strComm);
}
pComboComm->SetCurSel(2); //設定預設串列埠4
有可能初始化後在combo-box裡顯示亂序,這時候需要設定sort為false。
傳送資料
unsigned char TxData[13] = { LonWL, 0x10, 0x00, 0x00, 0x00, 0x02, 0x04, 0x00, LonA, 0x00, LonC, 0, 0 }; unsigned short int unintCRC = GetCRC16(TxData, 11); unsigned char* punintCRC = (unsigned char*)&unintCRC; TxData[11] = punintCRC[1]; TxData[12] = punintCRC[0]; unsigned char* pTxData = (unsigned char*)&TxData; CByteArray array; array.RemoveAll(); array.SetSize(13); for (int a = 0; a < 13; a++) { array.SetAt(a, pTxData[a]); } m_mscomm.put_Output(COleVariant(array));
Txdata[13]為假定的一段資料
接收資料
//AfxMessageBox("T1");
if (m_mscomm.get_CommEvent() != 2)
{
return;
}
CString strRecv = _T("");
unsigned char rcvdata[1024] = { 0 };//接收的資料
COleSafeArray safearray_inp = m_mscomm.get_Input();//讀緩衝區訊息
DWORD len = safearray_inp.GetOneDimSize();//獲取有效資料長度
for (long j = 0; j < len; j++)//轉化為unsigned char陣列
{
safearray_inp.GetElement(&j, rcvdata + j);
}
for (long j = 0; j < len; j++)//將陣列轉換為CString型變數
{
unsigned char charTemp = *(char*)(rcvdata + j);
if (charTemp <= 0x0F)
strRecv.Format(_T("0%x "), charTemp);
else
strRecv.Format(_T("%x "), charTemp);
m_editTemp += strRecv;
}
資料儲存在m_editTemp裡;