求助!!串口接收缓冲区长度内容完全不对,还会莫名其妙自增??
使用串口1,接收状态会出现这种情况代码:
#include "usart.h"
// 全局变量
uint8_t usart1_recv_len=0;
uint8_t usart1_recv_buff={0};
void usart1_init(void) //9600bps
{
usart1_recv_len = 0;//初始化接收长度为0,避免首次接收数据异常
P_SW1 = 0x40; //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7, 0xC0: P4.3 P4.4
P3M1 &= ~(1<<6);
P3M0 &= ~(1<<6);
P3M1 &= ~(1<<7); // P3.7 (TX) 推挽输出
P3M0 |=(1<<7);
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xDC; //设置定时初始值
TH1 = 0xDC; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES = 1; //使能串口1中断
}
void usart1_isr(void) interrupt 4
{
if (TI) //检测串口1发送中断
{
TI = 0; //清除串口1发送中断请求位
}
if (RI) //检测串口1接收中断
{
RI = 0; //清除串口1接收中断请求位
// 防缓冲区溢出(比单纯复位更安全)
if(usart1_recv_len < USART1_RECV_BUFF_SIZE - 1)
{
usart1_recv_buff = SBUF;
usart1_recv_len++;
}
// usart1_send_byte(SBUF);
P03 ^=1;
}
}
// 发送单个字节
void usart1_send_byte(uint8_t dat)
{
SBUF = dat;
while(!TI); // 等待发送完成
TI = 0; // 清标志
}
// 发送字符串
void usart1_send_str(char *str)
{
while(*str)
{
usart1_send_byte(*str++);
}
}
// 发送数组
void usart1_send_array(uint8_t* buff, uint8_t len)
{
uint8_t i;
for(i = 0; i < len; i++)
{
usart1_send_byte(buff);
}
}
// 状态请求包
const uint8_t get_status_packet[] = {
0x68, // 包头
0x02, // 长度L
0x00, // 长度H
0x68, // 重复包头
0x12, // 地址
0x0A, // 类型码
0x1C, // CS校验
0x16 // 包尾
};
/**
* @brief发送状态包
*/
void send_get_status_packet(void)
{
// 串口发送数组
usart1_send_array((uint8_t *)get_status_packet, sizeof(get_status_packet));
}
void main(void)
{
uint16_t loop_count16;
uint8_t i;
P_SW2 |= 0x80; //B7位写1,使能访问XFR
P0M1 = 0x00; P0M0 = 0x00;
P1M1 = 0x00; P1M0 = 0xFF; // P1.7推挽
P2M1 = 0x00; P2M0 = 0x00;
P3M1 = 0x00; P3M0 = 0x00;
P3PU=0x40;
P4M1 = 0x00; P4M0 = 0x00;
P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0x00;
P7M1 = 0x00; P7M0 = 0x00;
P1SR = 0X00; // i/o切换速度
usb_init(); //USB CDC 接口配置
IE2 |= 0x80; //使能USB中断
EA = 1; //IE |= 0X80;
tim2_init();
usart1_init(); // usart1串口初始化
P03 = 0;// 直接拉低P02
while(1)
{
// if (bUsbOutReady)
// {
// USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
//
// usb_OUT_done();
// }
delay_10ms(); // 10ms基准延时(按键防抖)
loop_count16++; // 每10ms累加1
// usart1发送请求
if((loop_count16&0x7F) ==0x01) //1.28秒发起一次询问
{
// send_get_status_packet();
// start_tim2(); // 启动超时检测
// tim2_ov_flag = 0;
usart1_send_byte(0x01);
}
if(usart1_recv_len !=0 || tim2_ov_flag)
{
printf("长度=%d\n",usart1_recv_len);
printf("内容:");
for(i=0; i<8; i++)
{
printf("%02X ", usart1_recv_buff);
}
printf("\n");
memset((unsigned char*)usart1_recv_buff,0,USART1_RECV_BUFF_SIZE); // 清零
usart1_recv_len = 0;
tim2_ov_flag = 0;
}
}
}
以上是问题部分摘出来了,原始现象接收←长度=8
接收←长度=7
内容:6807 207 07 6807 1207 A07 1C07 1607
接收←长度=7
内容:6807 207 07 6807 1207 A07 1C07 1607
接收←长度=5
内容:6805 205 05 6805 1205 A05 1C05 1605
接收←长度=1
内容:6801 201 01 01 01 01 01 01
长度=4
内容:1204 A04 1C04 1604 04 04 04 04
长度莫名其妙,而且数据夹杂着乱码正确接收应为68 02 00 68 12 0A 1C 16
4组串口UART使用DMA收发 @32G系列,易用,高效,稳定 !精品实战代码 - DMA支持: QSPI, SPI, I2S, I2C, 4组串口, i8080/MC6800-TFT 国芯人工智能技术交流网站 - AI32位8051交流社区
中断将TI清零了,发送函数又用查询方式,这样不合适 Ayb_ice 发表于 2026-4-28 11:00
中断将TI清零了,发送函数又用查询方式,这样不合适
之前有试过,不是这个原因,发送一直没毛病,但接收长度莫名其妙自增,而且缓冲区154,却只能最多接收几十个字节
接收←长度=768(长度咋来的都不知道)
内容:6800 200 00 6800 1200 00 00 00
长度=512
内容:1C00 1600 00 00 00 00 00 00
报文:接收←长度=2304
内容:6800 4700 00 6800 100 A00 00 00
长度=2304
内容:00 00 00 00 00 00 8000 2300
长度=2560
内容:EE00 4100 7000 BB00 7E00 3F00 B800 5D00
长度=2304
内容:00 00 F000 4100 2C00 00 00 00
长度=2304
内容:00 00 00 F000 4100 8000 AE00 1A00
长度=2560
内容:00 00 00 00 00 00 00 00
明明一串报文,却打印这么多次, 00乱码不知从何而来 修改超时后数据长度正确,但是内容不对啊,4D我想不明白哪来的
接收←长度=77
内容:684D 474D 4D 684D 14D A4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 804D 234D 184D 3E4D B94D CF4D EE4D 414D 704D BB4D 7E4D 3F4D B84D 5D4D 9F4D 414D F4D 4D 4D 4D 4D 4D F04D 414D 2C4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D F04D 414D 804D AE4D 1A4D 3E4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D BB4D 164D
Parse success: material_height=0.00mmmaterial_ratio=0.00% 问题已解决,超时检测太快
页:
[1]