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_mscommget_PortOpen())
{
m_mscommput_PortOpen(FALSE);
GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("打开"));
ShowInfo(_T("关闭串口成功!"));
m_OpenStatus =false;
return;
}
UpdateData(TRUE);
m_OpenStatus =true;
//当前端口号
m_mscommput_CommPort(m_Port+1);//端口号
m_mscommput_InBufferSize(1024);//接收缓冲区
m_mscommput_OutBufferSize(1024);//发送缓冲区
m_mscommput_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_mscommput_InputMode(1);//以二进制方式读写数据
m_mscommput_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
//波特率
DWORD baudrate;
switch(m_CombolBaudrateGetCurSel())
{
case 0:
baudrate =115200;
break;
case 1:
baudrate =9600;
break;
default:
ASSERT(FALSE);
break;
}
CString setting;
settingFormat(_T("%d,n,8,1"),baudrate);
m_mscommput_Settings(setting/_T("115200,n,8,1")/);//波特率,无校验,8个数据位,1个停止1位
m_mscommput_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_mscommget_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_mscommget_Input();//读取缓冲区
safearray_inp= variant_inp;//变量转换
len= safearray_inpGetOneDimSize();//得到有效的数据长度
for (k=0;k<len;k++)
{
safearray_inpGetElement(&k,rxdata+k);
}
/char c_char; /
for (k=0;k<len;k++)
{
strtempFormat(_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_SendStringIsEmpty())
return;
if(m_AutoAddLF)
{
m_SendString +="\r\n";
}
m_mscommput_Output(COleVariant(m_SendString));
ShowInfo(m_SendString);
}
这是因为:窗口的点击事件优先级是最高的,所以别的控件更新速度都会更不上。你可以试试不断往CEdit里不断写数据,然后你点击窗口标题,会出现短暂的卡的现象。
解决办法是,先将串口写入一个自定义缓冲区内,然后再的更新界面。这样就不会受到用户窗口点击事件的影响了。
OnCancel和OnClose不应该重复调用基类函数,只调用一个即可,推荐OnCancel
单步调试中,在下方调用堆栈中,找到具体出错的程序代码(而不是系统代码),看看,是线程报错还是OnClose报错。
以上就是关于VC++中如何用MSComm控件实现串口通信全部的内容,包括:VC++中如何用MSComm控件实现串口通信、MFC用线程循环读串口,点击按钮出现卡的情况怎么处理、最近用VS2005写了个MFC多窗口工具,但是在关闭exe时,出现”应用程序错误“的提示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)