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()
//只更新接收编辑框的数据
} 展开
{
// 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()
//只更新接收编辑框的数据
} 展开
展开全部
串口收数据,有时候一次本来就收不完整,你需要有个接受缓存,收到的数据全部放到缓存中,当收集完整了,才开始干你的事情,收不完整,我经常遇到到,都是这样解决的
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也是同样的问题
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 控件的一个通讯例子 抄的。 应该怎么改???
追答
你要单独定义一个成员变量(接受队列),收到数据就去先放在这个队列中,然后判断队列中有多少数据,如果数据达到你的解析长度了,就可以解析了,不对的数据从队列中删除掉,
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询