VC2005编写串口程序,使用Unicode码,在数据传输过程中,当我发送汉字时,接收到的却是乱码格式! 大家好!我有个问题要请教一下!我在用VC2005编写串口程序,使用Unicode码,在数据传输过程中,当我发送汉字时,接收到的却是乱码格式!请帮忙解决一下!非常感激! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我使用MSCOMM控件编写的串口程序!用UNICODE码这是我的部分程序!void CSerialPortDlg::OnBnClickedButtonManualsend(){ // TODO: Add your control notification handler code here //ComNum = m_ctrMscomm.GetComm UpdateData(TRUE); //读取编辑框内容 if(m_ctrMscomm.get_PortOpen()) { m_ctrMscomm.put_Output(COleVariant(m_strEditTxData));//发送数据 else { AfxMessageBox(_T("串口未打开,请打开串口")); }}下面是其消息处理函数:void CSerialPortDlg::OnCommMscomm() //串口事件的消息处理函数{ // TODO: Add your message handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; wchar_t rxdata[2048]; //设置BYTE数组 CString strtemp; if(2==m_ctrMscomm.get_CommEvent()) //事件值为2表示接收缓冲区内有字符 { variant_inp=m_ctrMscomm.get_Input();//读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组 for(k=0;k<len;k++) //将数组转换为Cstring型变量 { BYTE bt=*(char*)(rxdata+k); //字符型 strtemp.Format(L"%c",bt); //将字符送入临时变量strtemp存放 m_strEditRxData+=strtemp; //加入接收编辑框对应字符串 rxcount=strtemp.GetLength()+rxcount; m_strStaticRxcount.Format(L"%ld", rxcount); GetDlgItem(IDC_STATIC_RXCOUNT)->SetWindowText(m_strStaticRxcount); } } UpdateData(FALSE); //更新编辑框内容}但是只能正常的接收和发送字母和数字,汉字则不可以!请大家帮忙指点一下!谢谢啦 BYTE bt=*(char*)(rxdata+k); //字符型strtemp.Format(L"%c",bt); //将字符送入临时变量strtemp存放// 这里有问题。// 你是用的unicode传的数据,unicode每个字符占两个字节。 // COleSafeArray 可以直接转为CStirngCString str;COleSafeArray sa;str = sa.bstrVal; void CSerialPortDlg::OnCommMscomm() //串口事件的消息处理函数{ // TODO: Add your message handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; wchar_t rxdata[2048]; //设置BYTE数组 CString strtemp; if(2==m_ctrMscomm.get_CommEvent()) //事件值为2表示接收缓冲区内有字符 { variant_inp=m_ctrMscomm.get_Input();//读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 strtemp = safearray_inp.bstrVal; m_strEditRxData+=strtemp; } UpdateData(FALSE); //更新编辑框内容是这样子的吗?不过发送汉字,接收到的还是乱码呀?请指教!} // 发送的时候,不是发送CStirng,是发送CStirng中的内容m_ctrMscomm.put_Output(COleVariant(m_strEditTxData));//发送数据m_strEditTxData.ReleaseBuffer();// 接收的时候variant_inp=m_ctrMscomm.get_Input();//读缓冲区CString str;str = variant_inp.bstrVal; // 是1楼说的编码问题。// 在发送的时候,COleVariant将unicode的CSting转为了ANSI编码// 接收的时候也就成了ANSI编码// 要正确赋值给CString,需要做编码转换,将ANSI字符串转为unicode字符串。 C++不垃圾,只是Java很傲慢 请问vc6的MSDN上那能下到? 能帮我看下下面这个奇怪的问题吗? 关于几个对话框弹出,显示层次的问题 大家好,帮看一下这个计数器,为什么上传后只是计数为一然后就不再计数了呀? 请问:构件,com,activeX,bean是不是相同的概念?com+和EJB呢? CAysncSocket 类的问题????? 我有一个关于windows服务的问题,请高手解答,分不够可以再加 (请大家讨论)如何实现语音识别? MFC 串口通信程序 get_Input()函数出现异常 请问opencv2.2中如何使用cvvimage 关于skin++与背景图的问题
这是我的部分程序!
void CSerialPortDlg::OnBnClickedButtonManualsend()
{
// TODO: Add your control notification handler code here
//ComNum = m_ctrMscomm.GetComm
UpdateData(TRUE); //读取编辑框内容
if(m_ctrMscomm.get_PortOpen())
{
m_ctrMscomm.put_Output(COleVariant(m_strEditTxData));//发送数据
else
{
AfxMessageBox(_T("串口未打开,请打开串口"));
}
}
下面是其消息处理函数:
void CSerialPortDlg::OnCommMscomm() //串口事件的消息处理函数
{
// TODO: Add your message handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
wchar_t rxdata[2048]; //设置BYTE数组
CString strtemp;
if(2==m_ctrMscomm.get_CommEvent()) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrMscomm.get_Input();//读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format(L"%c",bt); //将字符送入临时变量strtemp存放
m_strEditRxData+=strtemp; //加入接收编辑框对应字符串
rxcount=strtemp.GetLength()+rxcount;
m_strStaticRxcount.Format(L"%ld", rxcount);
GetDlgItem(IDC_STATIC_RXCOUNT)->SetWindowText(m_strStaticRxcount); }
}
UpdateData(FALSE); //更新编辑框内容
}
但是只能正常的接收和发送字母和数字,汉字则不可以!请大家帮忙指点一下!谢谢啦
strtemp.Format(L"%c",bt); //将字符送入临时变量strtemp存放// 这里有问题。
// 你是用的unicode传的数据,unicode每个字符占两个字节。
CString str;
COleSafeArray sa;
str = sa.bstrVal;
{
// TODO: Add your message handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
wchar_t rxdata[2048]; //设置BYTE数组
CString strtemp;
if(2==m_ctrMscomm.get_CommEvent()) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrMscomm.get_Input();//读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
strtemp = safearray_inp.bstrVal;
m_strEditRxData+=strtemp;
}
UpdateData(FALSE); //更新编辑框内容是这样子的吗?
不过发送汉字,接收到的还是乱码呀?请指教!
}
m_ctrMscomm.put_Output(COleVariant(m_strEditTxData));//发送数据
m_strEditTxData.ReleaseBuffer();// 接收的时候
variant_inp=m_ctrMscomm.get_Input();//读缓冲区
CString str;
str = variant_inp.bstrVal;
// 在发送的时候,COleVariant将unicode的CSting转为了ANSI编码
// 接收的时候也就成了ANSI编码
// 要正确赋值给CString,需要做编码转换,将ANSI字符串转为unicode字符串。