你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

单片机 stm32 接收数据和处理

[复制链接]
STMCU小助手 发布时间:2021-7-22 14:39
背景
1、单片机串口接收数据处理,这个代码已经过很多项目验证,没有问题。用这个代码帮了好几个同事解决数据接收久了就异常。
2、这个代码做到接收和处理分开。避免不必要的处理逻辑问题。
3、也可用于网口tcp,udp,spi,iic等方式。


缺陷 :
1、接收和处理两个缓存区,比较吃内存,不过现在单片机内存大,不是问题。
2、接收和处理分开,响应没那么及时。现在芯片主频都高,可以忽略。


实现
  1. <font face="微软雅黑" size="3">//缓存区根据实际情况修改
  2. #define   UART_RX_BUFSIZE               16           // receive
  3. volatile  uint8_t      UART_RXBuffer[UART_RX_BUFSIZE]; // receive
  4. volatile  uint8_t      UART_RXReadIndex = 0, UART_RXWriteIndex = 0; // receive buffer indexes :
  5. volatile  uint8_t      UART_RXCharCount = 0; // count of received bytes:

  6. //根据实际情况修改
  7. typedef  struct _REC_TYPE
  8. {
  9.     uint8_t   Head;
  10.     //uint8_t   OptCode;
  11.     //uint16_t  DataLen;
  12.     uint8_t   DataBuf[5];

  13.     uint8_t   Tail;

  14. } REC_TYPE;

  15. typedef union REC_DATA_TYPE
  16. {
  17.     REC_TYPE  data_type;
  18.    
  19.         //根据实际情况修改
  20.     uint8_t   data_arry[16];

  21. } REC_DATA;

  22. REC_DATA  uart_rec_buffer;//16byte

  23. uint8_t uart_rec_count = 0;
  24. uint16_t uart_timeout_count = 0;


  25. //中断接收,根据实际芯片修改
  26. void USART1_IRQHandler(void)
  27. {
  28.   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  29.   {
  30.       USART_ClearITPendingBit(USART1,USART_IT_RXNE);
  31.       
  32.      UART_RXBuffer[UART_RXWriteIndex++] =USART_ReceiveData(USART1);
  33.                 UART_RXWriteIndex &= UART_RX_BUFSIZE - 1;
  34.                 UART_RXCharCount++;
  35.   }
  36. }
  37. //读取缓存数据
  38. uint8_t UART_Ci_ReadChar ( void )
  39. {
  40.     register uint8_t Byte;
  41.        
  42.     if ( UART_RXCharCount )
  43.     {
  44.         Byte = UART_RXBuffer[UART_RXReadIndex++];
  45.         UART_RXReadIndex &= UART_RX_BUFSIZE - 1;
  46.         
  47.         UART_RXCharCount--;
  48.         
  49.         return Byte ;
  50.     }
  51.     return 0;
  52. }

  53. void Uart_process_rec_data(void)
  54. {
  55.        
  56.          uint16_t m_ui16Data;

  57.         if ( UART_RXCharCount )
  58.     {
  59.         //设置超时初值
  60.         uart_timeout_count =        50000;
  61.         uart_rec_buffer.data_arry[uart_rec_count] = UART_Ci_ReadChar();
  62.         uart_rec_count++;
  63.     }
  64.         //添加超时处理
  65.     if ( uart_timeout_count>0 )
  66.     {
  67.         uart_timeout_count--;
  68.     }
  69.     else
  70.     {
  71.         uart_rec_count = 0;
  72.     }
  73.         if ( uart_rec_count > 0 && uart_rec_buffer.data_type.Head == 0xff )
  74.         {
  75.                 //这里添加类型处理

  76.                 //7是帧长度,根据实际情况修改
  77.                 if(uart_rec_count>=7)
  78.                 {
  79.                         //记得清0
  80.                         uart_rec_count = 0;
  81.                         if(uart_rec_buffer.data_type.Tail==0x00)
  82.                         {
  83.                                 //数据处理
  84.                         }
  85.                        
  86.                 }
  87.         }
  88.         else
  89.         {
  90.                 uart_rec_count = 0;
  91.         }
  92. }
  93. </font>
复制代码


收藏 评论0 发布时间:2021-7-22 14:39

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版