实现两个开发板的串口通讯(基于STC8实现)
实现两个开发板的串口通讯:开发板1转发数据给开发板2要用UART2,开发板2转发数据给开发板1数据要求用UART2
- 注意的问题:接线和调试设计问题
- UART1不用连线,不用连线,只要插上USB线,就已经和电脑连接好了
- UART1用于PC发送数据,再通过UART2转发另外一个板子
- 所以说UART1和UART2都要用
- 开发板1发送消息给开发板2,控制开发板2的灯泡亮或者灭
- 开发板2发送消息给开发板1,控制开发板1的灯泡亮或者灭
- 发送0x00,对方灯灭
- 发送0x01,对方灯亮
main.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 P31GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1; //指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P3, &GPIO_InitStructure);//初始化// P53GPIO_InitStructure.Pin = GPIO_Pin_3; //指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P5, &GPIO_InitStructure);//初始化// UART2:P46 P47GPIO_InitStructure.Pin = GPIO_Pin_6 | GPIO_Pin_7; //指定要初始化的IO,GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P4, &GPIO_InitStructure);//初始化
}/*************** 串口初始化函数 *****************/
void UART_config(void)
{COMx_InitDefine COMx_InitStructure; //结构定义//========================================= UART1COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use = BRT_Timer1; //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLEUART_Configuration(UART1, &COMx_InitStructure); //初始化串口1 UART1,UART2,UART3,UART4NVIC_UART1_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3UART1_SW(UART1_SW_P30_P31); //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44//========================================= UART2COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use = BRT_Timer2; //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLEUART_Configuration(UART2, &COMx_InitStructure); //初始化串口1 UART1,UART2,UART3,UART4NVIC_UART2_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3UART2_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_recvon_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_recvon_uart2_recv(RX2_Buffer[i]);}}COM2.RX_Cnt = 0;}}}
}