在编写VC++串口程序时,使用Unicode,发送汉字时,接收到的字符是乱码

时间:2021-07-25 00:04:23
在编写VC++串口程序时,使用Unicode,发送汉字时,接收到的字符是乱码,这是为什么?怎么改?请知道的有识之士帮忙解决一下,先谢谢啦!

2 个解决方案

#1


你最好确定一个发送到数据和接收的数据的BYTE流是否相同,
比如你发一个汉字 BYTE数据为 0xABCD 你接收到也应该是0xABCD,这样再来考虑为什么乱码.
如果相同,还是乱码,那应该是字符集环境不同

#2


那我怎没知道它们的BYTE流呢!我的只能发送和接收数字和字母!
m_ctrMscomm.put_Output(COleVariant(m_strEditTxData));//发送数据
下面是消息处理函数
void CSerialPortDlg::OnCommMscomm()     //串口事件的消息处理函数
{
// TODO: Add your message handler code here

    //m_ctrMscomm.put_RThreshold(1); 
    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);  //更新编辑框内容
}
请大家帮忙看一下!谢谢啦!

#1


你最好确定一个发送到数据和接收的数据的BYTE流是否相同,
比如你发一个汉字 BYTE数据为 0xABCD 你接收到也应该是0xABCD,这样再来考虑为什么乱码.
如果相同,还是乱码,那应该是字符集环境不同

#2


那我怎没知道它们的BYTE流呢!我的只能发送和接收数字和字母!
m_ctrMscomm.put_Output(COleVariant(m_strEditTxData));//发送数据
下面是消息处理函数
void CSerialPortDlg::OnCommMscomm()     //串口事件的消息处理函数
{
// TODO: Add your message handler code here

    //m_ctrMscomm.put_RThreshold(1); 
    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);  //更新编辑框内容
}
请大家帮忙看一下!谢谢啦!