荐 STC8A基于STC15的双串口中断收发程序的移植
程序员文章站
2022-06-23 22:09:37
STC官网的STC15系列库函数与例程测试版V2.0例程里包含"05-双串口中断收发",那是基于STC15系列单片机的。首先做的是先基于STC8实现1024字节的收发和返回.由于u8最大表示255,因为1024>255,所以与读写有关的变量数据类型必须调整到u16.具体改动位置如下:增大接收缓冲区的修改:串口部分的修改,由于利用STC15的文件,所以STC8A的串口2改在P1.0 P1.1。这样修改后保存并编译可以实现STC8A的串口1和2各自的自收自发功能......
STC官网的STC15系列库函数与例程测试版V2.0例程里包含"05-双串口中断收发",那是基于STC15系列单片机的。首先做的是先基于STC8实现1024字节的收发和返回.
由于u8最大表示255,因为1024>255,所以与读写有关的变量数据类型必须调整到u16.
具体改动位置如下:
增大接收缓冲区的修改:
串口部分的修改,由于利用STC15的文件,所以STC8A的串口2改在P1.0 P1.1。
这样修改后保存并编译可以实现STC8A的串口1和2各自的自收自发功能.
要实现串口交叉收发需修改main.c文件
usart.h
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* --- QQ: 800003751 ----------------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
#ifndef __USART_H
#define __USART_H
#include "config.h"
//#define COM_TX1_Lenth 128
//#define COM_RX1_Lenth 128
//#define COM_TX2_Lenth 128
//#define COM_RX2_Lenth 128
#define COM_TX1_Lenth 1024
#define COM_RX1_Lenth 1024
#define COM_TX2_Lenth 1024
#define COM_RX2_Lenth 1024
#define USART1 1
#define USART2 2
#define UART_ShiftRight 0 //同步移位输出
#define UART_8bit_BRTx (1<<6) //8位数据,可变波特率
#define UART_9bit (2<<6) //9位数据,固定波特率
#define UART_9bit_BRTx (3<<6) //9位数据,可变波特率
#define UART1_SW_P30_P31 0
#define UART1_SW_P36_P37 (1<<6)
#define UART1_SW_P16_P17 (2<<6) //必须使用内部时钟
#define UART2_SW_P10_P11 0
#define UART2_SW_P46_P47 1
#define TimeOutSet1 15
#define TimeOutSet2 15
#define BRT_Timer1 1
#define BRT_Timer2 2
typedef struct
{
u8 id; //串口号
u16 TX_read; //发送读指针
u16 TX_write; //发送写指针
u8 B_TX_busy; //忙标志
u16 RX_Cnt; //接收字节计数
u8 RX_TimeOut; //接收超时
u8 B_RX_OK; //接收块完成
} COMx_Define;
typedef struct
{
u8 UART_Mode; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
u8 UART_BRT_Use; //使用波特率, BRT_Timer1,BRT_Timer2
u32 UART_BaudRate; //波特率, ENABLE,DISABLE
u8 Morecommunicate; //多机通讯允许, ENABLE,DISABLE
u8 UART_RxEnable; //允许接收, ENABLE,DISABLE
u8 BaudRateDouble; //波特率加倍, ENABLE,DISABLE
u8 UART_Interrupt; //中断控制, ENABLE,DISABLE
u8 UART_Polity; //优先级, PolityLow,PolityHigh
u8 UART_P_SW; //切换端口, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
u8 UART_RXD_TXD_Short; //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
} COMx_InitDefine;
extern COMx_Define COM1,COM2;
extern u8 xdata TX1_Buffer[COM_TX1_Lenth]; //发送缓冲
extern u8 xdata RX1_Buffer[COM_RX1_Lenth]; //接收缓冲
extern u8 xdata TX2_Buffer[COM_TX2_Lenth]; //发送缓冲
extern u8 xdata RX2_Buffer[COM_RX2_Lenth]; //接收缓冲
u8 USART_Configuration(u8 UARTx, COMx_InitDefine *COMx);
void TX1_write2buff(u8 dat); //写入发送缓冲,指针+1
void TX2_write2buff(u8 dat); //写入发送缓冲,指针+1
void PrintString1(u8 *puts);
void PrintString2(u8 *puts);
//void COMx_write2buff(COMx_Define *COMx, u8 dat); //写入发送缓冲,指针+1
//void PrintString(COMx_Define *COMx, u8 *puts);
#endif
main.c
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* --- QQ: 800003751 ----------------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
#include "config.h"
#include "USART.h"
#include "delay.h"
/************* 功能说明 **************
双串口全双工中断方式收发通讯程序。
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.
******************************************/
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
/************* 本地函数声明 **************/
/************* 外部函数和变量声明 *****************/
void UART_config(void)
{
COMx_InitDefine COMx_InitStructure; //结构定义
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
COMx_InitStructure.UART_Interrupt = ENABLE; //中断允许, ENABLE或DISABLE
COMx_InitStructure.UART_Polity = PolityLow; //中断优先级, PolityLow,PolityHigh
COMx_InitStructure.UART_P_SW = UART1_SW_P30_P31; //切换端口, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
COMx_InitStructure.UART_RXD_TXD_Short = DISABLE; //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
USART_Configuration(USART1, &COMx_InitStructure); //初始化串口1 USART1,USART2
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.UART_Interrupt = ENABLE; //中断允许, ENABLE或DISABLE
COMx_InitStructure.UART_Polity = PolityLow; //中断优先级, PolityLow,PolityHigh
COMx_InitStructure.UART_P_SW = UART2_SW_P10_P11; //切换端口, UART2_SW_P10_P11,UART2_SW_P46_P47
USART_Configuration(USART2, &COMx_InitStructure); //初始化串口2 USART1,USART2
PrintString1("STC15F2K60S2 UART1 Test Prgramme!\r\n"); //SUART1发送一个字符串
PrintString2("STC15F2K60S2 UART2 Test Prgramme!\r\n"); //SUART2发送一个字符串
}
/**********************************************/
void main(void)
{
u16 i;
UART_config();
EA = 1;
while (1)
{
delay_ms(1);
if(COM1.RX_TimeOut > 0) //超时计数
{
if(--COM1.RX_TimeOut == 0)
{
if(COM1.RX_Cnt > 0)
{
for(i=0; i<COM1.RX_Cnt; i++) TX2_write2buff(RX1_Buffer[i]); //串口1收到的数据原样返回给串口2
}
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++) TX1_write2buff(RX2_Buffer[i]); //串口2收到的数据原样返回给串口1
}
COM2.RX_Cnt = 0;
}
}
}
}
本文地址:https://blog.csdn.net/armcsdn/article/details/107305205
上一篇: 对错误,漏洞和exploits的说明
下一篇: 0基础学习前端开发的一些建议