本文采用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里;