123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- #define usart_c_
- #include "usart.h"
- static const char *TAG = "usart";
- #define uart_task_priority 20 //任务优先级
- #define usart_queue_handle_task_priority 21 //任务优先级
- #define TXD1_PIN (GPIO_NUM_17) //串口1的发送数据引脚
- #define RXD1_PIN (GPIO_NUM_16) //串口1的接收数据引脚
- #define USART1_BUF_SIZE_RECV (1024) //接收数据缓存大小,该大小需要大于内部FIFO大小:UART_FIFO_LEN(128)
- #define USART1_BUF_SIZE_SEND (1024000) //发送数据缓存大小,该大小需要大于内部FIFO大小:UART_FIFO_LEN(128)
- uint8_t rb_t_usart1_read_buff[USART1_BUF_SIZE_RECV];
- xQueueHandle usart_queue_handle = NULL;
- void usart_queue_handle_send(uint8_t *data ,int len)
- {
- usart_queue_handle_struct_t usart_queue_handle_struct_t1;
- usart_queue_handle_struct_t1.data_len = len;
- memcpy(usart_queue_handle_struct_t1.data,data,len);
- xQueueSend( usart_queue_handle, ( void * ) &usart_queue_handle_struct_t1, ( portTickType ) 0 );
- }
- void usart_queue_handle_send_it(uint8_t *data ,int len)
- {
- BaseType_t xHigherPriorityTaskWoken = pdFALSE;
- usart_queue_handle_struct_t usart_queue_handle_struct_t1;
- usart_queue_handle_struct_t1.data_len = len;
- memcpy(usart_queue_handle_struct_t1.data,data,len);
- xQueueSendFromISR(usart_queue_handle,( void * ) &usart_queue_handle_struct_t1,&xHigherPriorityTaskWoken);
- if(xHigherPriorityTaskWoken == !pdFALSE){
- portYIELD_FROM_ISR();
- }
- }
- //任务函数
- static void usart_queue_handle_task(void *pvParameters)
- {
- usart_queue_handle_struct_t usart_queue_handle_struct_t1;
- while(1)
- {
- if(xQueueReceive(usart_queue_handle, &usart_queue_handle_struct_t1, 20 / portTICK_RATE_MS))
- {
- uart_write_bytes(UART_NUM_1, (const char *) usart_queue_handle_struct_t1.data, usart_queue_handle_struct_t1.data_len);
- }
- }
- }
- /*串口发送数据*/
- void usart_send(uint8_t *data ,int len)
- {
- uart_write_bytes(UART_NUM_1, (const char *) data, len);
- }
- /*串口任务*/
- static void uart_task(void *arg)
- {
- int usart1_read_count=0;//接收计数
- int usart1_idle_count=0;//接收计数
- /*配置串口参数*/
- uart_config_t uart_config = {
- .baud_rate = 115200,//波特率
- .data_bits = UART_DATA_8_BITS,//数据位8位
- .parity = UART_PARITY_DISABLE,//无奇偶校验
- .stop_bits = UART_STOP_BITS_1,//停止位1位
- .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,//不使用硬件流控
- .source_clk = UART_SCLK_APB,//串口使用的时钟
- };
- /*初始化串口1*/
- uart_driver_install(UART_NUM_1,
- USART1_BUF_SIZE_RECV, //串口1接收缓存大小
- 1024,
- 0, //队列大小为0;没有使用freertos内部缓存管理
- NULL, //不使用QueueHandle_t 内部缓存管理,设置为空
- 0 //设置串口中断优先级,设置为0意味着让系统从1-3级中自动选择一个
- );
- /*设置串口参数*/
- uart_param_config(UART_NUM_1, &uart_config);
- /*设置串口的TX,RX,RTS,DTR引脚*/ //不使用RTS,DTR
- uart_set_pin(UART_NUM_1, TXD1_PIN, RXD1_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
- /*申请一块内存,用于临时存储接收的数据*/
- uint8_t *uart_recv_data = (uint8_t *) malloc(USART1_BUF_SIZE_RECV);
- while (1) {
- //接收串口数据 //每隔20ms判断一次,可以写成portMAX_DELAY(一直判断)
- int len = uart_read_bytes(UART_NUM_1, uart_recv_data, USART1_BUF_SIZE_RECV, 20 / portTICK_RATE_MS);
-
- if(len>0)//接收到数据,把数据存储到缓存
- {
- usart1_idle_count=0;
- memcpy(rb_t_usart1_read_buff+usart1_read_count,uart_recv_data,len);
- usart1_read_count = usart1_read_count + len;
- // PutData(&rb_t_usart1_read,data,len);
- }
- else//没有数据
- {
- if(usart1_read_count!=0)//已经接收到数据
- {
- usart1_idle_count ++;
- if(usart1_idle_count>=2)
- {
- usart1_idle_count=0;
-
- usart_data_process_fun(rb_t_usart1_read_buff,usart1_read_count);
- rb_t_usart1_read_buff[usart1_read_count]=0;
- usart1_read_count=0;
- }
- }
- }
- }
- free(uart_recv_data);
- }
- void usart_init(void)
- {
- xTaskCreate(uart_task, "uart_task", 4096, NULL, uart_task_priority, NULL);
- usart_queue_handle = xQueueCreate(10,sizeof(usart_queue_handle_struct_t));
- if( usart_queue_handle == pdFAIL ){
- ESP_LOGI(TAG, "Failed to create the queue.");
- }
- xTaskCreate(usart_queue_handle_task, "usart_queue_handle_task", 4096, NULL, usart_queue_handle_task_priority, NULL);
- }
|