MFC 采用CSComm控件怎么清空串口缓存区

琴晏 2014-04-15 10:59:31
小弟在做一个串口通讯的程序,设备是一个控制器。输入的指令通过串口传入,然后控制器反馈从串口读取。现在我的问题是怎样清空输入缓存?现在用串口助手进行调试,因为我反馈一次数据后后,再反馈第二次时发现字串还包含第一次的内容,我觉得应该是输入缓存没有清空的原因吧?求各位大大帮帮忙啊。
...全文
628 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
任小林子 2015-12-19
  • 打赏
  • 举报
回复
请问楼主,你所提的问题已经解决了吗,我也遇到了同样的问题,求解啊?
琴晏 2014-04-15
  • 打赏
  • 举报
回复
引用 13 楼 worldy 的回复:
想法问题,但你的程序是无法影响到串口助手的。你这个问题建议你先查一下下位机的程序,是否重复发送数据
下位机程序?是指协议?
worldy 2014-04-15
  • 打赏
  • 举报
回复
少打了一个字 想法没问题,但你的程序是无法影响到串口助手的。你这个问题建议你先查一下下位机的程序,是否重复发送数据
worldy 2014-04-15
  • 打赏
  • 举报
回复
想法问题,但你的程序是无法影响到串口助手的。你这个问题建议你先查一下下位机的程序,是否重复发送数据
琴晏 2014-04-15
  • 打赏
  • 举报
回复
引用 11 楼 worldy 的回复:
现在用串口助手进行调试?那你的代码怎么可能影响串口助手?你下位机发送的问题吧? 一般串口数据读出后即自动被清除,一般是不需要程序干预的
我的想法是用串口助手进行模拟。当串口助手接收到命令时,我用串口助手模拟反馈,不知道这样的想法对不对。
worldy 2014-04-15
  • 打赏
  • 举报
回复
现在用串口助手进行调试?那你的代码怎么可能影响串口助手?你下位机发送的问题吧? 一般串口数据读出后即自动被清除,一般是不需要程序干预的
琴晏 2014-04-15
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
m_ctrlComm.put_InputLen(0); 这个才是清除接收缓存区
我程序里面有这个啊。难道是位置不对?我试了还是不可以啊
worldy 2014-04-15
  • 打赏
  • 举报
回复
m_ctrlComm.put_InputLen(0); 这个才是清除接收缓存区
琴晏 2014-04-15
  • 打赏
  • 举报
回复
引用 7 楼 worldy 的回复:
CSComm是什么控件?那你得查看其文档,看使用什么函数清空缓存区
囧,是mscomm控件 下面是我输出函数代码,麻烦您看看 CString output() { VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048];//用于存放接收到的数据,BYTE格式(即CHAR格式) CString strtemp;//可将转换成字符串格式后的串口数据存入此变量 //读缓冲区数据并进行转换 if(m_ctrlComm.get_CommEvent()==2)//事件值为2表示接收缓冲区内有字符 { variant_inp=m_ctrlComm.get_Input();//读缓冲区 safearray_inp=variant_inp;//将VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize();//得到有效数据长度 for(k=0;k<len;k++) { safearray_inp.GetElement(&k,rxdata+k); m_ctrlComm.put_InputLen(0); } for(k=0;k<len;k++)//将数组转换为Cstring型变量 { BYTE bt=*(char*)(rxdata+k); //字符型 strtemp.Format(_T("%c"),bt);//将字符送入临时变量strtemp存放 m_l+=strtemp; //加入接收编辑框对应字符串 } } //safearray_inp.Clear (); //memset(rxdata,NULL,2048); //m_ctrlComm.put_InBufferCount(0); //m_ctrlComm.get_Input(); 这是我尝试过的清除方法。但是都不管用 return 0; }
worldy 2014-04-15
  • 打赏
  • 举报
回复
CSComm是什么控件?那你得查看其文档,看使用什么函数清空缓存区
琴晏 2014-04-15
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
如果是使用api则使用PurgeComm函数,如果是mscomm控件应该是设置InBufferLen属性=0
刚刚我看错了,我设置的是inputLen.我刚刚试你这个指令,显示不是其成员函数啊。
琴晏 2014-04-15
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
如果是使用api则使用PurgeComm函数,如果是mscomm控件应该是设置InBufferLen属性=0
我设置了,还是会出现那种情况啊,囧
琴晏 2014-04-15
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
使用控件还是api?
使用的是CSComm控件
worldy 2014-04-15
  • 打赏
  • 举报
回复
如果是使用api则使用PurgeComm函数,如果是mscomm控件应该是设置InBufferLen属性=0
worldy 2014-04-15
  • 打赏
  • 举报
回复
使用控件还是api?
琴晏 2014-04-15
  • 打赏
  • 举报
回复
我还通过m_ctrlComm.put_InBufferSize(2);//设置输入缓冲区大小,进行控制缓存区字符的数量,结果还是没有用。

3,245

社区成员

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

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