当接收到的数据格式规整且符合特定分隔符时,可以使用 strchr
和 sscanf
的组合来进行数据解析和处理。下面是一个简单的示例,演示了如何使用这两个函数来解析接收到的数据:
void USART1_IRQHandler(void)
{
char USART1_Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
USART1_Res = USART_ReceiveData(USART1); //读取接收到的数据
USART1_RX_BUF[rxIndex1++] = USART1_Res; // 存储接收到的数据
if (USART1_Res == '\n') // 判断是否接收到换行符
{
USART1_RX_BUF[rxIndex1] = '\0'; // 添加字符串结束符
// 在这里可以根据具体的数据格式进行解析和处理
// 假设接收到的数据格式为 "+IPD,1,13:0012,0034,0056,0078"
// 这里我们简单地使用 strchr 来查找逗号和冒号,并使用 sscanf 进行数据提取
char *comma1 = strchr(USART1_RX_BUF, ',');
char *comma2 = strchr(comma1 + 1, ',');
char *colon = strchr(comma2, ':');
if (comma1 && comma2 && colon)
{
int value1, value2, value3, value4;
if (sscanf(colon + 1, "%d,%d,%d,%d", &value1, &value2, &value3, &value4) == 4)
{
// 成功解析数据,可以进行进一步处理
// 假设我们将数据发送到串口进行调试输出
Usart_SendString(USART1, "Value 1: ");
Usart_SendInt(USART1, value1);
Usart_SendString(USART1, "\r\n");
// 其他数值类似处理
}
}
// 数据处理完成后可以执行其他操作,比如清空接收缓冲区等
rxIndex1 = 0; // 重置缓冲区索引
}
}
}
在上述代码中,我们使用 strchr
函数来查找逗号和冒号的位置,并使用 sscanf
函数从中提取出需要的数据。这样的实现方式更加灵活,适用于规整的数据格式。
实战:
/*******************************************************************************
* 函 数 名 : USART1_IRQHandler
* 函数功能 : USART1中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
//u16 USART1_RX_STA=0; //接收状态标记
char USART1_RX_BUF[USART1_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节
uint8_t rxIndex1 = 0;
void USART1_IRQHandler(void) //串口1中断服务程序 接收
{
char USART1_Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a 回车换行结尾)
{
USART1_Res = USART_ReceiveData(USART1); //读取接收到的数据
if (rxIndex1 < USART1_REC_LEN)
{
USART1_RX_BUF[rxIndex1++] = USART1_Res;// 存储接收到的数据
}
/**
* 文本数据格式"+IPD,1,13:0012,0034,0056,0078"
* "+IPD,1,25:4444,3333,1111,22220xFFFF"
* */
// 处理接收到的数据
if (USART1_Res == '\n') // 判断是否接收到换行符
{
USART1_RX_BUF[rxIndex1] = '\0'; // 添加字符串结束符
// 这里我们简单地使用 strchr 来查找逗号和冒号,并使用 sscanf 进行数据提取
char *comma1 = strchr(USART1_RX_BUF, ',');
char *comma2 = strchr(comma1 + 1, ',');
char *colon = strchr(comma2, ':');
if (comma1 && comma2 && colon)
{
int value1, value2, value3, value4;
if (sscanf(colon + 1, "%d,%d,%d,%d", &value1, &value2, &value3, &value4) == 4)
{
// 成功解析数据,可以进行进一步处理
// 假设我们将数据发送到串口进行调试输出
USART_printf(USART1, "Value 1: ");
USART_printf(USART1, "Value 1: %d,Value 2: %d,Value 3: %d,Value 4: %d",value1,value2,value3,value4);
USART_printf(USART1, "\r\n");
// 其他数值类似处理
}
}
rxIndex1 = 0; // 重置缓冲区索引
}
}
}