CC25300+ESP8266+C#上位机开发所用的字符转化函数,非常重要
2019-12-14 10:00:54
一、
把8266串口把字符串”3A00010A003023”发给2530,把字符串转化为十六进制字符串数组:
//字符串转换为十六进制字符数组
//char cArr[20] = “a1b2c3d4e5f6”; //字符个数双数,小写
//char cBrr[6] = {0xa1, 0xb2, 0xc3, 0xd4, 0xe5, 0xf6};
// 调用格式
// unsigned int SampleApp_TxLen_mqtt = strlen(SampleApp_TxBuf_mqtt) / 2;
// char* SampleApp_TxBuf_mqtt1;
// SampleApp_TxBuf_mqtt1 = (char*)SampleApp_TxBuf_mqtt; //强制转换为char
// StringToHex(SampleApp_TxBuf_mqtt1, SampleApp_TxBuf, &SampleApp_TxLen_mqtt);
注意uint8 char* 字符串数组后是指针字符串数组,使用是必须前面加“&”
int StringToHex(char *str, unsigned char *out, unsigned int *outlen)
{
char *p = str;
char high = 0, low = 0;
int tmplen = strlen(p), cnt = 0;
tmplen = strlen(p);
while(cnt < (tmplen / 2))
{
high = ((*p > '9') && ((*p <= 'F') || (*p <= 'f'))) ? *p - 48 - 7 : *p - 48;
low = (*(++ p) > '9' && ((*p <= 'F') || (*p <= 'f'))) ? *(p) - 48 - 7 : *(p) - 48;
out[cnt] = ((high & 0x0f) << 4 | (low & 0x0f));
p ++;
cnt ++;
}
if(tmplen % 2 != 0) out[cnt] = ((*p > '9') && ((*p <= 'F') || (*p <= 'f'))) ? *p - 48 - 7 : *p - 48;
if(outlen != NULL) *outlen = tmplen / 2 + tmplen % 2;
return tmplen / 2 + tmplen % 2;
}
二、CC2530把收到各终端传感器数据包NodeData[][]串口十六进制数组发送给8266
TxBuffer[0] = 0x3A;
TxBuffer[1] = 0x00;
TxBuffer[2] = 0xFF;
…
TxBuffer[113] = 0x23
HalUARTWrite(UART0, TxBuffer, MAX_NODE*6+6);
8266中串口中断函数uart0_rx_intr_handler(void *para)
接收到数据流为16进制,不能以字符串形式显示(乱码),必须用如下函数转化为字符串
//字节流转换为十六进制字符串
char *strD2 = (char*)os_zalloc(228 + 1);
os_memcpy(strD2, TempBuff, 228);
//strcat(strD2,dataBuf);
short i;
unsigned char highByte, lowByte;
for (i = 0; i < 114; i++)
{
highByte = TempBuff[i] >> 4;
lowByte = TempBuff[i] & 0x0f ;
highByte += 0x30;
if (highByte > 0x39)
strD2[i * 2] = highByte + 0x07;
else
strD2[i * 2] = highByte;
lowByte += 0x30;
if (lowByte > 0x39)
strD2[i * 2 + 1] = lowByte + 0x07;
else
strD2[i * 2 + 1] = lowByte;
}
//---------------------------------
三、c#客户端把从MQTT服务器接收来数据(3ABBFF017D…23)转化为两个一组的byte[] buffer(buffer[0]=0x3A; buffer[1]=0x00; …buffer[0]=0x23 )
string topic1 = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
byte[] buffer = strToToHexByte(topic1); //将字符串转化为16进制数组
// buffer[buffer.Length-2] = XorCheckSum(buffer, buffer.Length - 2); //重新计算替换回来0后的校验码 其实不用这一步,替换前和替换后的校验码值不变
for (int i = 0; i < MAX_NODE; i++) //这个过程实质就是把协调器数据仓库NodeData[i,j]中数据通过串口把数据复制到上位机数据仓库中对应的NodeData[i,j]
{
for (int j = 0; j < 6; j++)
{
NodeData[i, j] = buffer[i * 6 + 4 + j].ToString("G");
}
}
//--------------------------------------------------------------------------------------------------------
/// 字符串转16进制字节数组
/// </summary>
/// <param name="hexString"></param>
/// <returns></returns>
private static byte[] strToToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++)
{
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
//将BB代表0再替换回来
if (returnBytes[i] == 187)
{
returnBytes[i] = 0;
}
}
return returnBytes;
}