大家好!我有个问题要请教一下!
我在用VC2005编写串口程序,使用Unicode码,在数据传输过程中,当我发送汉字时,接收到的却是乱码格式!请帮忙解决一下!非常感激!

解决方案 »

  1.   

    我使用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);  //更新编辑框内容
    }
    但是只能正常的接收和发送字母和数字,汉字则不可以!请大家帮忙指点一下!谢谢啦
      

  2.   

    BYTE bt=*(char*)(rxdata+k); //字符型
    strtemp.Format(L"%c",bt); //将字符送入临时变量strtemp存放// 这里有问题。
    // 你是用的unicode传的数据,unicode每个字符占两个字节。
      

  3.   

    // COleSafeArray 可以直接转为CStirng
    CString str;
    COleSafeArray sa;
    str = sa.bstrVal;
      

  4.   

    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);  //更新编辑框内容是这样子的吗?
    不过发送汉字,接收到的还是乱码呀?请指教!
    }
      

  5.   

    // 发送的时候,不是发送CStirng,是发送CStirng中的内容
    m_ctrMscomm.put_Output(COleVariant(m_strEditTxData));//发送数据
    m_strEditTxData.ReleaseBuffer();// 接收的时候
    variant_inp=m_ctrMscomm.get_Input();//读缓冲区
    CString str;
    str = variant_inp.bstrVal;
      

  6.   

    // 是1楼说的编码问题。
    // 在发送的时候,COleVariant将unicode的CSting转为了ANSI编码
    // 接收的时候也就成了ANSI编码
    // 要正确赋值给CString,需要做编码转换,将ANSI字符串转为unicode字符串。