标题:
STC8H双串口,串口2为什么只能发收不到啊谢谢
[打印本页]
作者:
tlxfif
时间:
2025-8-3 14:28
标题:
STC8H双串口,串口2为什么只能发收不到啊谢谢
#include <STC8H.H>
// 全局变量:定义一个环形缓冲区
#define BUFFER_SIZE 20 // 缓冲区大小,根据需要调整
unsigned char rx_buffer[BUFFER_SIZE]; // 接收缓冲区数组
unsigned char rx_in = 0; // 写入指针
unsigned char rx_out = 0; // 读取指针
unsigned char rx_count = 0; // 当前缓冲区中数据的数量
unsigned char rx_buffer2[BUFFER_SIZE]; // 接收缓冲区数组
unsigned char rx_in2 = 0; // 写入指针
unsigned char rx_out2 = 0; // 读取指针
unsigned char rx_count2 = 0; // 当前缓冲区中数据的数量
void Uart1_Init(void)
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xE0; //设置定时初始值
TH1 = 0xFE; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
}
void Uart2_Init(void)
{
S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器时钟1T模式
//9600频率
T2L = 0xE0; //设置定时初始值
T2H = 0xFE; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
}
void Delay10ms(void) //@11.0592MHz
{
unsigned char data i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void Delay1000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
i = 57;
j = 27;
k = 112;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UART1_Isr() interrupt 4
{
unsigned char received_byte;
if(RI)
{
RI = 0;
received_byte = SBUF;
if (rx_count < BUFFER_SIZE)
{
rx_buffer[rx_in] = received_byte; // 写入数据
rx_in = (rx_in + 1) % BUFFER_SIZE; // 更新写入指针
rx_count++; // 增加计数
}
}
}
void UART2_Isr() interrupt 8
{
unsigned char received_byte2;
P12 =1;
Delay1000ms();
if(S2CON & 0x01){
S2CON &= ~0x01;
received_byte2 = S2BUF;
if (rx_count2 < BUFFER_SIZE)
{
rx_buffer2[rx_in2] = received_byte2; // 写入数据
rx_in2 = (rx_in2 + 1) % BUFFER_SIZE; // 更新写入指针
rx_count2++; // 增加计数
}
}
}
void main() {
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
Uart1_Init();
Uart2_Init();
IE2 |= 0x01; //使能串口2中断
ES = 1; //使能串口1中断
EA=1; //总中断控制
//P1M0 = 0x00;
//P1M1 = 0x00;
while(1) // 无限循环
{
if (rx_count > 0) // 如果缓冲区中有数据
{
//TI = 0; // 清除发送中断标志(如果需要)
SBUF = 4;
//SBUF = rx_buffer[rx_out]; // 从缓冲区取出数据发送
S2BUF = rx_buffer[rx_out];
rx_out = (rx_out + 1) % BUFFER_SIZE; // 更新读取指针
rx_count--; // 减少计数
//P12 =1;
//Delay10ms();
}else if(rx_count2 > 0){
SBUF = 5;
//SBUF = rx_buffer2[rx_out2];
rx_out2 = (rx_out2 + 1) % BUFFER_SIZE;
rx_count2--;
P12 =1;
Delay10ms();
}
else{
P12 =0;
}
}
}
复制代码
作者:
devcang
时间:
2025-8-4 11:54
下载工具有example程序
作者:
lgwd
时间:
2025-8-4 18:49
1000%是你自己的问题!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1