
暑假周报1
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的意义大家都懂,这里不再做过多解释,
实验结果
通过串口工具,当我单挑发送das字符的时候,可以看到上面从单片机返回的字符串也是das,由此可见单片机的串通信成功。
文章版权声明:本文由[tatan]原创发布,版权所有。
未经书面授权,禁止任何单位及个人以任何方式进行转载、摘编、复制或建立镜像。违反上述声明者,将依法追究其相关法律责任。