Vc2010基于MFC对话框的串口通信 采用的mscomm控件 无法接收

u014528899 2014-04-03 03:33:03
本人VC小白,模仿别人的程序做了个串口通信的程序实现与STM32通信,但是这个却只能实现发送,在接收数据过程中get_Input()函数无法读取缓存区数据,经过设置断点调试,在variant_inp=m_mscomm.get_Input()处设置的断点,后来单步执行出现错误:为“f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\frame.cpp”查找源。Checksum: MD5 {2b 79 cd 8b f6 73 d3 19 1c 77 f4 ac 76 2 ae f2}
文件“f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\frame.cpp”不存在。

以下是部分源程序:

void CcommtestDlg::OnBnClickedButtonOpen()
{
// TODO: 在此添加控件通知处理程序代码
m_mscomm.put_CommPort(3); //set com3
m_mscomm.put_Settings("9600,n,8,1");//设置串口波特率9600,无校验,8位数据,1个停止位,
m_mscomm.put_InBufferSize(1024); //设置输入缓冲区大小
m_mscomm.put_OutBufferSize(1024);//设置输出缓冲区大小
m_mscomm.put_InputMode(1);//选择发送形式为二进制
m_mscomm.put_RThreshold(1);//当串口输入缓冲区有一个或者一个以上字符时激发ONCOMM事件转入ONCOMm事件处理程序
if(m_mscomm.get_PortOpen()) //检查串口状态,如果是打开的就把它关掉
{
m_mscomm.put_PortOpen(FALSE);
}
if(!m_mscomm.get_PortOpen())
{
m_mscomm.put_PortOpen(TRUE);
m_mscomm.put_InputLen(0); //读取缓冲区全部内容
m_mscomm.get_Input();//预读,清空缓冲区
AfxMessageBox(_T("the com3 is ready"));
}
else
{
m_mscomm.put_OutBufferCount(0);
AfxMessageBox(_T("the com3 is error"));
}
}


void CcommtestDlg::OnBnClickedButtonClose()
{
// TODO: 在此添加控件通知处理程序代码
m_mscomm.put_PortOpen(FALSE);//关闭串口
AfxMessageBox(_T("the com3 is close"));
}


void CcommtestDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
char TxData[100];
int Count = m_EditSend.GetLength();

for(int i = 0; i < Count; i++)
TxData[i] = m_EditSend.GetAt(i);

CByteArray array;
array.RemoveAll();
array.SetSize(Count+2);

for(int i = 0; i < Count; i++)
array.SetAt(i, TxData[i]);
array.SetAt(Count, '\r'); //在发送的字符后加入\r\n
array.SetAt(Count+1, '\n');
m_mscomm.put_Output(COleVariant(array));
m_EditSend.Empty();//清空编辑框
UpdateData(false);//更新编辑框内容
}
BEGIN_EVENTSINK_MAP(CcommtestDlg, CDialogEx)
ON_EVENT(CcommtestDlg, IDC_MSCOMM1, 1, CcommtestDlg::OnCommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()


void CcommtestDlg::OnCommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
//static unsigned int cnt=0;
VARIANT variant_inp;//计算机底层传回的是VARIANT数据类型
COleSafeArray safearray_inp;//由VARIANT派生的一种数据类型继承了VARIANT的特性
long len,k;
BYTE rxdata[1024]; //定义BYTE数组大小作用类似于单片机的数据缓存区SBUF
CString strtemp; //定义CString变量
if(m_mscomm.get_CommEvent ()==2 )//值为2时骸表括示接收缓冲区存在有效字符
{
// cnt++;
variant_inp=m_mscomm.get_Input();//读取缓冲区消息, 取得缓冲区所有内容赋给VARRINT型í变量variant_inp
safearray_inp=variant_inp;//变量转换
len=safearray_inp.GetOneDimSize();//得到有效的数据长度
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);//Element元a素
}
for(k=0;k<len;k++) //将数组转化为CString型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_EditReseive+=strtemp; //加入对应字符串data中
CString temp="\r\n"; //换行
m_EditReseive+=temp;
}
}
UpdateData(FALSE);
}
...全文
777 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheng_xu_yuan123 2016-09-11
  • 打赏
  • 举报
回复
引用 5 楼 u012406085 的回复:
这个问题我刚解决,赶紧过来给你解决问题哈! 你是不是使用了USB转232的线,如果是的话更新一下这根线的驱动就行了,程序没问题!!
我也遇到这种问题,但是我的EXE在我电脑上可以正常运行,串口可以正常通信,换到另一台电脑就不行了,串口不通信,,用的同一根USB转232的线,,这是啥情况,有明白的吗??给分析分析吧
dgjsdfgj 2014-07-09
  • 打赏
  • 举报
回复
http://travel.tianya.cn/travelPlan/showPlan?planId=937948 http://travel.tianya.cn/travelPlan/showPlan?planId=937950 http://travel.tianya.cn/travelPlan/showPlan?planId=937951
哈利伯热 2014-07-09
  • 打赏
  • 举报
回复
这个问题我刚解决,赶紧过来给你解决问题哈! 你是不是使用了USB转232的线,如果是的话更新一下这根线的驱动就行了,程序没问题!!
u014528899 2014-04-06
  • 打赏
  • 举报
回复
引用 2 楼 zgl7903 的回复:
用API吧,控件的兼容性不是很好,效率也不高 Serial Communications
本人还没系统的学过,只是稍微了解了点,所以对我来说用API写也不是件容易的事
u014528899 2014-04-06
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
缓冲区中的数据打印分析一下
我新手,都不知道怎么打印缓冲区数据
zgl7903 2014-04-04
  • 打赏
  • 举报
回复
用API吧,控件的兼容性不是很好,效率也不高 Serial Communications
oyljerry 2014-04-03
  • 打赏
  • 举报
回复
缓冲区中的数据打印分析一下

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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