ESP32-IDFでUART機能を試してみます。
こんにちは、北神です。IoTではGPSや既存のシリアル通信機器が話題になることもあります。
さっそく、ESP32-IDFでUARTを試してみまいと思います。
詳しい資料は、以下の公式情報から辿ってみてください。
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/uart.html
#define UART_2_TXD 16 #define UART_2_RXD 17 const int uart_num = UART_NUM_2; uart_config_t uart_config = { .baud_rate = 9600,//115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .rx_flow_ctrl_thresh = 122, }; uart_param_config(uart_num, &uart_config); uart_set_pin(uart_num, UART_2_RXD, UART_2_TXD, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); uart_driver_install(uart_num, 128+1, 0,0, NULL, 0);
以上の通り、GPIO16とGPIO17(UART_2)をUART用に設定しました。
uart_configでは、見慣れたUARTの設定を細かく行っています。
uart_driver_installでハマった点は、rx_buffer_sizeが128以下に設定するとエラーがでるという点です。
多分、rx_buffer_sizeを用いてmallocを行なっている用に思えますので、小さすぎるバッファは作成できないのでしょう。
とりあえず、最小の128+1で構成すればOKです。
受信に関しては
int len = uart_read_bytes(uart_num, data, 1 , 1000 / portTICK_RATE_MS);
で済みます。
uart_read_bytesは、公式より以下の関数になります。
int uart_read_bytes(uart_port_tuart_num, void *buf, uint32_t length, TickType_t ticks_to_wait)
ここで、lengthを指定してあげれば、length分溜まったデータを取得することができます。
今回は、わざわざ1バイト毎の取得を行い改行文字でカッティングを行いたい為、lengthを1としました。
こんな感じで、UART通信も設定できるようです。
めでたし、めでたし。
それでは!