|
本帖最后由 951319804 于 2022-12-4 23:30 编辑
上位机:STM32F407VET6 下位机:DC电源
目的:上位机读取DC电源的各项参数以及控制。
通讯Log如下:
上位机发送:MON?[CR](4D 4F 4E 3F 0D)
下位机数据转换成字符:00000,00000,50,50,000000,00000,0
下位机返回:30 30 30 30 30 2C 35 30 2C 35 30 2C 30 30 30 30 30 30 2C 30 30 30 30 30 2C 31 0D
问题:返回的是Ascii码,返回数据有负数,整数,小数点,字符N,而且数位置不定,需要将数据转换成MCU可以识别的数据,进行控制。
以下是我写的解析代码,首先是先将每个字符进行对比判断,通过switch 进行分类储存在一个结构体变量(比如:指针里面)再返回调用函数进行控制。
遇到逗号,就认为是一个数完成,记住逗号位置,再进行逗号分隔出,每一个数据。
接下来我就不知道怎么控制了。
代码如下:// UART2 接收数据处理
#if (UART2_EN > 0)
void Uart2_UserProcess(INT8U *p, INT16U len)
{
INT16U i,j;
// INT16U *TEMP7;
// INT16U TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6;
#if (APP_UART_DEBUG_EN > 0) // 条件编译使能接收数据打印输出
// 打印数据输出到调试串口(注意: 按16进制数据打印)
#if (AT_EN > 0)
if (LibAppVars.Para.ATFlag&AT_UART_FLAG) // 判断AT配置参数是否允许打印输出
#endif
{
printf("AT+UART2=RX[%d]:", len);
for(i=0; i<MIN(len-1, DEBUG_MAX_DATA_LEN); i++)
{
printf("%02x ", p);
}
printf("%02x\r\n", p);
Uart2_Receive_Data_Analysis(p,len);
}
#endif
// 用户在这里处理UART2接收到的数据: 数据指针p, 数据长度len
//
// 记录数据指针及长度
UserVars.Uart2.p = p;
UserVars.Uart2.len = len;
UserVars.WKFlag |= USER_UART2_UPDATE_FLAG; // 设置UART2收到新数据标志
#if (APP_UART2_TEST_EN > 0)
// 测试功能: 将数据在原样发送回去
// Uart_Write(UART2_ID, p, len);
// Uart_UserSendData(UART2_ID, p, len, 1, 0);
#endif
}
#endif
-----------------------------------------------------------------------------------------------
以下是解析函数
void Uart2_Receive_Data_Analysis(INT8U *Uart2_RXD_Buf,INT8U Rx_Length)
{
INT8U i;
USER_UART2_AsciiCode_VARS UART2_AsciiCode_Analysis;
for(i=0;i<Rx_Length;i++)
{
UART2_AsciiCode_Analysis=Uart2_AsciiCode__Analysis(Uart2_RXD_Buf,i);
}
}
-----------------------------------------------------------------------------------------------------------
USER_UART2_AsciiCode_VARS Uart2_AsciiCode__Analysis(INT8U AsciiCode,INT8U Index)
{
USER_UART2_AsciiCode_VARS UART2_AsciiCode_Return;
switch (AsciiCode)
{
case '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9':
UART2_AsciiCode_Return.Number[Index]=ASCII_to_Hex(AsciiCode);
break;
case ',':
UART2_AsciiCode_Return.CommaPostion[Index]=ASCII_to_Hex(AsciiCode);
break;
case '.':
UART2_AsciiCode_Return.Decimal_PointPosition[Index]=ASCII_to_Hex(AsciiCode);
break;
case 'N':
UART2_AsciiCode_Return.LetterPosition=ASCII_to_Hex(AsciiCode);
break;
case '-':
UART2_AsciiCode_Return.SymbolPostion[Index]=ASCII_to_Hex(AsciiCode);
break;
case 0x0D:
UART2_AsciiCode_Return.EndCodeCheck=ASCII_to_Hex(AsciiCode);
break;
default:
break;
}
return UART2_AsciiCode_Return;
-----------------------------------------------------------------------------------------------------------------
INT8U ASCII_to_Hex(INT8U ASCII_Data)
{
if((ASCII_Data>=0x30)&&(ASCII_Data<=0x39))
ASCII_Data=ASCII_Data-0x30;
if((ASCII_Data>=0x41)&&(ASCII_Data<=0x46))
ASCII_Data=ASCII_Data-0x37;
return (ASCII_Data);
}
|
|