串口通讯,奇怪的错误

羽道人 2014-07-06 09:05:52
先上代码:

//将单个字符转为相应的16进制数,否则返回16
char Hex2Char(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return 16;
}
//将CS中的字符串转为存储16进制数的CByteArray类型Hexs
//按照字符串中16进制字符进行转换,忽略所有非16进制字符
void CS2CB(CString &CS,CByteArray &Hexs)
{
INT_PTR len = CS.GetLength();
INT_PTR Len(0);//最终字节长度
Hexs.SetSize(len/2);
Hexs.RemoveAll();
BYTE HexH,HexL;//十六位的高低字节
//BYTE HexD(0);//十六进制数据
for( int k=0; k<len; k++)
{
if((HexH=Hex2Char(CS.GetAt(k)))<16)//找到一个字符为16进制数字为高位
{
do
{
k++;
}while(k<len && (HexL=Hex2Char(CS.GetAt(k)))==16);//找到下一个16进制数字为高位
if(k<len)
{
Hexs.Add(HexH*16+HexL);
Len++;
}
else
{
//找不到低位,则只有低位(高位变低位)
Hexs.Add(HexH);
Len++;
}
}
}
Hexs.SetSize(Len);
}
//将存储在CByteArray中的16进制数组,转化为表示16进制数的CString类型字符串
void CB2CS( CByteArray &Hex,CString &dst)
{
dst.Empty();
int k(0),len(Hex.GetSize());
for(;;)
{
dst.AppendFormat(_T("%x"),Hex.GetAt(k));
if(++k<len)
dst.Append(_T("-"));
else
break;
}
}
//目标函数
void C美国白蛾智能対靶喷药机器人软件Dlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
//发送按钮(发送内容)
UpdateData(TRUE);//读取编辑框内容
int sendMode = m_sendMode.GetCurSel();//获取发送模式代号
CString Msg=m_EditSend;//发送框的CString类型数据
CByteArray sendByte;//要发送的数组类型
INT_PTR sendLen(0);//最终发送数据长度
VARIANT OutM;//发送的实际数据
if( sendMode == 0)//发送模式:Cstring->Hex
{
OutM = COleVariant(Msg);
}
else if( sendMode == 1)//发送模式:Hex->Hex
{
CS2CB(Msg,sendByte);
//转化为输出类型
if(sendByte.IsEmpty())
return;
CString tempCS;
CB2CS(sendByte,tempCS);
AfxMessageBox(tempCS.GetString());//弹出窗口,检测转换效果
OutM = COleVariant(sendByte);
}
//---------出错语句----------------------------------------
m_mscomm.put_Output(OutM);//发送数据
//此处弹出错误窗口,窗口如图,没有任何提示。
//且当sendMode==0时不弹出错误,sendMode==1时弹出错误窗口
//----------------------------------------------------------
m_sendLogV.Append(m_EditSend);//将数据记录在记录框中
m_sendLogV.Append(_T("\r\n"));//换行
//m_EditSend.Empty();//清空输入框
UpdateData(FALSE);//更新编辑框
m_EDsendC.SetFocus();//焦点移交到发送框
}

很奇怪,不知是什么问题导致的,弹出错误窗口如下图:
用的VC2010和MSCOMM控件,
当Hex ->Hex时,发送的是CByteArray类型的数据报错为:
COleDispathException Waring: Uncaught exception in WinProc( return 1);
奇怪的是当Cstring->Hex时,发送的是CString类型的数据,一切正常!
故向各位大神求救!!!
...全文
595 2 点赞 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
阿先森 2014-08-27
我给你推荐一个简单高效的WIN32 COMM类,不仅可以用在WIN32项目也可以用在MFC项目里面。 http://www.cnblogs.com/EdmundDwyane/p/3174308.html 另外还有包含源码的DEMO http://www.cnblogs.com/EdmundDwyane/p/3443074.html 注意:文章中的CxComm是早期的名字,最近封装成DLL后,更名为CxSerial
  • 打赏
  • 举报
回复
羽道人 2014-07-06
好吧,刚刚解决了。。。。 不用中间变量OutM,直接用m_mscomm.put_Output(COleVariant(sendByte))发送数据就不会报错了 但不知道为什么,用中间变量可以传递发送CString但不能发送CByteArray!!! 同样是VARIANT类型,刚刚返回的和经过中间变量竟然是两种结果Why?难道CByteArray会变旧而作废,CString不会吗?
  • 打赏
  • 举报
回复
相关推荐
发帖
硬件/系统
创建于2007-09-28

2598

社区成员

VC/MFC 硬件/系统
申请成为版主
帖子事件
创建了帖子
2014-07-06 09:05
社区公告
暂无公告