MSCOMM二进制模式读取内容(中英混合)

来源:互联网 发布:mac 中文字体 ttf 编辑:程序博客网 时间:2024/05/20 12:25

中文会被处理成2个字节,需要自己合并起来。

从串口收到的字节是GBK2312编码类型

例如:中 编码为 :D6D0

收到两个字节后,需要做强制转换才能将编码转为中文

但是强制转换前,需将两个字节调转一下顺序,因为发来的第一个字节是高位字节,第二个字节是低位字节,即收到的是AB,

如果直接合并后转换的话,得不到原本意义的中文,这是因为将编码强制转换成字符串时,低位是低字节,高位是高字节

例如 UINT类型  4字节, 将其强制转为char型,一个char占一个字节.一个4字节的UINT类型会被处理成一个4字节char型。因为UINT类型初始化为0(因为字符串数组末尾需要加空字符结尾),所以在这个4字节数组下得到一个中文字符

var = m_comSearial.get_Input();

safeArray = var;
len = safeArray.GetOneDimSize();

UINT nTrail = 0;
UINT nCode = 0;
for (long k=0;k<len;k++)
{
safeArray.GetElement(&k,rxdata+k);



BYTE bt = *(BYTE*)(rxdata+k);
if (nTrail == 0 && _ismbblead(bt))
{
nTrail = bt;

continue;
}
else if(nTrail > 0 && _ismbbtrail(bt))
{



nCode = bt;
nCode = nCode << 8;
nCode+=nTrail;
nTrail = 0;
char *p = (char*)&nCode;


int nNumber = MultiByteToWideChar(CP_ACP,0,p,-1,NULL,0);
WCHAR *psz = new WCHAR[nNumber];
MultiByteToWideChar(CP_ACP,0,p,-1,psz,nNumber);
strTemp+=psz;
delete []psz;
}
else
{
strTemp.Format(_T("%c"),bt);
}

nCode = 0;
m_strrecv+=strTemp;
strTemp.Empty();


}