WinCE下串口通信问题

ztd321   2009-7-29 11:22 楼主
我用了EVC高级编程里面的串口通讯类
接收数据时字符变量可以正常显示,我想接收16进制的数据应该怎么显示。
在发送数据的时候,我在电脑上用ASCII码显示数据时,只能显示第一个字符,用HEX编码显示时能都显示出来但是在每个两个字符中间都加了00,如发送1234时,ASCII码显示只有一个1,HEX码却显示3100320033003400,

下面是部分代码:


发送:
void CSeriesSampleDlg::OnBtnsend()
{
        UpdateData(TRUE);
    BYTE * buf;
        int bufLen = m_strSend.GetLength()*2;
        buf = new BYTE(bufLen);
        CopyMemory(buf,m_strSend.GetBuffer(m_strSend.GetLength()),bufLen);
        if (!m_ceSeries.WritePort(buf,bufLen))
        {
                AfxMessageBox(L"写入失败");
        }
}

接收:
void CSeriesSampleDlg::OnSeriesRead(CWnd* pWnd,BYTE* buf,int bufLen)
{
        CSeriesSampleDlg *pDlg = (CSeriesSampleDlg *)pWnd;
        CEdit * pEdit;
        pEdit = (CEdit*)pDlg->GetDlgItem(IDC_EDTRECV);

        CString strRecv((char*)buf);
        CString strOld;
        pEdit->GetWindowText(strOld);
        pEdit->SetWindowText(strOld + strRecv);
   
        delete[] buf;
}

回复评论 (14)

注意UNICODE字符。
点赞  2009-7-29 12:09
要怎么修改才能收发16进制的数据啊!!
点赞  2009-7-29 12:41
能说的详细点吗?

有相关的文章也行。。。。。
点赞  2009-7-29 13:23
CE系统默认的字符串是Unicode格式,一个字符占用两个字节,高字节为零。但串口是以ASCII处理字符串的。

通过串口发送前,最好将Unicode转成ASCII
点赞  2009-7-29 13:38
俺用C#开发,使用serialport类。
private   void   SendBytesData(SerialPort   serialPort)
{
    byte[]   bytesSend="System".Text.Encoding.Default.GetBytes(txtSend.Text   );
    serialPort.Write(bytesSend,   0,   bytesSend.Length);
}
点赞  2009-7-29 13:44
提醒一下楼主:


什么叫做字符串?你真的明白了吗?
点赞  2009-7-29 15:07
CString strRecv((char*)buf);
应该是这儿有问题,但是应该怎么把buf里面的数据转换成16进制的数据读出来呢?

刚开始学不太懂!
点赞  2009-7-29 15:53
引用: 引用 7 楼 hdzjw 的回复:
CString strRecv((char*)buf);
应该是这儿有问题,但是应该怎么把buf里面的数据转换成16进制的数据读出来呢?

刚开始学不太懂!



你发送和接收都是正确的,没有错误!


错误的是你的理解!


可以先看看:

1、什么叫做 字符串?

2、UNICODE 与 ANSI 的区别。
点赞  2009-7-29 15:56
lz的程序就差那么一点了。楼主可能看了UNICODE ANSI了,就不知怎么转换吧。
MultiByteToWideChar()这个函数就是实现这个功能的,具体自己看吧
点赞  2009-7-29 16:30
OK
读出数据已经好了
能显示16进制文件了
void CComtestDlg::OnSeriesRead(CWnd* pWnd,BYTE* buf,int bufLen)
{
        CComtestDlg *pDlg = (CComtestDlg *)pWnd;
        CEdit * pEdit;
        pEdit = (CEdit*)pDlg->GetDlgItem(IDC_EDIT_RECV);



         CString sResult;
    for(int i=0;i         {
        CString s;
        s.Format(_T("%2.2X"),buf);
        sResult+=s;
    }

        CString strOld;
        pEdit->GetWindowText(strOld);
        pEdit->SetWindowText(strOld + sResult);
   
        delete[] buf;

}
谢谢 zaodt
点赞  2009-7-31 12:00
改好发数据之后散分
点赞  2009-7-31 12:01
那就等着早点散分,接一点点分 ∧_∧
点赞  2009-7-31 12:58
Unicode和ANSIC之间的转换可以用这两个API来转:
wcstombs
mbstowcs
点赞  2009-7-31 13:22
学习 收藏
点赞  2009-8-1 16:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复