VC++中如何用MSComm控件实现串口通信

VC++中如何用MSComm控件实现串口通信,第1张

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时,出现”应用程序错误“的提示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10183104.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存