usart.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #define usart_c_
  2. #include "usart.h"
  3. static const char *TAG = "usart";
  4. #define uart_task_priority 20 //任务优先级
  5. #define usart_queue_handle_task_priority 21 //任务优先级
  6. #define TXD1_PIN (GPIO_NUM_17) //串口1的发送数据引脚
  7. #define RXD1_PIN (GPIO_NUM_16) //串口1的接收数据引脚
  8. #define USART1_BUF_SIZE_RECV (1024) //接收数据缓存大小,该大小需要大于内部FIFO大小:UART_FIFO_LEN(128)
  9. #define USART1_BUF_SIZE_SEND (1024000) //发送数据缓存大小,该大小需要大于内部FIFO大小:UART_FIFO_LEN(128)
  10. uint8_t rb_t_usart1_read_buff[USART1_BUF_SIZE_RECV];
  11. xQueueHandle usart_queue_handle = NULL;
  12. void usart_queue_handle_send(uint8_t *data ,int len)
  13. {
  14. usart_queue_handle_struct_t usart_queue_handle_struct_t1;
  15. usart_queue_handle_struct_t1.data_len = len;
  16. memcpy(usart_queue_handle_struct_t1.data,data,len);
  17. xQueueSend( usart_queue_handle, ( void * ) &usart_queue_handle_struct_t1, ( portTickType ) 0 );
  18. }
  19. void usart_queue_handle_send_it(uint8_t *data ,int len)
  20. {
  21. BaseType_t xHigherPriorityTaskWoken = pdFALSE;
  22. usart_queue_handle_struct_t usart_queue_handle_struct_t1;
  23. usart_queue_handle_struct_t1.data_len = len;
  24. memcpy(usart_queue_handle_struct_t1.data,data,len);
  25. xQueueSendFromISR(usart_queue_handle,( void * ) &usart_queue_handle_struct_t1,&xHigherPriorityTaskWoken);
  26. if(xHigherPriorityTaskWoken == !pdFALSE){
  27. portYIELD_FROM_ISR();
  28. }
  29. }
  30. //任务函数
  31. static void usart_queue_handle_task(void *pvParameters)
  32. {
  33. usart_queue_handle_struct_t usart_queue_handle_struct_t1;
  34. while(1)
  35. {
  36. if(xQueueReceive(usart_queue_handle, &usart_queue_handle_struct_t1, 20 / portTICK_RATE_MS))
  37. {
  38. uart_write_bytes(UART_NUM_1, (const char *) usart_queue_handle_struct_t1.data, usart_queue_handle_struct_t1.data_len);
  39. }
  40. }
  41. }
  42. /*串口发送数据*/
  43. void usart_send(uint8_t *data ,int len)
  44. {
  45. uart_write_bytes(UART_NUM_1, (const char *) data, len);
  46. }
  47. /*串口任务*/
  48. static void uart_task(void *arg)
  49. {
  50. int usart1_read_count=0;//接收计数
  51. int usart1_idle_count=0;//接收计数
  52. /*配置串口参数*/
  53. uart_config_t uart_config = {
  54. .baud_rate = 115200,//波特率
  55. .data_bits = UART_DATA_8_BITS,//数据位8位
  56. .parity = UART_PARITY_DISABLE,//无奇偶校验
  57. .stop_bits = UART_STOP_BITS_1,//停止位1位
  58. .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,//不使用硬件流控
  59. .source_clk = UART_SCLK_APB,//串口使用的时钟
  60. };
  61. /*初始化串口1*/
  62. uart_driver_install(UART_NUM_1,
  63. USART1_BUF_SIZE_RECV, //串口1接收缓存大小
  64. 1024,
  65. 0, //队列大小为0;没有使用freertos内部缓存管理
  66. NULL, //不使用QueueHandle_t 内部缓存管理,设置为空
  67. 0 //设置串口中断优先级,设置为0意味着让系统从1-3级中自动选择一个
  68. );
  69. /*设置串口参数*/
  70. uart_param_config(UART_NUM_1, &uart_config);
  71. /*设置串口的TX,RX,RTS,DTR引脚*/ //不使用RTS,DTR
  72. uart_set_pin(UART_NUM_1, TXD1_PIN, RXD1_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
  73. /*申请一块内存,用于临时存储接收的数据*/
  74. uint8_t *uart_recv_data = (uint8_t *) malloc(USART1_BUF_SIZE_RECV);
  75. while (1) {
  76. //接收串口数据 //每隔20ms判断一次,可以写成portMAX_DELAY(一直判断)
  77. int len = uart_read_bytes(UART_NUM_1, uart_recv_data, USART1_BUF_SIZE_RECV, 20 / portTICK_RATE_MS);
  78. if(len>0)//接收到数据,把数据存储到缓存
  79. {
  80. usart1_idle_count=0;
  81. memcpy(rb_t_usart1_read_buff+usart1_read_count,uart_recv_data,len);
  82. usart1_read_count = usart1_read_count + len;
  83. // PutData(&rb_t_usart1_read,data,len);
  84. }
  85. else//没有数据
  86. {
  87. if(usart1_read_count!=0)//已经接收到数据
  88. {
  89. usart1_idle_count ++;
  90. if(usart1_idle_count>=2)
  91. {
  92. usart1_idle_count=0;
  93. usart_data_process_fun(rb_t_usart1_read_buff,usart1_read_count);
  94. rb_t_usart1_read_buff[usart1_read_count]=0;
  95. usart1_read_count=0;
  96. }
  97. }
  98. }
  99. }
  100. free(uart_recv_data);
  101. }
  102. void usart_init(void)
  103. {
  104. xTaskCreate(uart_task, "uart_task", 4096, NULL, uart_task_priority, NULL);
  105. usart_queue_handle = xQueueCreate(10,sizeof(usart_queue_handle_struct_t));
  106. if( usart_queue_handle == pdFAIL ){
  107. ESP_LOGI(TAG, "Failed to create the queue.");
  108. }
  109. xTaskCreate(usart_queue_handle_task, "usart_queue_handle_task", 4096, NULL, usart_queue_handle_task_priority, NULL);
  110. }