1.使用结构体进行参数的初始化
void uart_init(u32 bound)
{
//GPIO端口配置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_InitStructure.USART_BaudRate = bound; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位字长
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启串口接收中断
USART_Cmd(USART1, ENABLE); //使能串口1
}
2.再封装一层或者叫重新封装一层
struct {
Flag标志位
bound
返回工作模式(ok,busy,error)
发送回调函数
接收回调函数
}
举个例子
当使用transmit函数进行发送时,传入参数transmit(char *buf, int size)
,在transmit函数内部需要完成发送,并且需要返回一个结构体,即一个句柄,句柄里包含发送之后的状态以及发送消息的长度。
下面为一段伪代码
#include <stdio.h>
typedef struct {
int status; // 发送状态,0 表示成功,其他值表示错误状态
int length; // 发送的数据长度
} TransmitHandle;
// 假设我们有一个 UART 发送函数,实际的发送代码会依据硬件来实现
int uart_send(char *buf, int size) {
// 在此处实际发送数据的代码,可以是通过 UART 外设发送数据的过程
// 假设我们在这里模拟发送过程
for (int i = 0; i < size; i++) {
// 模拟发送一个字符 (你可以替换成具体的硬件发送代码)
putchar(buf[i]);
}
return 0; // 0 表示成功,非零表示失败
}
// transmit 函数,发送数据并返回一个结构体
TransmitHandle transmit(char *buf, int size) {
TransmitHandle handle;
// 调用 uart_send 函数发送数据
int send_status = uart_send(buf, size);
// 根据发送状态更新句柄
if (send_status == 0) {
handle.status = 0; // 发送成功
} else {
handle.status = -1; // 发送失败
}
// 更新发送的字节数
handle.length = size;
return handle;
}
int main() {
char message[] = "Hello, Keil!";
int message_size = sizeof(message) - 1; // 计算消息的长度,不包括 '\0'
// 调用 transmit 函数发送数据
TransmitHandle result = transmit(message, message_size);
// 输出结果
if (result.status == 0) {
printf("\nMessage sent successfully! Length: %d bytes.\n", result.length);
} else {
printf("\nMessage sending failed! Error code: %d\n", result.status);
}
return 0;
}