MFC串口通讯问题
各位大神好!我的主界面上有一个Mscomm串口控件,要用这个控件获取发来的数据。我发给接收方的是指令,我发一条,对方接收一条,返回数据后,我才能再发第二条。这些指令要不断的发,以获取接收方实时信息。(自己发自己接来测试功能)
我的方法是,设置一个定时器,希望在定时器中发送指令。但是由于必须接收到反馈信息之后我才能发送第二条指令,经过测试,我依次发送4条指令,每条指令间Sleep(250),串口接收数据时依然一次性接收到我发的4条指令,而不是一条一条接收。我对串口的消息响应机制还不是特别了解,请大神们帮帮忙!谢谢~
我的方法是,设置一个定时器,希望在定时器中发送指令。但是由于必须接收到反馈信息之后我才能发送第二条指令,经过测试,我依次发送4条指令,每条指令间Sleep(250),串口接收数据时依然一次性接收到我发的4条指令,而不是一条一条接收。我对串口的消息响应机制还不是特别了解,请大神们帮帮忙!谢谢~
// 这里是串口响应函数,串口接收到消息后会调用它
void CRobotControlDlg::OnCommMscomm()
{
// TODO: 在此添加命令处理程序代码
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
unsigned int data[2048]={0};
byte rxdata[2048]={0}; // 设置BYTE 数组
CString strtemp=NULL;
CString strReceive=NULL; // 该变量保存串口接收到的数据
if( m_MSComm.get_CommEvent()==2 ) // 值为2 表示接收缓冲区内有字符
{
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);
}
for(k=0;k<len;k++) // 将数组转换为CString 型变量
{
strtemp.Format(_T("%c"),*(rxdata+k)); // “%c”将数据从unsigned char转成string;“%x”将数据转成16进制
strReceive += strtemp;
}
CString temp=_T("\r\n"); // 换行
strReceive += temp;
DataHandler(strReceive); // 抛给数据处理函数
}
}
// 以下是定时器函数中,向对方发送指令的部分
// 使用串口功能
CString strSend1,strSend2; // 指令1和指令2,对方接收到指令后会回复响应的内容。
strSend1 = "123456789<counts>";
strSend2 = "PFB";
if (m_MSComm.get_PortOpen())
{
m_MSComm.put_Output(COleVariant(strSend1)); //发送数据
Sleep(50);
}
if (m_MSComm.get_PortOpen())
{
m_MSComm.put_Output(COleVariant(strSend2)); //发送数据
Sleep(50);
}
...全文
相关推荐
简单的MFC串口通讯 源代码
**错误处理**:在串口通讯中,错误处理是必不可少的。通过`GetLastError()`和`ClearError()`函数,我们可以及时发现并解决串口操作中的问题。6.
MFC串口V2.zip_MFC 串口通讯_mfc 开发 v2_vc 串口_vc 串口_串口 mfc
CAsyncMutex用于解决多线程环境下串口资源的竞争问题,而CEvtHandler则用于处理串口的读写事件,确保数据的正确传输。
mfc 串口通讯制作向导和完整的程序
本项目“mfc 串口通讯制作向导和完整的程序”是一个专门针对MFC框架下的串口通讯实现的实例教程。对于想要学习MFC以及串口通讯的初学者来说,这是一个宝贵的资源。
MFC与PLC半双工串口通讯 项目实例 可直接使用 上下位机都有
总结来说,MFC与PLC的半双工串口通讯是一个涉及硬件接口、通信协议、软件编程等多个层面的综合技术问题。
VC6-MFC-多线程串口通讯实例.zip
本篇将深入探讨如何在VC6环境下,利用MFC构建一个多线程的串口通讯实例。1.


硬件/系统
