实现两个开发板的串口通讯(基于STC8实现)

实现两个开发板的串口通讯:开发板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;
            }
        }
    }
}