网上很多多串口的教程,但是效果因人而异。
我现在写一篇正点原子精英板直接可以复制使用的教程,
其他开发板也可参考我这种修改例程的方法。
复制模板
正点原子的串口实验直接复制一份,修改里面的文件即可。
修改usart.h
例程的头文件是
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "sys.h"
#define USART_REC_LEN 200 //定义最大接收字节数 200
#define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收
extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART_RX_STA; //接收状态标记
//如果想串口中断接收,请不要注释以下宏定义
void uart_init(u32 bound);
#endif
我们想要多个串口 以两个串口为例 我们做如下修改
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "sys.h"
#define USART_REC_LEN 200 //定义最大接收字节数 200
#define EN_USART1_RX 1 //使能(1)/禁止(0)串口1接收
#define USART2_REC_LEN 200 //定义最大接收字节数 200
#define EN_USART2_RX 1 //使能(1)/禁止(0)串口1接收
extern u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART_RX_STA; //接收状态标记
extern u8 USART2_RX_BUF[USART2_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART2_RX_STA; //接收状态标记
void uart_init(u32 bound);
void uart2_init(u32 bound);
#endif
如果想再加串口 依葫芦画瓢即可
修改usart.c
正点原子的的串口1函数全在这个这个if判定里面,那我们只要复制这个函数,并修改根据刚刚的头文件 修改里面变量即可。
就像这样
为了防止有些小伙伴粗心,总是遗漏一点点东西没修改,下面放出一份改好的串口2 PA2 PA3
#if EN_USART2_RX //如果使能了串口2接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART2_RX_BUF[USART2_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字节数目
u16 USART2_RX_STA=0; //接收状态标记
void uart2_init(u32 bound){
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure