1:添加MSComm控件
2:為對話框添加MSComm控件成員變量
右擊MSComm控件,然後選擇Add Variable...
3:為對話框添加OnComm事件
右擊MSComm控件,然後選擇Add Event Handle..
4:打開/關閉串口.
void?Ctbox_debug_viewDlg::OnBnClickedBtOpen(){
//?TODO:?Add?your?control?notification?handler?code?here
if(m_mscomm.get_PortOpen())
{
m_mscomm.put_PortOpen(FALSE);
GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("打開"));
ShowInfo(_T("關閉串口成功!"));
m_OpenStatus?=false;
return;
}
UpdateData(TRUE);
m_OpenStatus?=true;
//當前端口號
m_mscomm.put_CommPort(m_Port+1);//端口號
m_mscomm.put_InBufferSize(1024);//接收緩沖區
m_mscomm.put_OutBufferSize(1024);//發送緩沖區
m_mscomm.put_InputLen(0);//設置當前接收區數據長度為0,表示全部讀取
m_mscomm.put_InputMode(1);//以二進制方式讀寫數據
m_mscomm.put_RThreshold(1);//接收緩沖區有1個及1個以上字符時,將引發接收數據的OnComm事件
//波特率
DWORD?baudrate;
switch(m_CombolBaudrate.GetCurSel())
{
case?0:
baudrate?=115200;
break;
case?1:
baudrate?=9600;
break;
default:
ASSERT(FALSE);
break;
}
CString?setting;
setting.Format(_T("%d,n,8,1"),baudrate);
m_mscomm.put_Settings(setting/*_T("115200,n,8,1")*/);//波特率,無校驗,8個數據位,1個停止1位
m_mscomm.put_PortOpen(TRUE);//打開串口
GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("關閉"));
ShowInfo(_T("打開串口成功!"));
}
5:接收串口數據
void?Ctbox_debug_viewDlg::OnCommMscomm1()
{
//?TODO:?Add?your?message?handler?code?here
short?curEvent?=m_mscomm.get_CommEvent();
switch(curEvent)
{
case?CMscomm1::comEvReceive:
EvReceiveHandle();
break;
}
}
void?Ctbox_debug_viewDlg::EvReceiveHandle(void)
{
static?unsigned?int?cnt=0;
VARIANT?variant_inp;
COleSafeArray?safearray_inp;
long?len,k;
/*unsigned?intdata[1024]={0};*/
BYTE?rxdata[1024];//設置BYTE數組
CString?strtemp;
cnt++;
variant_inp=?m_mscomm.get_Input();//讀取緩沖區
safearray_inp=?variant_inp;//變量轉換
len=?safearray_inp.GetOneDimSize();//得到有效的數據長度
for?(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);
}
/*char?c_char;?*/
for?(k=0;k<len;k++)
{
strtemp.Format(_T("%c"),*(rxdata+k));
m_RecveString?+=strtemp;
if(*(rxdata+k)?=='\n')
{
ShowInfoByFilter(m_RecveString);
m_RecveString?="";
}
}
}
6:發送串口數據
void?Ctbox_debug_viewDlg::OnBnClickedBtSend()
{
//?TODO:?Add?your?control?notification?handler?code?here
if(m_OpenStatus?==false)
{
AfxMessageBox(_T("請先打開串口"));
return;
}
UpdateData(TRUE);
if(m_SendString.IsEmpty())
return;
if(m_AutoAddLF)
{
m_SendString?+="\r\n";
}
m_mscomm.put_Output(COleVariant(m_SendString));
ShowInfo(m_SendString);
}