MFC串口通信编程,MSCOMM读取串口缓冲区数据失败,VARIANT InputData = m_mscom.GetInput();这条语句之后的代码都不执行

kms720 2016-06-25 06:36:44

/***************以下是打开串口的代码**********************/
void C串口通信Dlg::OnBnClickedButtonOpen()
{
CString str, str1, n;
GetDlgItemText(IDC_BUTTON_OPEN,str);
CWnd *h1;
h1 = GetDlgItem(IDC_BUTTON_OPEN);

if (!m_mscom.GetPortOpen())
{
m_mscom.SetCommPort(m_comb1.GetCurSel() + 1);//选择串口
if (!m_mscom.GetPortOpen())
m_mscom.SetPortOpen(TRUE);//打开串口
else
MessageBox(_T("cannot open serial port"));
m_comb2.GetLBText(m_comb2.GetCurSel(), str1);//获取所选择到的波特率将其放入到str1中
str1 = str1 + ',' + 'n' + ',' + '8' + ',' + '1';//这句话很关键
m_mscom.SetSettings(str1);//设置波特率
m_mscom.SetInputMode(1);//设置输入方式1 为二进制输入方式
m_mscom.SetRThreshold(1);//缓冲区》=1个字符触发事件
m_mscom.SetInputLen(0);//设置当前接收缓冲区数据长度为1024
//m_mscom.SetRTSEnable(1);//设置RT允许
if (m_mscom.GetPortOpen())
{
str = "关闭串口";
UpdateData(true);
h1->SetWindowText(str);
}
unsigned char InstStartRs[14] = { 238, 170, 01, 0, 01, 01, 0, 0, 01, 0, 0, 0, 0, 187 };
SendDataToCom(InstStartRs);
m_mscom.GetInput();//先预读缓冲区以清除残留数据
}
else
{
m_mscom.SetPortOpen(false);
if (str != "打开串口")
{
str = "打开串口";
UpdateData(true);
h1->SetWindowText(str);
}
}
}
/*****************发送数据的代码*************************/
void C串口通信Dlg::OnBnClickedButtonSend()//发送数据的按钮
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_mscom.SetOutput(COleVariant(m_Editsend));
}

/***********************接收到数据触发OnCommMscomm1()事件***********************/
void C串口通信Dlg::OnCommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
VARIANT InputData;
COleSafeArray fs;
BYTE rxdata[1024] = {0};
long len,k;
if (m_mscom.GetCommEvent() == 2)
{
InputData = m_mscom.GetInput();//读缓冲区
fs = InputData;//VARIANT型变À量转换为COleSafeArray型变量
len = fs.GetOneDimSize();
for (k = 0; k < len; k++)
fs.GetElement(&k, rxdata + k);//转换为BYTE型数组     
BYTE bt;

for (k = 0; k < len; k++)//将数组转化为CString型变量
{
bt = *(rxdata+k);
OnComByte(bt);
}

UpdateData(false);
}
}


void C串口通信Dlg::OnComByte(byte data)
{
if (data == 0xee && End_RData_Flag)
{
HeadFlag = true; // 文件头收到
m_nRxDataLength = 0;
m_strRXDataCOM[0] = data & 0xff;
End_RData_Flag = false;
}
else if (HeadFlag && data == 0xff)
{
Start_Rece_Flag = true;// 可以接收数据了
m_strRXDataCOM[1] = data & 0xff;
m_nRxDataLength = 2;
HeadFlag = false;
}
else if (Start_Rece_Flag && (!HeadFlag))
{
m_strRXDataCOM[m_nRxDataLength] = data & 0xff;
m_nRxDataLength++;
}
if (m_nRxDataLength == 18)
{
End_RData_Flag = true;
m_nRxDataLength = 0;
HeadFlag = false;
Start_Rece_Flag = false;
START_FLAG = true;
}
}


void C串口通信Dlg::SendDataToCom(unsigned char InstSend[14])
{
CByteArray hexdata;
for (int k = 0; k <= 14; k++)
hexdata.Add(InstSend[k]);
hexdata.SetSize(14);

m_mscom.SetOutput(COleVariant(hexdata)); //发送十六进制数据
}
...全文
2483 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
farfrome 2017-12-31
  • 打赏
  • 举报
回复
void CTabPage1::readComm2(CByteArray& arr) { if(h_mscomm1.get_PortOpen()){ if(h_mscomm1.get_InBufferCount()>0) { h_mscomm1.put_InputMode(1); //二进制模式输入 VARIANT var1; COleSafeArray arr1; var1=h_mscomm1.get_Input(); arr1=var1; DWORD len=arr1.GetOneDimSize(); long i=0; for(;i<len;i++) { BYTE byte_1; arr1.GetElement(&i,&byte_1); arr.Add(byte_1); } h_mscomm1.put_InBufferCount(0); //清空接收缓冲区 } } } CString CTabPage1::readComm() { CString str1=_T(""); if(h_mscomm1.get_PortOpen()){ if(h_mscomm1.get_InBufferCount()>0) { h_mscomm1.put_InputMode(0); //文本模式输入 VARIANT val=h_mscomm1.get_Input(); str1=val.bstrVal; h_mscomm1.put_InBufferCount(0); //清空接收缓冲区 } } return str1; } void CTabPage1::writeComm(CByteArray& arr) { if(h_mscomm1.get_PortOpen()){ h_mscomm1.put_OutBufferCount(0); //清空发送缓冲区 h_mscomm1.put_InputMode(1); h_mscomm1.put_Output(COleVariant(arr)); } } void CTabPage1::writeComm(CString str) { if(h_mscomm1.get_PortOpen()){ h_mscomm1.put_OutBufferCount(0); //清空发送缓冲区 h_mscomm1.put_Output(COleVariant(str)); } }
windforce1210 2017-11-06
  • 打赏
  • 举报
回复
是不是接收的阈值 没有设置啊! 默认是0好像不响应接收信息!改成1 可以在属性框里手动改,也可以用代码改!
北漂的牛犊 2017-10-26
  • 打赏
  • 举报
回复
引用 6 楼 liushuang548748264 的回复:
str1 = str1 + ',' + 'n' + ',' + '8' + ',' + '1';//这句作用是什么呢?哪位大神给个回复
str1是波特率,n表示没有校验位,8是8个数据位,1表示1个停止位
北漂的牛犊 2017-10-26
  • 打赏
  • 举报
回复
表示遇到同样的问题,我接了两个USB转串口,但我的只是针对某个串口,换个串口就可以接收了。但是下载的串口助手两个串口都可以正常接收数据。
北漂的牛犊 2017-10-26
  • 打赏
  • 举报
回复
这位客官用看到鸡啄米的教程吧
sichuanwww 2017-04-25
  • 打赏
  • 举报
回复
这种东西都是靠自己调试的, 先分离一下问题: 先用虚拟串口调试上位机程序,然后再调试下位机程序,看看问题在哪里。
worldy 2017-04-25
  • 打赏
  • 举报
回复
InputData = m_mscom.GetInput();//读缓冲区, 应该是此处发生了com错误,你没有使用try catch,因此错误递交到上级处理,故你其后的代码没有在执行 你使用try catch看看能否捕捉到错误
如影相随 2017-04-24
  • 打赏
  • 举报
回复
请问楼主问题解决了吗?遇到一样的问题getinput就退出了消息接收函数
cyz492824093 2017-04-01
  • 打赏
  • 举报
回复
一般来讲如果用虚拟串口调试可以接受的话那么你,就下位机的串口线驱动换一个新的。一般是驱动的问题
ruan1978 2017-03-24
  • 打赏
  • 举报
回复
这句话就是:波特率参数组合
liushuang548748264 2017-03-15
  • 打赏
  • 举报
回复
str1 = str1 + ',' + 'n' + ',' + '8' + ',' + '1';//这句作用是什么呢?哪位大神给个回复
Troyghf 2017-02-26
  • 打赏
  • 举报
回复
大兄弟,请问你串口接受数据的那部分解决了吗。。。怎么解决的啊。。求教啊
zgl7903 2017-01-10
  • 打赏
  • 举报
回复
BYTE rxdata[1024] for (k = 0; k < len; k++) fs.GetElement(&k, rxdata + k); 当 len 大于1024时 有越界问题
Andy20081251 2017-01-09
  • 打赏
  • 举报
回复
您好,这个问题解决了吗,能说下怎么解决的吗
赵4老师 2016-06-27
  • 打赏
  • 举报
回复
推荐使用串口调试助手。
kms720 2016-06-25
  • 打赏
  • 举报
回复
哪位大神使用过MSCOMM串口通信的麻烦给我指导一下!谢谢

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧