mfc comm通用程序 接收到的数据不完整少于29个。我用串口调试助手 每次接收到的29个字节的完整数据。 50

voidCStDlg::OnOnCommMscomm1(){//TODO:AddyourcontrolnotificationhandlercodehereVARIANT... void CStDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
m_EditRxData.Empty();
if(m_Comm1.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_Comm1.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<29;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<29;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%X",bt); //将字符送入临时变量strtemp存放
m_EditRxData+=strtemp; //加入接收编辑框对应字符串

}

}

UpdateData(FALSE); //更新编辑框内容
//SetDlgItemText(IDC_EditRxData,m_EditRxData);
//SetDlgItemText(IDC_Power,m_EditRxPower);
//SetDlgItemText(IDC_XGYRO,m_XGYRO);
//不使用UpdateData(FALSE);的原因是该函数会
//刷新整个对话框的数据,而SetDlgItemText()
//只更新接收编辑框的数据
}
展开
 我来答
射手小小王
2015-07-02 · TA获得超过398个赞
知道小有建树答主
回答量:716
采纳率:85%
帮助的人:256万
展开全部
串口收数据,有时候一次本来就收不完整,你需要有个接受缓存,收到的数据全部放到缓存中,当收集完整了,才开始干你的事情,收不完整,我经常遇到到,都是这样解决的

for(k=0;k<29;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
你这句有问题,如果你没有收到29个,就要出问题

for(k=0;k<29;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%X",bt); //将字符送入临时变量strtemp存放
m_EditRxData+=strtemp; //加入接收编辑框对应字符串

}
这个FOR也是同样的问题
追问
改成有效长度29改成 len (len=safearray_inp.GetOneDimSize()
)还是不行。“收到的数据全部存放到缓存中” 程序该怎么写。
上面这个程序是mfc 控件的一个通讯例子 抄的。 应该怎么改???
追答
你要单独定义一个成员变量(接受队列),收到数据就去先放在这个队列中,然后判断队列中有多少数据,如果数据达到你的解析长度了,就可以解析了,不对的数据从队列中删除掉,
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式