陈拓 2022/04/27-2022/05/10
1. 简介
在《Windows USB串口接收GPS北斗模块数据和数据说明》
https://zhuanlan.zhihu.com/p/511712973
https://blog.csdn.net/chentuo2000/article/details/124675258?spm=1001.2014.3001.5501
一文中我们已经知道了怎样在Windows电脑上读GPS北斗模块的数据。如果要制作一个实用的产品还需要小型化,本文我们用ESP32读GPS北斗模块HT1818Z3G5L的数据。
我们以官方例程国内镜像
https://gitee.com/esp-idf/esp-idf/tree/master/examples/peripherals/uart/uart_async_rxtxtasks
为模板,稍加修改。
2. 连接ESP32串口和HT1818Z3G5L模块
ESP32有3个串口,UART_NUM_0、UART_NUM_1和UART_NUM_2,这3个串口的引脚都可以重映射。
UART_NUM_0用于烧写固件,并用作调试信息的LOG输出。
我们用UART_NUM_2连接HT1818Z3G5L模块。将UART_NUM_2的TX2和RX2映射到GPIO12和GPIO16引脚上,与HT1818Z3G5L模块的RX、TX交叉相连,HT1818Z3G5L电源VCC接3.3V,模块和ESP32的GND相连接。
3. 开发环境
《用乐鑫国内Gitee镜像搭建ESP32开发环境》
https://zhuanlan.zhihu.com/p/348106034
https://blog.csdn.net/chentuo2000/article/details/113424934?spm=1001.2014.3001.5501
4. 构建项目
- 将开发环境中的官方例子项目复制到ESP-IDF开发工具之外命名esp32_gps
cp -r ~/esp/esp-idf/examples/peripherals/uart/uart_async_rxtxtasks/ ~/esp/esp32_gps
- 进入项目目录
cd ~/esp/esp32_gps
- 项目树
修改C程序uart_async_rxtxtasks_main.c:
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "driver/uart.h"
#include "string.h"
#include "driver/gpio.h"
static const char *TAG = "ESP32_GPS";
static const int RX_BUF_SIZE = 1024;
uint8_t* data = NULL;
#define TXD_PIN (GPIO_NUM_13)
#define RXD_PIN (GPIO_NUM_16)
void init_uart2(void) {
const uart_config_t uart_config = {
.baud_rate = 9600,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.source_clk = UART_SCLK_APB,
};
// We won't use a buffer for sending data.
uart_driver_install(UART_NUM_2, RX_BUF_SIZE * 2, 0, 0, NULL, 0);
uart_param_config(UART_NUM_2, &uart_config);
uart_set_pin(UART_NUM_2, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}
static void rx2_task(void *arg)
{
static const char *RX_TASK_TAG = "RX2_TASK";
esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO);
while (1) {
const int rxBytes = uart_read_bytes(UART_NUM_2, data, RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS);
if (rxBytes > 0) {
data[rxBytes] = 0;
ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data);
ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO);
}
}
//free(data);
}
void app_main(void)
{
ESP_LOGI(TAG, "[APP] Startup..");
ESP_LOGI(TAG, "[APP] Free memory: %d bytes", esp_get_free_heap_size());
ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version());
printf("================================================================\n");
data = (uint8_t*) malloc(RX_BUF_SIZE+1);
init_uart2();
xTaskCreate(rx2_task, "uart_rx2_task", 1024*2, NULL, configMAX_PRIORITIES, NULL);
}
- 刷新esp-idf环境
get_idf
注意:每次打开终端进入sdk都要执行一次此命令
idf.py set-target esp32
注意:在项目创建第一次使用,以后就不用运行这个命令了。
- 清除以前的构建
- 配置项目
idf.py menuconfig
保持默认,退出。
- 编译
idf.py build
- 烧写
上电后按一下RST键。
idf.py -p /dev/ttyS4 -b 115200 flash
- 串口监视器
idf.py monitor -p /dev/ttyS4
也可以使用微软串口助手: