求助,用oncomm时间接收的数据不全

qq_38202110 2017-05-04 10:42:56
用VS中的mscomm控件写了一个串口上位机程序,但测试的时候发现,接收到的数据不全
当我发送1234时,可以收到1234,但当我发送123456时,只能收到12 56,当我发送12345678时,只能收到12 78,程序如下,求各位大神帮帮忙

这是初始化
m_ctrlcomm.put_CommPort(1); //选择COM1
m_ctrlcomm.put_Settings(_T("9600,n,8,1"));//波特率9600无检验位,8个数据位,1个停止位
m_ctrlcomm.put_InBufferSize(10000); //接收缓冲区
m_ctrlcomm.put_OutBufferSize(1024);//发送缓冲区
m_ctrlcomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_ctrlcomm.put_InputMode(1);//以二进制方式读写数据
m_ctrlcomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
oncomm事件
void CMFCApplication6Dlg::OnCommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
{
VARIANT variant_inp;
COleSafeArray safearry_inp;
LONG len,k;
BYTE rxdata[4096];
CString strtemp;
int order;
char *str;
CByteArray data;
if(m_ctrlcomm.get_CommEvent() == 2)//事件值为2表示接收缓冲区内有数据
{
variant_inp = m_ctrlcomm.get_Input();//读缓冲区
safearry_inp = variant_inp;//VARIANT转化为COleSafeArray
len = safearry_inp.GetOneDimSize();//字符长度
for(k=0;k<len;k++)
{
safearry_inp.GetElement(&k,rxdata+k);//转化为BYTE型数组
}
for(k=0;k<len;k++)//将数组转化成Cstring型变量
{
BYTE bt = *(char*)(rxdata+k);
if(m_checkdis.GetCheck())
{
strtemp.Format(_T(" %02X "),bt);
order=_tcstol(strtemp, NULL, 16);

}
else
{
strtemp.Format(_T("%c"),bt);
order = _ttoi(strtemp);

}
}//将字符送入临时变量strtemp中存放
Display1 += strtemp;//加入接收编辑框对应字符串
SetDlgItemText(IDC_EDIT_DISPLAY1,Display1);
m_editdisplay.LineScroll(m_editdisplay.GetLineCount()-1);

CSeries(m_chart.Series(0)).Add(order,_T(""),1);
CAxes chartaxis=(CAxes)m_chart.get_Axis();
CAxis chartaxisbottom=(CAxis)chartaxis.get_Bottom();
chartaxisbottom.Scroll(1,TRUE);
}

}
}
...全文
183 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_38202110 2017-05-05
  • 打赏
  • 举报
回复
引用 9 楼 turingo 的回复:
嗯,缓冲区是你自己定义的,每次事件你只需要把get_Input的数据push到你的FIFO缓冲区即可,调试的时候看你定义的缓冲区数据。
引用 8 楼 qq_38202110 的回复:
[quote=引用 7 楼 turingo 的回复:] DEBUG运行一段时间,然后停下来看缓冲区数据。 [quote=引用 6 楼 qq_38202110 的回复:] [quote=引用 5 楼 turingo 的回复:] 你可以先收到数据就直接往缓冲区里丢,看看是否单纯接受数据就有问题。 [quote=引用 4 楼 qq_38202110 的回复:] 把画图去掉后也还是这样,我觉得会不会是数据格式转换的时候有问题,求指点。
这个要怎么看啊?[/quote][/quote] 谢谢大神,是在调试窗口的内存中看吗,还是什么?另外是读variant_inp(variant_inp = m_ctrlcomm.get_Input())这个里边的数据吗?[/quote][/quote] 谢谢大神了,问题已解决,是逻辑问题。stremp转换一次就应该输出一次,不然之前的数据会丢。
qq_38202110 2017-05-04
  • 打赏
  • 举报
回复
大神大神求帮忙啊,用串口助手收的时候都正常。
图灵狗 2017-05-04
  • 打赏
  • 举报
回复
嗯,缓冲区是你自己定义的,每次事件你只需要把get_Input的数据push到你的FIFO缓冲区即可,调试的时候看你定义的缓冲区数据。
引用 8 楼 qq_38202110 的回复:
引用 7 楼 turingo 的回复:
DEBUG运行一段时间,然后停下来看缓冲区数据。 [quote=引用 6 楼 qq_38202110 的回复:] [quote=引用 5 楼 turingo 的回复:] 你可以先收到数据就直接往缓冲区里丢,看看是否单纯接受数据就有问题。 [quote=引用 4 楼 qq_38202110 的回复:] 把画图去掉后也还是这样,我觉得会不会是数据格式转换的时候有问题,求指点。
这个要怎么看啊?[/quote][/quote] 谢谢大神,是在调试窗口的内存中看吗,还是什么?另外是读variant_inp(variant_inp = m_ctrlcomm.get_Input())这个里边的数据吗?[/quote]
qq_38202110 2017-05-04
  • 打赏
  • 举报
回复
引用 7 楼 turingo 的回复:
DEBUG运行一段时间,然后停下来看缓冲区数据。
引用 6 楼 qq_38202110 的回复:
[quote=引用 5 楼 turingo 的回复:] 你可以先收到数据就直接往缓冲区里丢,看看是否单纯接受数据就有问题。 [quote=引用 4 楼 qq_38202110 的回复:] 把画图去掉后也还是这样,我觉得会不会是数据格式转换的时候有问题,求指点。
这个要怎么看啊?[/quote][/quote] 谢谢大神,是在调试窗口的内存中看吗,还是什么?另外是读variant_inp(variant_inp = m_ctrlcomm.get_Input())这个里边的数据吗?
图灵狗 2017-05-04
  • 打赏
  • 举报
回复
DEBUG运行一段时间,然后停下来看缓冲区数据。
引用 6 楼 qq_38202110 的回复:
引用 5 楼 turingo 的回复:
你可以先收到数据就直接往缓冲区里丢,看看是否单纯接受数据就有问题。 [quote=引用 4 楼 qq_38202110 的回复:] 把画图去掉后也还是这样,我觉得会不会是数据格式转换的时候有问题,求指点。
这个要怎么看啊?[/quote]
qq_38202110 2017-05-04
  • 打赏
  • 举报
回复
引用 5 楼 turingo 的回复:
你可以先收到数据就直接往缓冲区里丢,看看是否单纯接受数据就有问题。
引用 4 楼 qq_38202110 的回复:
把画图去掉后也还是这样,我觉得会不会是数据格式转换的时候有问题,求指点。
这个要怎么看啊?
图灵狗 2017-05-04
  • 打赏
  • 举报
回复
你可以先收到数据就直接往缓冲区里丢,看看是否单纯接受数据就有问题。
引用 4 楼 qq_38202110 的回复:
把画图去掉后也还是这样,我觉得会不会是数据格式转换的时候有问题,求指点。
qq_38202110 2017-05-04
  • 打赏
  • 举报
回复
把画图去掉后也还是这样,我觉得会不会是数据格式转换的时候有问题,求指点。
赵4老师 2017-05-04
  • 打赏
  • 举报
回复
降低波特率再试试。
图灵狗 2017-05-04
  • 打赏
  • 举报
回复
OnComm事件内不宜做长时间的事情,尤其是绘图之类的,你可以试着在OnComm事件内只把收到的数据放到缓冲区,然后在其它地方从缓冲区读取数据并显示。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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