实现两个开发板的串口通讯:开发板1转发数据给开发板2要用UART2,开发板2转发数据给开发板1数据要求用UART2
-
注意的问题:接线和调试设计问题
- UART1不用连线,不用连线,只要插上USB线,就已经和电脑连接好了
- UART1用于PC发送数据,再通过UART2转发另外一个板子
- 所以说UART1和UART2都要用
-
开发板1发送消息给开发板2,控制开发板2的灯泡亮或者灭
-
开发板2发送消息给开发板1,控制开发板1的灯泡亮或者灭
- 发送0x00,对方灯灭
- 发送0x01,对方灯亮

main.c代码
c
#include "GPIO.h"
#include "Delay.h"
#include "UART.h"
#include "NVIC.h"
#include "Switch.h"
void GPIO_config(void) {
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
// UART1:P30 P31
GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1; //指定要初始化的IO,
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3, &GPIO_InitStructure);//初始化
// P53
GPIO_InitStructure.Pin = GPIO_Pin_3; //指定要初始化的IO,
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P5, &GPIO_InitStructure);//初始化
// UART2:P46 P47
GPIO_InitStructure.Pin = GPIO_Pin_6 | GPIO_Pin_7; //指定要初始化的IO,
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化
}
/*************** 串口初始化函数 *****************/
void UART_config(void)
{
COMx_InitDefine COMx_InitStructure; //结构定义
//========================================= UART1
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE
UART_Configuration(UART1, &COMx_InitStructure); //初始化串口1 UART1,UART2,UART3,UART4
NVIC_UART1_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
UART1_SW(UART1_SW_P30_P31); //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
//========================================= UART2
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_InitStructure.UART_BRT_Use = BRT_Timer2; //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE
UART_Configuration(UART2, &COMx_InitStructure); //初始化串口1 UART1,UART2,UART3,UART4
NVIC_UART2_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
UART2_SW(UART2_SW_P46_P47); //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}
// A板子从UART1收的数据,通过UART2发送给B板子
void on_uart1_recv(u8 buf1) {
TX2_write2buff(buf1);
}
// B板子从UART2收的数据,通过UART1发送给PC
void on_uart2_recv(u8 buf2) {
TX1_write2buff(buf2);
if (buf2 == 0x00) { // 灭
P53 = 0;
} else if (buf2 == 0x01) { // 亮
P53 = 1;
}
}
void main() {
u8 i;
// 配置
GPIO_config();
UART_config();
// 全局中断使能(把UART_Isr.c加进来)
// 打开中断总开关
EA = 1;
// P53 默认是灭的
P53 = 0;
// 死循环
while (1) {
delay_ms(20);
if(COM1.RX_TimeOut > 0) {
//超时计数
if(--COM1.RX_TimeOut == 0) {
if(COM1.RX_Cnt > 0) {
for(i=0; i<COM1.RX_Cnt; i++) {
// RX1_Buffer[i]存的是接收的数据
// TODO: 做具体的逻辑 on_uart1_recv
on_uart1_recv(RX1_Buffer[i]);
}
}
COM1.RX_Cnt = 0;
}
}
if(COM2.RX_TimeOut > 0) {
//超时计数
if(--COM2.RX_TimeOut == 0) {
if(COM2.RX_Cnt > 0) {
for(i=0; i<COM2.RX_Cnt; i++) {
// RX2_Buffer[i]存的是接收的数据
// TODO: 做具体的逻辑 on_uart2_recv
on_uart2_recv(RX2_Buffer[i]);
}
}
COM2.RX_Cnt = 0;
}
}
}
}