图1:Unicode编码Demo工程图
看了看Windows C/C++ 核心编程,作者强烈推荐程序采用Unicode编码编程。于是稍微改写了CSerialPort类的源码,并实现了一个小的Unicode串口通信Demo。
开发工具为VC2010。
CSerialPort.cpp改写的主要内容为:
1,将char改为wchar_t,字符或字符串添加L,如’N’改为L’N’,”COM%d”改为L”COM%d”.
2,改变相关函数名,如sprintf改为 swprintf并添加一个缓冲区大小的参数。具体为:
sprintf(szPort, ,"COM%d",portnr);改为:swprintf(szPort,100, L"COM%d",portnr);//100代表szPort大小,防止缓冲区溢出。
Strcpy改为wcscpy_s,strlen改为wcslen等等。主要是Unicode支持和安全处理,去掉警告信息。
3.添加了memset(&comstat,0,sizeof(COMSTAT)); 初始化
核心代码:
1:具体界面如上图1,点击发送按钮后,发送6字节数据123456到串口。代码如下:
void CUnicode_DemoDlg::OnBnClickedBtnSend(){
wchar_t data[6]={0x01,0x02,0x03,0x04,0x05,0x06};
SP.WriteToPort((wchar_t *)data,6*sizeof(wchar_t));
}
2:串口接收函数代码
long CUnicode_DemoDlg::OnComm(WPARAMch,LPARAMport)
{
rx_buffer[rx_count++]=ch;
if(6*sizeof(wchar_t)==rx_count){//当接收到了12个字节后,以16进制显示接收的数据。
Display(12);
}
return 0;
}
显示的Display函数:
void CUnicode_DemoDlg::Display(UINTcount)
{
if(6<=m_c_rx.GetLineCount())
m_rx.Empty();
rx_count=0;
CString strDebug;
for (UINTi=0;i<count;i++){//i+=2
strDebug.Format(L"%02X ",*(rx_buffer+i));
m_rx+=strDebug;
}
m_rx+="\r\n";
UpdateData(false);
}
工程已上传,地址为:http://download.csdn.net/detail/a379039233/4464546,有兴趣的可以看下哈。
串口通讯中只有字节流的概念,没有字符的概念,更没有字符编码的概念。如何理解字节流、如何编码,是通讯双方约定协议的事,和串口通讯其实没有关系。
所以上位机发送的是Unicode编码,要求下位机(单片机或者其他)也采用Unicode解析,就是把收到的两个字节看做一个字节,可以丢弃第二个字节(高端)。
其实好像没啥大用,因为串口通信一般都是ASCII码通信,采用Unicode开销大(多发了一倍的无效数据),而且处理下位机麻烦。
贻笑大方了。。。。。。