实验简介
我们使用USB-TTL模块连接PD.4和PD.5两个引脚,将引脚复用为UART2的功能,实现串口双向的收发不定长数据!


需要准备两个串口调试工具
创建相关代码文件夹
我们先要在\\\\luban-lite\\\\application\\\\rt-thread\\\\helloworld\\\\这个文件夹中创建一个user_uart文件夹!
需要添加这个文件
所以我们在user_uart文件夹中的SConscript文件写入以下代码:
Import('AIC_ROOT') # 导入AIC_ROOT变量,通常用于表示项目根目录
Import('rtconfig') # 导入rtconfig变量,通常包含项目的配置信息
import rtconfig # 导入rtconfig模块,以便直接使用其中的配置
from building import * # 从building模块导入所有内容,可能包含自定义的构建函数和变量
cwd = GetCurrentDir() # 获取当前SConscript文件所在的目录路径
CPPPATH = [cwd] # 将当前目录添加到编译器的头文件搜索路径中列表
src = [] # 创建一个空列表,用于存放源文件
if GetDepend('USER_UART3_TEST_ON') and GetDepend('AIC_USING_UART3'):
src = Glob(os.path.join(cwd, '*.c')) # 使用Glob函数查找当前目录下所有的.c文件,并将它们添加到src列表中
group = DefineGroup('lckfb-user-uart3-test', src, depend = [''], CPPPATH = CPPPATH) #源文件
Return('group') # 将定义的构建组作为返回值,这样其他SConscript文件可以引用这个组
通过以上代码构建程序框架
编写UART2驱动代码
我们在uart_test.c文件中添加一下代码
#include <getopt.h>
#include <string.h>
#include <rtthread.h>
#include <aic_core.h>
#include <stdlib.h>
#include <sys/time.h>
#include "hal_adcim.h"
#include "rtdevice.h"
#include "aic_log.h"
#include "hal_gpai.h"
#include <stdio.h>
#include "aic_hal_gpio.h"
#define SAMPLE_UART_NAME "uart2"
#define RCV_BUFF_SIZE_MAX 1024
static struct rt_semaphore rx_sem;
static rt_device_t serial;
static rt_thread_t serial_recv_thread;
static char serial_recv_buff[RCV_BUFF_SIZE_MAX];
static char serial_recv_flag;
static int serial_recv_length;
#define THREAD_PRIORITY 25
#define THREAD_STACK_SIZE 4096
#define THREAD_TIMESLICE 20
static rt_thread_t serial_thread = RT_NULL;
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
if (size > 0)
rt_sem_release(&rx_sem);
return RT_EOK;
}
static void serial_recv_thread_entry(void *param)
{
rt_kprintf("\\nserial_recv_thread_entry run ......\\n");
while(1)
{
char temp_recv_buff = 0;
int ret = rt_device_read(serial, 0, &temp_recv_buff, 1);
if(ret < 0)
{
pr_debug("read() return [%ld] %s\\\\n", rt_get_errno(), rt_strerror(rt_get_errno()));
}
if(ret == 0)
{
rt_sem_control(&rx_sem, RT_IPC_CMD_RESET, RT_NULL);
rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
}
if(ret == 1)
{
if(serial_recv_length < RCV_BUFF_SIZE_MAX - 1)
{
serial_recv_buff[serial_recv_length++] = temp_recv_buff;
}
else
{
serial_recv_length = 0;
serial_recv_buff[serial_recv_length++] = temp_recv_buff;
}
serial_recv_buff[serial_recv_length] = '\\\\0';
serial_recv_flag = 1;
}
}
}
while(data_buff && *data_buff)
{
if(RT_EOK != Serial_Send_Byte(*data_buff++))
{
err_count++;
continue;
}
}
if(err_count)
{
LOG_E("serial_send_string failed !!!");
return -RT_ERROR;
}
return RT_EOK;
}
int Serial_Recv_DATA(uint8_t *data_buff)
{
int i;
if((serial_recv_flag != 1) || (serial_recv_length == 0))
{
return 0;
}
for(i = 0; i < serial_recv_length; i++)
{
data_buff[i] = serial_recv_buff[i];
}
data_buff[i] = '\\0';
Clear_recv_buff();
return i;
}
uint8_t recv_buff[128] = {0};
count = Serial_Recv_DATA(recv_buff);
if (count > sizeof(recv_buff))
{
LOG_E("Error: Received data exceeds buffer size! count = %d",count);
count = sizeof(recv_buff);
}
if (count > 0)
{
rt_kprintf("\\\\n======================================\\\\n");
rt_kprintf("\\\\nRead Data = %s\\\\n", recv_buff);
rt_kprintf("\\\\n======================================\\\\n");
}
rt_thread_mdelay(1000);
}
}
static void send_demoData(int argc, char **argv)
{
static int num = 1;
uint8_t Send_Buff[128] = {"kunlunpi * UART框架使用测试"};
int ret = 0;
char buffer[128] = {0};
snprintf(buffer, sizeof(buffer), "【%d】%s", num, (argc == 2) ? *(argv+1) : (char *)Send_Buff);
ret = Serial_Send_String((uint8_t *)buffer);
if(ret != RT_EOK)
{
LOG_E("%s: The test data transmission failed.", __FUNCTION__);
}
else
{
rt_kprintf("\\\\n[%d] Send success\\\\n", num);
num++;
}
}
MSH_CMD_EXPORT(send_demoData, Send test data);
static void uart2_test_on(int argc, char **argv)
{
int ret = UART_Init();
if(ret != RT_EOK)
{
LOG_E("Failed to [UART_Init] !!!");
LOG_E("file: %s line: %d", **FILE** , **LINE** );
return;
}
rt_kprintf("UART_Init run END!!\\n");
serial_thread = rt_thread_create("serial2_thread",
serial2_thread_entry, RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE);
if (serial_thread != RT_NULL)
rt_thread_startup(serial_thread);
rt_kprintf("Test transmission and reception using UART2 serial port!!\\\\n");
}
MSH_CMD_EXPORT(uart2_test_on, Test transmission and reception using UART2 serial port);
以上代码大部分都归属立创开发板
需要填加文件配置文件
在同级Kconfig中写入一下代码
config USER_UART2_TEST_ON
bool "Test transmission and reception using UART2 serial port"
default n
help
然后程序编译等待编译完成

会出现Luban-Lite is built successfully
烧录程序
打开串口调试工具

我们可以看到串口输出信息
最后我给串口发送信息能发送到我的电脑
