【QT 自研上位机 与 ESP32下位机联调>>>串口控制GPIO-基础样例-联合文章】

【QT 自研上位机 与 ESP32下位机联调>>>串口控制GPIO-基础样例-联合文章】

  • 1、概述
  • 2、实验环境
  • 3、 自我总结
  • 4、 实验过程
    • 1、验证上位机QT程序
      • 1、下载样例代码
      • 2、修改qt程序
      • 3、运行测试验证
    • 2、验证下位机ESP32程序
      • 1、下载样例代码
      • 2、更改ESP32代码,编译下载
      • 3、验证
    • 3、联合调试-ESP32和qt上位机
      • 1、硬件连接
      • 2、验证
  • 5、代码连接
  • 6、细节部分
      • (1)常见错误解决办法:
      • (2)ESP32工程下载后,先清理下
      • (3)逻辑分析仪,需要跳变信号触发
      • (4)逻辑分析仪,触发触发选择不点下面两个
  • 7、总结

1、概述

最为新手,想要快速入门相关设备,比如ESP32,可能最好的方式就是直接手动去敲一遍代码,而串口算是单片机入门中,必不可少的一个基础课程,很多通讯,以及打印各种信息,都需要,而加入一些交互,能让我们更好调试单片机。

我打算出3章,像之前STM32那种单片机,调试串口一样。
本次第三章,和上位机进行联合调试。

第一章,也就是串口基础篇,简单调试ESP32,进行交互。
第二章,将会结合GPIO,进行一些简单外围控制。
第三章,将会结合上位机,使用自制上位机进行联合调试。

2、实验环境

ESP32说明:ESP32-S3 是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片,支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa® 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。ESP32-S3 支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。

硬件信息:开发板 ESP32-S3-DevKitM-1(EPS32-S3-wroom-1模块)
调试环境:Windows下
串口工具:USB转串口TTL/232等
其他硬件:逻辑分析仪,杜邦线,两个usb-type-c连接线等。
在这里插入图片描述

3、 自我总结

有了调试串口的经验,再加上调试IO的经验,其实我们就很容易合在一起,就像那个很有意思的笑话,苹果的英文单词和笔的单词,组合在一起的就是笔记本了。
如下,请允许我在原本应该严肃的科技博文中,加入一个搞笑的部分。
在这里插入图片描述
但是这个道理是相通的,我们学习一个东西的时候,其实一块一块学的,或者说以小见大。
举个例子,我们之前学习了ESP32的串口,

【PC电脑windows编写代码-学习uart0串口编写代码-串口程序-ESP32-简单通讯交互-基础样例学习】

同时又做了ESP32的IO实验,

【PC电脑windows-学习样例generic_gpio-拓展GPIO-ESP32的GPIO程序-问题解决-GPIO输出实验-基础样例学习(2)】

那么现在组合起来就可以了。

自己之前就有做联合文章的经历,从上位机,到下位机,一整条链路,一次性打通,学习每个部分,最后组合在一起,其实多少有些分繁琐而简化。

就像之前文章一样。

【QT 自研上位机 与 STM32F4xx下位机联调>>>can通信测试-基础样例-联合文章】

【QT 自研上位机 与 STM32F103下位机联调>>>串口uart通信测试-基础样例-联合文章】

也就有了本次实验,以及这篇文章。

4、 实验过程

1、验证上位机QT程序

上位机这块我们采用之前的串口工厂简单修改,来完成我们的目标。
【QT 5 调试软件+串口相关初试串口+基础样例】

1、下载样例代码

(1)下载代码
代码连接:https://download.csdn.net/download/qq_22146161/86722251
使用qt开,然后硬件转换器短接。
在这里插入图片描述
qt运行原件如下,可以看到能收到自己发出的“123”
在这里插入图片描述

2、修改qt程序

我们简单改写程序,发出990和991,好和ESP32配合

(1)ui界面修改
在这里插入图片描述
(2)转到槽函数
在这里插入图片描述
在这里插入图片描述

(3)加入代码
在这里插入图片描述

3、运行测试验证

在这里插入图片描述

2、验证下位机ESP32程序

样例用的下ESP32,如下文章中的。同样的也是验证下。

【PC电脑windows编写代码-ESP32-串口控制GPIO编写代码-简单通讯交互控制IO-进阶样例学习-2】

1、下载样例代码

代码链接:https://download.csdn.net/download/qq_22146161/88678030

2、更改ESP32代码,编译下载

我们在990这条命令上,专门做了个双IO拉低拉高,这样好检验。

#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/uart.h"
#include "string.h"
#include "driver/gpio.h"#define TX_PIN 18
#define RX_PIN 19
#define BUF_SIZE 1024const char *expected_string0 = "990";
const char *expected_string1 = "991";
const char *expected_string2 = "992";
const char *expected_string3 = "993";
const char *expected_string4 = "994";
const char *expected_string5 = "995";
const char *expected_string6 = "996";#define GPIO_OUTPUT_IO_0    35
#define GPIO_OUTPUT_IO_1    36
#define GPIO_OUTPUT_IO_2    37
#define GPIO_OUTPUT_IO_3    38#define GPIO_OUTPUT_PIN_SEL  ((1ULL<<GPIO_OUTPUT_IO_0) |(1ULL<<GPIO_OUTPUT_IO_1) | (1ULL<<GPIO_OUTPUT_IO_2) | (1ULL<<GPIO_OUTPUT_IO_3)) // 配置GPIO_OUT位寄存器void gpio_init(void)
{gpio_config_t io_conf;  // 定义一个gpio_config类型的结构体,下面的都算对其进行的配置io_conf.intr_type = GPIO_INTR_DISABLE;  // 禁止中断  io_conf.mode = GPIO_MODE_OUTPUT;            // 选择输出模式io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL; // 配置GPIO_OUT寄存器io_conf.pull_down_en = 0;                   // 禁止下拉io_conf.pull_up_en = 1;                     // 禁止上拉gpio_config(&io_conf);                      // 最后配置使能
}void app_main(void) {gpio_init();// 配置UART参数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);// 设置UART1使用的TX和RX引脚uart_set_pin(UART_NUM_0, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);// 安装UART驱动程序,使用默认缓冲区大小uart_driver_install(UART_NUM_0, BUF_SIZE * 2, BUF_SIZE * 2, 0, NULL, 0);// 发送和接收数据的缓冲区uint8_t *data = (uint8_t *)malloc(BUF_SIZE);const char *test_str0 = "write_this_is_990";const char *test_str1 = "write_this_is_991";const char *test_str2 = "write_this_is_992";const char *test_str3 = "write_this_is_993";const char *test_str4 = "write_this_is_994";const char *test_str5 = "write_this_is_995";const char *test_str6 = "write_this_is_996";while (1) {// 发送数据const char *test_str = "Hello from UART01!";uart_write_bytes(UART_NUM_0, test_str, strlen(test_str));// 从UART接收数据int length = 0;ESP_ERROR_CHECK(uart_get_buffered_data_len(UART_NUM_0, (size_t *)&length));length = uart_read_bytes(UART_NUM_0, data, length, 20 / portTICK_PERIOD_MS);if (length > 0) {data[length] = 0; // 确保字符串以null终止printf("Received data: '%s'\n", (char *)data);gpio_set_level(GPIO_OUTPUT_IO_0, 0);            // 把这个GPIO输出地电平vTaskDelay(10 / portTICK_PERIOD_MS);gpio_set_level(GPIO_OUTPUT_IO_0, 1);          vTaskDelay(10 / portTICK_PERIOD_MS);//控制第一个IO上下if(strstr ((const char *)data, expected_string0)!=NULL ){uart_write_bytes(UART_NUM_0, test_str0, strlen(test_str0));gpio_set_level(GPIO_OUTPUT_IO_0, 0);            // 把这个GPIO输出地电平vTaskDelay(1000 / portTICK_PERIOD_MS);gpio_set_level(GPIO_OUTPUT_IO_1, 0);            // 把这个GPIO输出地电平vTaskDelay(1000 / portTICK_PERIOD_MS);gpio_set_level(GPIO_OUTPUT_IO_1, 1);            // 把这个GPIO输出地高平vTaskDelay(1000 / portTICK_PERIOD_MS);gpio_set_level(GPIO_OUTPUT_IO_0, 1);            // 把这个GPIO输出地高平vTaskDelay(1000 / portTICK_PERIOD_MS);printf("this is 990!");// break;}if(strstr ((const char *)data, expected_string1) !=NULL ){uart_write_bytes(UART_NUM_0, test_str1, strlen(test_str1));gpio_set_level(GPIO_OUTPUT_IO_0, 0);            // 把这个GPIO输出低电平printf("this is 991!");//  break;}//控制第二个IO上下if(strstr ((const char *)data, expected_string2)!=NULL ){uart_write_bytes(UART_NUM_0, test_str2, strlen(test_str2));gpio_set_level(GPIO_OUTPUT_IO_1, 1);            // 把这个GPIO输出高电平printf("this is 992!");//   break;}if(strstr ((const char *)data, expected_string3)!=NULL ){uart_write_bytes(UART_NUM_0, test_str3, strlen(test_str3));gpio_set_level(GPIO_OUTPUT_IO_1, 0);            // 把这个GPIO输出低电平printf("this is 993!");//   break;}//控制第三个IO上下if(strstr ((const char *)data, expected_string4)!=NULL ){uart_write_bytes(UART_NUM_0, test_str4, strlen(test_str4));gpio_set_level(GPIO_OUTPUT_IO_2, 1);            // 把这个GPIO输出高电平printf("this is 994");//   break;}if(strstr ((const char *)data, expected_string5)!=NULL ){uart_write_bytes(UART_NUM_0, test_str5, strlen(test_str5));gpio_set_level(GPIO_OUTPUT_IO_2, 0);            // 把这个GPIO输出低电平printf("this is 995!");//   break;}//单独功能if(strstr ((const char *)data, expected_string6)!=NULL ){uart_write_bytes(UART_NUM_0, test_str6, strlen(test_str6));//gpio_set_level(GPIO_OUTPUT_IO_2, 0);            // 把这个GPIO输出低电平printf("this is 996!");//   break;}}vTaskDelay(2000 / portTICK_PERIOD_MS);}
}

在这里插入图片描述

下载完了按下复位

3、验证

硬件连接

3/5V IN ---  ESP32-18
3V OUT  ---  ESP32-19
GND     ---  GND

在这里插入图片描述
然后使用一个串口软件打开,看看是否能收到消息。

在这里插入图片描述

3、联合调试-ESP32和qt上位机

1、硬件连接

其实到目前位置,硬件连接已经完成了。
当然我们还需要接上逻辑分析仪

3/5V IN ---  ESP32-18
3V OUT  ---  ESP32-19
GND     ---  GND//逻辑分析仪
GND  ---- GND
0通道 ---- ESP32-35
GND  ---- GND
1通道 ---- ESP32-36

2、验证

(1)上位机软件和逻辑分析仪截图说明
如下,为上位机发送990后,上位机>>>通过通讯>>>单片机>>>IO控制>>>逻辑分析仪,整条链路。
在这里插入图片描述
(1)代码和逻辑分析仪截图说明
这块要简单分析下代码,35GPIO先跳变了下,然后拉低3S,在此期间36GPIO拉低了1S。
在这里插入图片描述

5、代码连接

一套解决办法吧,需要代码的自取。
代码链接:https://download.csdn.net/download/qq_22146161/88689386

6、细节部分

(1)常见错误解决办法:

调试单片机的时候,或者说调试串口的时候,其实很难问题穷尽,但是一些方式,可以帮我们更快定位。

  1. UART配置错误:确保你的UART配置与你所使用的引脚和硬件设置相匹配。检查波特率、数据位、校验位和停止位是否正确配置。
  2. GPIO引脚不正确或被占用:检查你用作UART的GPIO引脚是否正确,并且没有被其他功能(如SPI、I2C或内置功能)占用。
  3. UART驱动安装问题:确保UART驱动正确安装,没有内存分配错误或其他问题。
  4. 缓冲区问题:检查是否有足够的空间在UART的发送缓冲区中存储要发送的数据。如果缓冲区已满,可能需要增加缓冲区大小或等待缓冲区可用。
  5. 硬件问题:检查你的ESP32开发板和任何连接的串行设备是否存在硬件故障。
    电源和接地问题:确保所有设备都有适当的电源和接地。

为了解决这个问题,可以尝试以下步骤:

  • 重新检查UART配置:确保UART的初始化和配置正确无误。
  • 检查GPIO引脚:验证所选择的GPIO引脚是否适合用作UART,且未被占用。
  • 检查驱动安装:确保使用 uart_driver_install 函数正确安装了UART驱动。
  • 增加缓冲区大小:如果需要,可以在调用 uart_driver_install 时增加缓冲区大小。
  • 硬件检查:检查ESP32开发板和相关硬件是否有任何明显的损坏或连接问题。

(2)ESP32工程下载后,先清理下

自己在下载过程中,发现直接编译也就是“idf.py build”的时候,会提示下,最好先清理下,然后重新编译。

在这里插入图片描述

(3)逻辑分析仪,需要跳变信号触发

如下,逻辑分析仪,在使用的时候,还是需要注意一下,它需要一个跳变信号,否则就会像下图一样,一直等待。
在这里插入图片描述
而且实际抓取信号,只后半部分,被拉高部分。
在这里插入图片描述
所以我们时间调试时,只要收到消息,先来个跳变信号触发下。
在这里插入图片描述

(4)逻辑分析仪,触发触发选择不点下面两个

实际想直接进行采集的,就把下面两个也点上了,实际测试应该是不选择下面两个
在这里插入图片描述

7、总结

如此一来,ESP32也有联合文章了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/600595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

55.网游逆向分析与插件开发-游戏增加自动化助手接口-自动药水设定功能的逆向分析

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;项目需求与需求拆解-CSDN博客 之前在找到过一个虚函数&#xff0c;每个按钮的都有一个实现机制&#xff0c;参考这里游戏结束过程的逆向分析 实际上找起来会不会用上不知道&#xff0c;接下来开始逆…

go语言 json marshal和unmarshal序列化字节切片和反序列化对象

json.Marshal 和 json.Unmarshal 是 Go 语言标准库中用于 JSON 编码和解码的函数。 - json.Marshal 用于将 Go 对象转换为 JSON 格式的字节切片。 go package main import ( "encoding/json" "fmt" ) type Person struct { Name string json:"name&qu…

二维码地址门牌系统技术服务:让您的生活更便捷,一码通行,安全无忧

文章目录 前言一、融合二维码技术与门牌的便捷服务二、手机开门便捷功能三、智能化安全保障四、智能化、便捷化的新型技术 前言 在数字化时代&#xff0c;二维码门牌系统技术应运而生&#xff0c;为了满足人们对安全、便捷生活的需求。这项技术将二维码与门牌结合&#xff0c;…

2019数据结构----队列真题

(1)允许增加空间&#xff0c;空间可以改变所以是通过链表,链式存储实现的&#xff1b;占用的空间可以重复使用&#xff0c;所以是循环队列。 (2)队空&#xff1a;frontrear;队满&#xff1a;frontrear->next

CNAS中兴新支点——什么是安全测试,安全测试报告有什么作用,主要测试哪些内容?

1.安全测试在做什么&#xff1f; 扫描&#xff1f;在很多人眼中&#xff0c;做安全的就是整天那个工具在哪里扫描操作&#xff0c;使用各种不同的工具做扫描。 是的&#xff0c;扫描是安全测试很重要的一部分&#xff0c;扫描可快速有效发现问题。扫描工具的易用性&#xff0…

霍尔传感器测速测距实验——STM32驱动(课程设计)

———————实验效果——————— &#x1f384;图片演示测距 &#x1f384;视频演示测速 基于STM32单片机 霍尔传感器测速度&#xff0c;测圈数 &#x1f384;模块介绍 测距使用HC-SR04模块 测距使用测速使用霍尔传感器 ———————代码获取查看下方———————…

商务智能|描述性统计分析与数据可视化

一、商务智能的三大方面 三个主要方面是描述性的统计分析、预测性的分析和指导性的数据分析。 A. 商务智能的知识体系下,数据分析包含了哪三个工作?商务智能体系架构里边关于数据分析的术语是什么? 商务智能的知识体系下,数据分析包含了三个工作,即描述性分析,预测性分析…

Mac Parallels19.1.0 Install CentOS7.9

0、资源准备 # centos7.9镜像一份 链接: https://pan.baidu.com/s/1acIjUnsTGhk_2cYCZLSoGg?pwd6666 提取码: 6666 --来自百度网盘超级会员v7的分享1、打开PD 2、选择镜像进行安装 指定镜像名称 创建 进行密码设置 安装目的地点开后直接点击完成 网络和主机名称 开…

编程语言的生命力

一、目前主流的编程语言 目前流行的编程语言有很多种&#xff0c;可谓是百花齐放、百家争鸣。根据不同的应用场景和领域&#xff0c;有不同的编程语言被广泛使用。一些目前主流的编程语言HTML5、Python、JavaScript 、Java 、C 、PHP 、Swift 等等。 还有许多其他的编程语言&am…

xcode-开发相关

分发方式 下面是指应用程序分发方法&#xff0c;决定了你可以将app安装到哪些设备以及应用可以使用哪些功能 每个分发模式对应的provision profile不同 debug release ad hoc(临时分发) 允许100台指定的移动设备&#xff0c;这种分发不会将应用发布到App Store&#xff0c…

使用国内镜像源来安装 Golang 包:

使用国内镜像源来安装 Golang 包&#xff1a; 阿里云&#xff1a;https://mirrors.aliyun.com/goproxy/ 要使用这些镜像源&#xff0c;请将 GOPROXY 环境变量设置为所选镜像源的 URL。例如&#xff0c;要使用阿里云镜像源&#xff0c;请在命令行中运行以下命令&#xff1a; …

Java SE面试

1.什么是 Java&#xff1f; Java 是一门面向对象的编程语言&#xff0c;不仅吸收了 C语言的各种优点&#xff0c;还摒弃了 C里难以理解的多继承、指针等概念&#xff0c;因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的优秀代表&#xff…

麒麟系统U盘安装

U盘安装盘制作 方法一 (仅适用于龙芯桌面V5.0) 准备U盘&#xff1a; 推荐使用fat32 (vfat) 格式的U盘&#xff1b;把整个系统镜像 XXX.iso 复制到U盘下面&#xff1b;把镜像XXX.iso 挂载起来&#xff0c;然后复制镜像中的boot文件夹和ks.cfg 到U盘根目录&#xff1b;复制镜像中…

Qt 6之四:基础概念讲解

Qt 6之四&#xff1a;基础概念讲解 Qt是一种跨平台的C应用程序开发框架&#xff0c;它提供了一套丰富的工具和库&#xff0c;可以帮助开发者快速构建跨平台的应用程序&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;和非GUI应用程序。 Qt 6之一&#xff1a;简介…

Python小细节之Gui图形化界面库tkinter学习

敲打计数脚本学TKinter 引言开整选择决定难易了解她使用她运行效果 结尾 引言 我的爬取表情包的爬虫文件写好了 运行 输入关键词就可以得到对应的 表情包 我也通过pyinstall 打包了 但是很丑 就只有一个黑box 我是新手 所以我知道 这对于普通人来说 不友好 且在使用的过程中 …

C++ 具名要求-布局

此页面中列出的具名要求&#xff0c;是 C 标准的规范性文本中使用的具名要求&#xff0c;用于定义标准库的期待。 某些具名要求在 C20 中正在以概念语言特性进行形式化。在那之前&#xff0c;确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做&#xf…

Pendulum详解4——Pendulum在数据挖掘中的威力 - 时间的宝藏

写在开头 在这个数字化时代,时间数据无处不在,而它往往蕴含着丰富的信息。然而,在数据挖掘中,我们经常需要处理不同时间维度的数据,从而更好地理解和预测各种现象。Pendulum库的引入为我们提供了一种简洁而强大的工具,可以更好地处理和分析时间数据。 1. 集聚分析 地理…

Apache Doris 2.0.2 安装步骤 Centos8

Linux 操作系统版本需求 Linux 系统版本当前系统版本CentOS7.1 及以上CentOS8Ubuntu16.04 及以上- 软件需求 软件版本当前版本Java1.81.8.0_391GCC4.8.2 及以上gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-4) 1、查看操作系统版本 方法 1&#xff1a;使用命令行 打开终端或…

MongoDB笔记

文章目录 安装查看数据库命令手册 学习地址&#xff1a;https://www.bilibili.com/video/BV16u4y1y7Fm 安装 下载地址 https://www.mongodb.com/try/download/community-kubernetes-operator查看数据库 查看当前数据库 show dbs show databases切换数据库 use 数据库名称cls…

建站指南,如何将拥有的域名自定义链接到wordpress

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 在Dynadot上&#xff0c;我们可已经账户中管理的…