esp32运行的第一个程序(串口回环测试)

1、串口回环测试(电脑串口发送数据,原数据返回)

代码如下

/*串口初始化

 * */

void Uart0_Init()

{

/* Configure parameters of an UART driver,

* communication pins and install the driver */

uart_config_t uart_config = {

  .baud_rate = 115200,

  .data_bits = UART_DATA_8_BITS,

  .parity  = UART_PARITY_DISABLE,

  .stop_bits = UART_STOP_BITS_1,

  .flow_ctrl = UART_HW_FLOWCTRL_DISABLE

  };

uart_param_config(UART_NUM_0, &uart_config);

uart_set_pin(UART_NUM_0, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS);

uart_driver_install(UART_NUM_0, BUF_SIZE * 2, 0, 0, NULL, 0);

}


static void echo_task()

{

uint8_t *data = (uint8_t *) malloc(BUF_SIZE);

  while (1) {

   // Read data from the UART

   int len = uart_read_bytes(UART_NUM_0, data, BUF_SIZE, 20 / portTICK_RATE_MS);

   // Write data back to the UART

   uart_write_bytes(UART_NUM_0, (const char *) data, len);

  }

}


例程2解析:串口事件处理

1、初始化串口

void Uart0even_Init()

{

uart_config_t uart_config = {

  .baud_rate = 115200,

  .data_bits = UART_DATA_8_BITS,

  .parity = UART_PARITY_DISABLE,

  .stop_bits = UART_STOP_BITS_1,

  .flow_ctrl = UART_HW_FLOWCTRL_DISABLE

  }; 初始化串口参数配置

  uart_param_config(UART_NUM_0, &uart_config);

  uart_set_pin(UART_NUM_0, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);设置串口的发送接受引脚,本例程采用默认配置。

  uart_driver_install(UART_NUM_0, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart0_queue, 0);

安装串口驱动,设置发送接受缓冲区大小,

  //Set uart pattern detect function.

  uart_enable_pattern_det_intr(UART_NUM_0, '+', PATTERN_CHR_NUM, 10000, 10, 10);

设置串口特殊字符串作为事件处理功能

  uart_pattern_queue_reset(UART_NUM_0, 20);

分配给定长度的队列内存来保存设置模式的接受到的数据

}


static void echo_task(void *pvParameters)

{

uart_event_t event; 定义串口事件

size_t buffered_size;

uint8_t* dtmp = (uint8_t*) malloc(RD_BUF_SIZE); 开辟接受数据内存


  esp_log_level_set(TAG, ESP_LOG_INFO);

设置输出日志等级

  Uart0even_Init();

  while (1) {

判断串口接受信息队列是否有数据,并保存到事件结构体

    if(xQueueReceive(uart0_queue, (void * )&event, (portTickType)portMAX_DELAY)) {

      bzero(dtmp, RD_BUF_SIZE); 数据缓冲区置0

      ESP_LOGI(TAG, "uart[%d] event:", UART_NUM_0);

      switch(event.type) { 判断串口事件

      case UART_DATA: 串口数据事件

       ESP_LOGI(TAG, "[UART DATA]: %d", event.size);

       uart_read_bytes(UART_NUM_0, dtmp, event.size, portMAX_DELAY);

       ESP_LOGI(TAG, "[DATA EVT]:");

       uart_write_bytes(UART_NUM_0, (const char*) dtmp, event.size);

       break;

       //Event of HW FIFO overflow detected

      case UART_FIFO_OVF:

       ESP_LOGI(TAG, "hw fifo overflow");

       // If fifo overflow happened, you should consider adding flow control for your application.

       // The ISR has already reset the rx FIFO,

       // As an example, we directly flush the rx buffer here in order to read more data.

       uart_flush_input(UART_NUM_0);

       xQueueReset(uart0_queue);

       break;

       //Event of UART ring buffer full

      case UART_BUFFER_FULL:

       ESP_LOGI(TAG, "ring buffer full");

       // If buffer full happened, you should consider encreasing your buffer size

       // As an example, we directly flush the rx buffer here in order to read more data.

       uart_flush_input(UART_NUM_0);

       xQueueReset(uart0_queue);

       break;

      //Event of UART RX break detected

      case UART_BREAK:

       ESP_LOGI(TAG, "uart rx break");

       break;

       //Event of UART parity check error

      case UART_PARITY_ERR:

       ESP_LOGI(TAG, "uart parity error");

       break;

      //Event of UART frame error

      case UART_FRAME_ERR:

       ESP_LOGI(TAG, "uart frame error");

       break;

       //UART_PATTERN_DET

      case UART_PATTERN_DET: 串口设置模式事件

        uart_get_buffered_data_len(UART_NUM_0, &buffered_size);获取数据缓冲区数据长度

        int pos = uart_pattern_pop_pos(UART_NUM_0); 设置模式位置

        ESP_LOGI(TAG, "[UART PATTERN DETECTED] pos: %d, buffered size: %d", pos, buffered_size);

        if (pos == -1) {

          // There used to be a UART_PATTERN_DET event, but the pattern position queue is full so that it can not

          // record the position. We should set a larger queue size.

          // As an example, we directly flush the rx buffer here.

          uart_flush_input(UART_NUM_0);

        } else {

          uart_read_bytes(UART_NUM_0, dtmp, pos, 100 / portTICK_PERIOD_MS);

          uint8_t pat[PATTERN_CHR_NUM + 1];

          memset(pat, 0, sizeof(pat));

          uart_read_bytes(UART_NUM_0, pat, PATTERN_CHR_NUM, 100 / portTICK_PERIOD_MS);

          ESP_LOGI(TAG, "read data: %s", dtmp);

          ESP_LOGI(TAG, "read pat : %s", pat);

        }

        break;

      //Others

      default:

        ESP_LOGI(TAG, "uart event type: %d", event.type);

        break;


      }

    }

  }

  free(dtmp);

  dtmp = NULL;

  vTaskDelete(NULL);

}



猜你喜欢

转载自blog.csdn.net/redsleep/article/details/79488915