// 把byte型数据转换为无符号long型数据
private static long byteToul(byte b) {
return b >0 ?b : ( b & 0x7F + 128);
}
// 把byte类型的数据转换成十六进制ASCII字符表示
private static String byteToHEX(byte in) {
char[] DigitStr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F' };
char[] out = new char[2];
out[0] = DigitStr[(in >> 4) & 0x0F]; //取高4位
out[1] = DigitStr[in & 0x0F]; //取低4位
String s = new String(out);
return s;
}
// 将long型数组按顺序拆成byte型数组,长度为len
private void Encode(byte[] output, long[] input, int len) {
int i, j;
for (i = 0, j = 0; j < len; i++, j += 4) {
output[j] = (byte) (input[i] & 0xffL);
output[j + 1] = (byte) ((input[i] >>> 8) & 0xffL);
output[j + 2] = (byte) ((input[i] >>> 16) & 0xffL);
output[j + 3] = (byte) ((input[i] >>> 24) & 0xffL);
}
}
// 将byte型数组按顺序合成long型数组,长度为len
private void Decode(long[] output, byte[] input, int len) {
int i, j;
for (i = 0, j = 0; j < len; i++, j += 4)
output[i] = byteToul(input[j])
| (byteToul(input[j + 1]) << 8)
| (byteToul(input[j + 2]) << 16)
| (byteToul(input[j + 3]) << 24);
return;
}
}
一个数据包,其串头为一个字符,字符值为7EH(16进制)'~',其后紧跟一字符‘E’,然后是数据串,串尾也为字符值为7EH的一个字符:
即 ~Exxxxxx...~ 如何处理这些数据?
我们仍以串口调试助手源程序及其详细编程过程之一 中的OnComm()处理为例:
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ 以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
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("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串,在这儿,编辑框不是必须的,可做相应处理
char ch=(char)bt;
if(ch=='E')
{
//在此处设置一个可以接收数据的全局标志,说明接收到数据前的‘E’标志了,下一步可以读数据了,同时将m_strRXData清空
flag=2;
m_strRXData.Empty(); //下一次接收的便为有用的数据
}
if(ch==0x7e)
{
flag=1; //下面可以提取数据了
}
if(flag==1) //标志为1,
{
...//提取数据
flag=0; //提取完后,置标志为0
}
}
}
//UpdateData(FALSE); //更新编辑框内容
}
/*------------------------------------------------------------
函数名 : TransData(CString InStr, PUCHAR OutStr) 功 能 : 将字符串转换成十六进制数据 参 数 : CString InStr [in] 输入字符串 PUCHAR OutStr [out] 输出转换后数据的指针 返回值 : BOOL,正确返回TRUE,错误返回FALSE ------------------------------------------------------------*/ BOOL TransData(CString InStr, PUCHAR OutStr) { UINT i = 0, j = 0; UINT len = 0; UCHAR Str[KEY_LEN * 2]; len = InStr.GetLength(); if ((len % 2) != 0) { MessageBox("请按要求输入!", "错误", MB_OK | MB_ICONERROR); return FALSE; } memset(OutStr, 0, sizeof(UCHAR[KEY_LEN])); memset(Str, 0, sizeof(UCHAR[KEY_LEN * 2])); strcpy((char*)(Str), InStr.GetBuffer(0)); InStr.ReleaseBuffer(); for(i = 0; i < len; i++) { if ((Str[i] > 47) && (Str[i] < 58)) { Str[i] -= 48; } else if ((Str[i] > 64) && (Str[i] < 71)) { Str[i] -= 55; } else if ((Str[i] > 96) && (Str[i] < 103)) { Str[i] -= 87; } else { MessageBox("数据格式错误!", "错误", MB_OK | MB_ICONERROR); return FALSE; } } i = 0; while(i < len) { // 转换 Str[j] = Str[i] * 16 + Str[i + 1]; i += 2; j++; } |