使用 strchr 和 sscanf 的组合来进行数据解析和处理

当接收到的数据格式规整且符合特定分隔符时,可以使用 strchrsscanf 的组合来进行数据解析和处理。下面是一个简单的示例,演示了如何使用这两个函数来解析接收到的数据:

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;  // 重置缓冲区索引
   		}      	
    } 	
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隐居工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值