[活动专区] 【AT-START-F425测评】3、串口接收不定长数据

[复制链接]
772|1
 楼主| freeelectron 发表于 2022-3-4 17:40 | 显示全部楼层 |阅读模式
本帖最后由 freeelectron 于 2022-3-7 09:34 编辑

系列**:
AT-START-F425测评】1、初识AT32F425开发板(开箱)
【AT-START-F425测评】2、非阻塞方式点灯,blink,blink,blink…...

1、硬件连接

本文使用串口1,对应的引脚为PB6和PB7。

991926221db14e4079.png

2、GPIO复用功能

953316221dc3898611.png

可以看出,复用功能为MUX0。

[color=rgba(0, 0, 0, 0.75)]3、实现思路

利用串口接收相邻两个字符的时间来判断一串数据是否接收完成,如果超过设定的时间,还没有接收到下一个字符,则认为一串数据接收完成。


如果使用115200波特率,数据长度为8bit,停止位为1bit,那么接收一个字节大约需要,(1/115200)9=0.78ms。


那么就可以利用,接收完一个字符后,如果0.78ms之内没有下一个数据,那么就可以认为一串数据接收完成,考虑到单片机接收数据保存,这里设定超时时间为5ms。

4、核心代码

主要是利用串口接收中断和应用层超时。

  1. #define UART_MAX_LEN  200

  2. struct
  3. {
  4.         uint8_t Timeout;
  5.         uint8_t RecvBuff[UART_MAX_LEN];
  6.         uint8_t RecvLen;
  7. } SerialStr;


  8. void SerialInit(void)
  9. {
  10.         gpio_init_type gpio_init_struct;
  11.   
  12.         /* enable the usart1 and gpio clock */
  13.         crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  14.            crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);  

  15.         gpio_default_para_init(&gpio_init_struct);

  16.         /* configure the usart1 tx/rx pin */
  17.         gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  18.         gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  19.         gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  20.         gpio_init_struct.gpio_pins = GPIO_PINS_6 | GPIO_PINS_7;
  21.         gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  22.         gpio_init(GPIOB, &gpio_init_struct);

  23.         /* config usart1 iomux */
  24.         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE6, GPIO_MUX_0);
  25.         gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_0);
  26.   
  27.         /* config usart1 nvic interrupt */
  28.         nvic_irq_enable(USART1_IRQn, 3, 0);
  29.   
  30.         /* configure usart1 param */
  31.         usart_init(USART1, 115200, USART_DATA_8BITS, USART_STOP_1_BIT);
  32.         usart_parity_selection_config(USART1, USART_PARITY_NONE);
  33.     usart_hardware_flow_control_set(USART1,USART_HARDWARE_FLOW_NONE);

  34.         usart_transmitter_enable(USART1, TRUE);
  35.         usart_receiver_enable(USART1, TRUE);
  36.   
  37.         usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);
  38.         usart_enable(USART1, TRUE);  
  39. }


  40. void SerialRecvTimeout(void)
  41. {
  42.         if(SerialStr.Timeout>0)
  43.         {
  44.                 SerialStr.Timeout--;
  45.         }
  46. }


  47. void SerialRecv(uint8_t data)
  48. {
  49.         SerialStr.Timeout=5;
  50.         
  51.         if(SerialStr.RecvLen<UART_MAX_LEN)
  52.         {
  53.                 SerialStr.RecvBuff[SerialStr.RecvLen++]=data;
  54.         }
  55. }


  56. void SerialSend(uint8_t *data,uint8_t len)
  57. {
  58.         for(uint8_t i=0; i<len;i++)
  59.         {
  60.                 while (RESET == usart_flag_get(USART1, USART_TDC_FLAG));

  61.                 usart_data_transmit(USART1, data[i]);
  62.         }
  63. }


  64. void SerialPro(void)
  65. {
  66.         if(!SerialStr.Timeout&&SerialStr.RecvLen)
  67.         {
  68.                 printf("Recv:%d,[",SerialStr.RecvLen);
  69. #if 1                 
  70.                 SerialSend(SerialStr.RecvBuff,SerialStr.RecvLen);
  71. #else
  72.                 for(uint8_t i=0;i<SerialStr.RecvLen;i++)
  73.                 {
  74.                         printf(" %02d",SerialStr.RecvBuff[i]);
  75.                 }
  76. #endif
  77.                 printf("]\r\n");

  78.                 SerialStr.RecvLen=0;
  79.         }
  80. }


  81. void USART1_IRQHandler(void)
  82. {
  83.         uint16_t ch;
  84.         
  85.         if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
  86.         {
  87.                 ch=usart_data_receive(USART1);
  88.                 SerialRecv(ch);
  89.     }
  90. }


  91. /* retarget the C library printf function to the USART */
  92. int fputc(int ch, FILE *f)
  93. {
  94.         while(usart_flag_get(USART1, USART_TDC_FLAG) == RESET);
  95.         usart_data_transmit(USART1, (uint8_t) ch);
  96.         
  97.     return ch;
  98. }
5、现象

588846221ddf9b8388.gif











 楼主| freeelectron 发表于 2022-3-4 17:42 | 显示全部楼层
好奇怪,编辑的超链接,怎么没有了,@21ic大掌柜
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:stm32/LoRa物联网:304350312

66

主题

786

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部