协议解析-串口协议解析

该博客详细介绍了如何处理UART串口通信中的数据,包括初始化环形缓冲区、数据移动函数`buffShift`、数据填充函数`buffFeed`以及从环形缓冲区中提取并解析帧的函数`multi_extract_one_rx_frame`。通过这些函数,实现了从串口接收数据,处理帧的头部、地址、控制字段、长度和CRC校验,并进行错误检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#define MU_IN_BF_LEN (150)
#define MU_OUT_BF_LEN (150)
uint8_t inbuf[MU_IN_BF_LEN]={0};  //用于保存:从RX中断缓冲buffer中读出的数据
uint8_t outbuf[MU_OUT_BF_LEN]={0};//用于保存:提取出的一个完整帧

#define UART1_RX_RINGBUF_LEN    (250)
static uint8_t uart1_rx_ringbuf[UART1_RX_RINGBUF_LEN]={0};
static struct rt_ringbuffer uart1_rx_ringbuffer_controller={0};

#define UART1_TX_RINGBUF_LEN    (250)
static uint8_t uart1_tx_ringbuf[UART1_TX_RINGBUF_LEN]={0};
static struct rt_ringbuffer uart1_tx_ringbuffer_controller={0};

int init_uart1_link(void)
{
 rt_ringbuffer_init(&uart1_rx_ringbuffer_controller,
      uart1_rx_ringbuf,
      UART1_RX_RINGBUF_LEN);
 
 rt_ringbuffer_init(&uart1_tx_ringbuffer_controller,
       uart1_tx_ringbuf,
       UART1_TX_RINGBUF_LEN);
 
 uart1_send_state=UART1_SEND_IDLE;

 return 0;
}


/*
direct : 0->left move(low bytes out) ,1->right move(high bytes out)
len    : move len                              */
void buffShift(unsigned char *buf,int bufLen,unsigned char direct,int moveLen)
{
 int i=0;
 if(direct==0)
 {//left move
  for(i=0;i<bufLen;i++) 
  {
   if(i+moveLen>=bufLen)
   {
    buf[i]=0;
   }
   else
   {
    buf[i]=buf[i+moveLen];
   }
  }
 }
 else
 {//right move
  for(i=bufLen-1;i>=0;i--) 
  {
   if(i-moveLen<0)
   {
    buf[i]=0;
   }
   else
   {
    buf[i]=buf[i-moveLen];
   }
  }
 }
}

/*
start feed at buf[StartFeedAddr],StartFeedAddr++, total feedLen Bytes,
cycle loop mode

return :the real feed bytes ,should not over the DstbufMax;
*/
uint16_t buffFeed(unsigned char *Dstbuf,
      unsigned char *Srcbuf,
      uint16_t StartFeedAddr,
       uint16_t feedLen,
       uint16_t DstbufMax
    )
{
 uint16_t i=0;
 for(i=0;i<feedLen;i++)
 {
  Dstbuf[StartFeedAddr+i]=Srcbuf[i];
  if(StartF

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值