我用了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;
}
CE系统默认的字符串是Unicode格式,一个字符占用两个字节,高字节为零。但串口是以ASCII处理字符串的。
通过串口发送前,最好将Unicode转成ASCII
俺用C#开发,使用serialport类。
private void SendBytesData(SerialPort serialPort)
{
byte[] bytesSend="System".Text.Encoding.Default.GetBytes(txtSend.Text );
serialPort.Write(bytesSend, 0, bytesSend.Length);
}
CString strRecv((char*)buf);
应该是这儿有问题,但是应该怎么把buf里面的数据转换成16进制的数据读出来呢?
刚开始学不太懂!
lz的程序就差那么一点了。楼主可能看了UNICODE ANSI了,就不知怎么转换吧。
MultiByteToWideChar()这个函数就是实现这个功能的,具体自己看吧
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
Unicode和ANSIC之间的转换可以用这两个API来转:
wcstombs
mbstowcs