求救:串口收不到电机的反馈信息,但是可以成功发命令给电机 串口通讯MSComm 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 MSComm控件 设置为 二进制 收发 void CMscommDlg::OnOnCommMscomm() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; UpdateData(); long len,k; byte rxdata[512]; //设置BYTE数组 CString strtemp; if(m_com.GetCommEvent()==2) //值为2表示接收缓冲区内有字符 { variant_inp=m_com.GetInput(); //读缓冲区消息 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型变量 { char bt=*(char*)(rxdata+k); //字符型 strtemp.Format(TEXT("%c"),bt); //将字符送入临时变量strtemp存放 strtemp.Format(_T("%c"),bt); m_rec+=strtemp; //加入接收编辑框对应字符串 } } if (!((m_rec.Right(1) == '\n')|| (m_rec.Right(1) == '\r'))) { CString temp=(TEXT("\r\n")); //显示完成后要自动换行 m_rec+=temp; } UpdateData(FALSE); //更新编辑框内容}代码如上,是copy网上的代码的,我也调试过,每当遇到GetInput()那里就出错... BOOL CMainFrame::OpenComm(){ if(!m_MSComm.GetPortOpen()) { //注意,须在打开串口之前设置串口属性 m_MSComm.SetCommPort(1);//选择com2 m_MSComm.SetInputMode(1); //以二进制方式输入数据 m_MSComm.SetInBufferSize(1024); //输入缓冲区大小 m_MSComm.SetOutBufferSize(1024); //输出缓冲区大小 m_MSComm.SetSettings("9600,n,8,1"); //串口属性设置COM_PAR_SETTINGS m_MSComm.SetRThreshold(5); //设置什么时候引发OnComm m_MSComm.SetInputLen(0); //设置当前接收区数据长度为0 m_MSComm.SetPortOpen(TRUE);//打开串口 m_MSComm.GetInput(); //先预读缓冲区以清除残留数据 } else { AfxMessageBox("串口已被占用!请选择其它串口!"); } return 0;}/////////////////////// if(m_MSComm.GetCommEvent() == 2) { variant_inp = m_MSComm.GetInput();//读缓冲区 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++) { BYTE bt = *(char*)(rxdata+k); strtemp.Format("%c",bt); strDisp+=strtemp; } } 我是在打开串口前已经设置了属性,并且串口可以正常打开,而且用虚拟串口可以和其他的串口助手通信,唯独在和电机进行通讯时无法接收到电机发来的信息···,跟踪后发现GetInput函数中报错了意外错误···不懂是怎么回事... m_MSComm.SetRThreshold(5); //设置什么时候引发OnComm 不能为 0, 起码1. 额,不懂了,后来用CSerial类就可以了···也方便点,支持异步操作···还是感谢schlafenhamster 的热心解答,我会试一下你说的方法的,试过后再说 关于openGL+MFC实现动画出现停止的问题 上位机软件 OnInitDialog() vc中如何绘制连续曲线 如何建立带滚动条的ATL复合控件? 请问制作控件属性页的问题 问几个菜鸟级问题 Bmp图片保存问题 gdi+ DrawCurve DrawLines DrawRectangles 都很慢 MFC对话框编程中,在另一个类中的函数修改对话框类中一个EDIT控件内容的方法? MFC 多文档 怎样通过代码设置指定的view或者子窗口显示 vs2012因安装了小助手而无法正常运行。
设置为 二进制 收发
void CMscommDlg::OnOnCommMscomm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp; COleSafeArray safearray_inp; UpdateData(); long len,k;
byte rxdata[512]; //设置BYTE数组
CString strtemp;
if(m_com.GetCommEvent()==2) //值为2表示接收缓冲区内有字符
{
variant_inp=m_com.GetInput(); //读缓冲区消息
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型变量
{
char bt=*(char*)(rxdata+k); //字符型
strtemp.Format(TEXT("%c"),bt); //将字符送入临时变量strtemp存放
strtemp.Format(_T("%c"),bt);
m_rec+=strtemp; //加入接收编辑框对应字符串
}
}
if (!((m_rec.Right(1) == '\n')|| (m_rec.Right(1) == '\r')))
{
CString temp=(TEXT("\r\n")); //显示完成后要自动换行
m_rec+=temp;
}
UpdateData(FALSE); //更新编辑框内容}代码如上,是copy网上的代码的,我也调试过,每当遇到GetInput()那里就出错...
{
if(!m_MSComm.GetPortOpen())
{
//注意,须在打开串口之前设置串口属性
m_MSComm.SetCommPort(1);//选择com2
m_MSComm.SetInputMode(1); //以二进制方式输入数据
m_MSComm.SetInBufferSize(1024); //输入缓冲区大小
m_MSComm.SetOutBufferSize(1024); //输出缓冲区大小
m_MSComm.SetSettings("9600,n,8,1"); //串口属性设置COM_PAR_SETTINGS
m_MSComm.SetRThreshold(5); //设置什么时候引发OnComm
m_MSComm.SetInputLen(0); //设置当前接收区数据长度为0
m_MSComm.SetPortOpen(TRUE);//打开串口
m_MSComm.GetInput(); //先预读缓冲区以清除残留数据
}
else
{
AfxMessageBox("串口已被占用!请选择其它串口!");
}
return 0;
}
///////////////////////
if(m_MSComm.GetCommEvent() == 2)
{
variant_inp = m_MSComm.GetInput();//读缓冲区
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++)
{
BYTE bt = *(char*)(rxdata+k);
strtemp.Format("%c",bt);
strDisp+=strtemp;
}
}
还是感谢schlafenhamster 的热心解答,我会试一下你说的方法的,试过后再说