数据包数据提取(字符转整型数据)

目录

一、概要

二、程序设计流程

1.设计思路

2.参考代码

三、运行结果

四、小结


一、概要

问题:如何将一组字符串数据包的有效位提取出来,并转为整型数据存储到一个新的字符数组中?比如一组字符串为:"$-1-111-222-111-#"($、#分别是数据包的起始位和结束标志位,‘-’是数据包的分隔符,1、111、222、111是数据包的有效数据,并且每一组的大小为一个字节0-255)提取1、111、222、111四组数据存储到OUT_DATE数组中。

二、程序设计流程

1.设计思路

      先遍历原始数据包的每个字符,然后截取两个分隔符之间的的字符,再将这些字符进行字符转整型处理,最后存储到目标数组中即可。

2.参考代码

void convertData(char* input, uint8_t* out) 
{
    int outputIndex = 0,W=0; // 指向输出数组的当前索引、和位数值
    
    // 遍历输入字符串
    for (int i = 0; input[i] != '#'; i++) //处理整个数据包
    {
        char c = input[i];

        
        if (c =='-') //遇到‘-’先判断-后面有多少位是数字
        {  
            if(input[i+2]=='-')
            {W=1;}
            else if(input[i+3]=='-')
             {W=2;}
             else if(input[i+4]=='-')
             {W=3;}
             else break;//在该范围-。。。-内没有检测到下一下个-,就退出转换。
             switch(W)//字符转整型处理。比如该组就1位数据‘1’,就执行‘1’-‘0’,这样就计算出该组的整型数据了。
             {
              case 1:out[outputIndex]=input[i+1]-'0';
                      break;
              case 2:out[outputIndex]=(input[i+1]-'0')*10+(input[i+2]-'0');
                      break;
              case 3:out[outputIndex]=(input[i+1]-'0')*100+(input[i+2]-'0')*10+ 
                     (input[i+3]-'0');
                      break;
              
             }
           outputIndex++;  
           if(outputIndex>4)
           outputIndex=0;
           
         }
     } 
}

三、运行结果

四、小结

     在这里大家可能会有些疑问,为什么不能直接使用原始数据?其实原始数据它是一组字符串,就是它每个字符都是单独的存储起来的,也就是说这些数据是离散的,如果对它进行数据读取时,会出现它跟我们发送的数据不一致的情况。因此我们需要将这些数据进行整和起来,与我们发送的内容一致,这样我们就能实现对这些数据的准确读取了。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 STM32 上提取数据包的方式可以根据具体的通信协议和数据格式来进行处理。以下是一种常见的方法,假设使用的是 USART 进行串口通信: 1. 首先,确保 USART 的接收缓冲区中已经接收到完整的数据包。可以使用 USART 的中断或 DMA 进行接收,并在接收完成后触发相应的中断或 DMA 完成中断。 2. 接下来,根据通信协议和数据格式,解析数据包。具体的解析过程会根据具体的协议而有所不同。 - 如果是固定长度的数据包,可以直接从接收缓冲区中读取固定长度的数据即可。 - 如果是变长数据包,可能需要使用特定的分隔符来识别每个数据包的起始和结束位置。 - 如果是有标识字段的数据包,可以根据标识字段来定位每个数据包。 3. 提取数据包数据。根据协议和数据格式,可以将数据复制到另一个缓冲区中,或者直接进行处理。 以下是一个示例代码,演示了如何提取固定长度的数据包: ```c #define PACKET_SIZE 10 USART_Module* USARTx; // 假设使用的是 USART1 uint8_t packet[PACKET_SIZE]; void USART_ExtractPacketData() { if (USARTx->STATUS & STATUS_RXNE) { // 确保接收缓冲区中有足够的数据 if (USARTx->STATUS & STATUS_RXNE && USARTx->RX_COUNT >= PACKET_SIZE) { // 提取固定长度的数据包 for (int i = 0; i < PACKET_SIZE; i++) { packet[i] = USARTx->DATA; } // 处理数据包 // ... } } } ``` 请注意,上述代码仅为示例,具体实现需要根据实际情况进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小郑TE_Lab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值