- 打卡等级:初来乍到
- 打卡总天数:2
- 最近打卡:2026-01-01 23:03:24
已绑定手机
新手上路
- 积分
- 10
|
发表于 2025-12-21 09:43:40
|
显示全部楼层
我也是觉得中断不靠谱,不及时处理会丢数据,自己写了个双指针接收方式,给大家分享一下
#define UART3_OLEN 32 // 串行发送缓存区大小
u8 xdata UART3_buf1[UART3_OLEN];
u8 idata UART3_outa=0; // 最后放入发送缓存区的字节位置
u8 idata UART3_outb=0; // 最后从发送缓存区取走字节位置
bit UART3_busy=0; // 发送缓存区发完=0,正在发送=1
#define UART3_ILEN 256 // 串行接收缓存区大小
u8 xdata UART3_buf2[UART3_ILEN];
u8 idata UART3_ina=0; // 最后放入发接收存区的字节位置
u8 idata UART3_inb=0; // 最后从接收缓存区取走字节位置
////////////////////////////////////////
// 从发送缓存区发送一个字节
void UART3_outchar()
{
if (UART3_outb==UART3_outa){UART3_busy=0; return;} // 发送缓存区数据发送完成 UART3_busy=0
UART3_SendData(UART3_buf1[UART3_outb++]);
UART3_busy=1;
if (sizeof(UART3_buf1)==UART3_outb) UART3_outb=0;
}
// 放入一个字节到发送缓存区
void UART3_putbyte(u8 da)
{
u8 n=UART3_outa+1;
if (sizeof(UART3_buf1)==n) n=0;
while (n==UART3_outb);
UART3_buf1[UART3_outa]=da;
UART3_outa=n;
if (!UART3_busy) UART3_outchar();
}
// 从接收缓存区取一个字节放入dap
// 返回0表示没新数据
bit UART3_getbyte(u8 *dap,u16 wt)
{
u8 x;
while(UART3_inb==UART3_ina)
{
if (wt==0) return(0); // 等待超时退出
delay_us(10); // 接收等待
wt--;
}
*dap=UART3_buf2[UART3_inb++];
if (sizeof(UART3_buf2)==UART3_inb) UART3_inb=0;
return (1);
}
// 放入一个字节到接收缓存区
void UART3_inchar(u8 da)
{
UART3_buf2[UART3_ina++]=da;
if (UART3_ina==UART3_inb) UART3_inb++; // 当接收缓存区溢出覆盖处理,也可改为不覆盖丢掉新数据
}
////////////////////////////////////////
// 串口3中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void UART3_ISR(void) interrupt UART3_VECTOR
{
if (UART3_CheckTxFlag()) //判断串口发送中断
{
UART3_ClearTxFlag(); //清除串口发送中断标志
UART3_outchar();
}
if (UART3_CheckRxFlag()) //判断串口接收中断
{
UART3_ClearRxFlag(); //清除串口接收中断标志
UART3_inchar(UART3_ReadData());
}
} |
|