暑假周报1

暑假周报1

tatan

2025-06-29 发布94 浏览 · 0 点赞 · 0 收藏

1建立UART通信

UART 是一个常用的串行的通信协议 主要的作用大概类似于让电脑和单片机进行通信和对话的一个功能,他可以让我们快速地了解到单片机此时的状态,常规的来说,在一般的使用过程之中,我们可以通过UART快速地了解到单片机中温度传感器,湿度传感器,返回给计算机的数据,通过这样的方式,来知道单片机中的数据,你可能会有疑问,没有串口就不能知道其中的数据吗,其实也是可以的,不过这也意味着另外的一个问题,单片机他本身存不存在一个可以输出的窗口,让我们知道他的状态,某一种层面上来说(用户层面),当单片机本身存在输出窗口,比如说LCD,LED显示屏,音响等等,那确实,这样子来看的话,UART对于单片机来说却是没有作用的,可是对于开发者来说,在没有这些输出设备的时候,及在我们工作室没有米情况下,购买不起输出设备,UART就可以把单片机和电脑沟通起来,当然了人也可以和电脑沟通,固人也可以和单片机沟通了,当然在开发的过程当中,我们也不知道单片机会出现什么样子的一个bug导致我们写进去的程序达不到我们预期中的一种成果,即便存在输出设备的情况。一般来说,我们是不会直接把开发的情况给用户看,因此,大多数情况下,仅仅通过输出设备很难读取到单片机内部的情况,这个时候UART对于开发者的作用来说,就是十分重要的了。

2实验过程

今天我们要进行搭建的一个实验就是通过电脑和单片机进行沟通,当用户通过串口工具发送一个字符串给单片机的时候,单片机返回给我们一个相同的字符串。


注:由于我们使用设备的时候,环境下已经存在了UART所需要的库函数了,因此只需要掌握函数的作用,便可以完成该实验。


代码搭建:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/usb_serial_jtag.h"
#include "sdkconfig.h" 
#include "esp_log.h" 
#include "esp_check.h"

#define BUF_SIZE (1024) 
#define ECHO_TASK_STACK_SIZE (4096) 

static void echo_task(void *arg) 
{    
//配置驱动     
usb_serial_jtag_driver_config_t usb_serial_jtag_config = 
{	
	.rx_buffer_size = BUF_SIZE,    
	.tx_buffer_size = BUF_SIZE,
};     
ESP_ERROR_CHECK(usb_serial_jtag_driver_install(&usb_serial_jtag_config));     	
ESP_LOGI("usb_serial_jtag echo", "USB_SERIAL_JTAG init done");         

//错误冗余     
	uint8_t *data = (uint8_t *) malloc(BUF_SIZE);     
	if (data == NULL)
	{        
		ESP_LOGE("usb_serial_jtag echo", "no memory for data");         
		return;    
	}     

//实现回显     
	while (1) 
	{         
		int len = usb_serial_jtag_read_bytes(data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS);         
		if (len)
		{             
			usb_serial_jtag_write_bytes((const char *) data, len, 20 / portTICK_PERIOD_MS);             
			data[len] = '\0';             
			ESP_LOG_BUFFER_HEXDUMP("Recv str: ", data, len, ESP_LOG_INFO);        
		}     
	} 
} 

void app_main(void) 
{     
	xTaskCreate(echo_task, "USB SERIAL JTAG_echo_task", ECHO_TASK_STACK_SIZE, NULL, 10, NULL); 
} 

代码解析

#define BUF_SIZE (1024) 
#define ECHO_TASK_STACK_SIZE (4096) 

BUF_SIZE:设置 USB 数据缓冲区大小为 1024 字节。
ECHO_TASK_STACK_SIZE:定义回显任务的堆栈大小为 4096 字节。

usb_serial_jtag_driver_config_t usb_serial_jtag_config = 
{	
	.rx_buffer_size = BUF_SIZE,    
	.tx_buffer_size = BUF_SIZE,
};  

配置USB发送端和接收端缓冲区的大小

while (1) 
{     
	int len = usb_serial_jtag_read_bytes(data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS);     
	if (len) 
	{         
		usb_serial_jtag_write_bytes((const char *) data, len, 20 / portTICK_PERIOD_MS);    
		data[len] = '\0';         
		ESP_LOG_BUFFER_HEXDUMP("Recv str: ", data, len, ESP_LOG_INFO);     
	} 
}

usb_serial_jtag_read_bytes(data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS)该函数的作用是读取usb提供的字符串,同时返回字符串的长度,读取到的字符串存储在data数组中,一共的大小是BUF_SIZE - 1,同时还设置了超时时间为20ms,
将得到的数据进行回显,在data字符数组的后面加上\0的意义大家都懂,这里不再做过多解释,

实验结果

bb7a67cb3b392c17fffba5157fd4e748.png
通过串口工具,当我单挑发送das字符的时候,可以看到上面从单片机返回的字符串也是das,由此可见单片机的串通信成功。


文章版权声明:本文由[tatan]原创发布,版权所有。
未经书面授权,禁止任何单位及个人以任何方式进行转载、摘编、复制或建立镜像。违反上述声明者,将依法追究其相关法律责任。