求助,ai8051串口读取的数据不全
hello ,我在调试的时候发现ai8051读取imu串口数据总是丢数据,如果电脑通过usb转串口读取的话就没问题,这样验证下来应该是程序没处理好数据,数据我打算的是字符数组循环覆盖,我读取数据打印出来,我用了中断方式还有dma方式,都读不到正确的imu数据,有哪位大神帮忙支持一下么大量数据可以使用P2P DMA
串口中断方式参考:
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598
按照协议接收数据,注意分包,指针不能出错,否则一个错后面全错
DebugLab 发表于 2024-11-27 17:26
串口中断方式参考:
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598
void PrintString4(u8 *puts)
{
for (; *puts != 0;puts++) //遇到停止符0结束
{
S4BUF = *puts;
B_TX4_Busy = 1;
while(B_TX4_Busy);
}
}
//========================================================================
// 函数: SetTimer2Baudraye(u32 dat)
// 描述: 设置Timer2做波特率发生器。
// 参数: dat: Timer2的重装值.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void SetTimer2Baudraye(u32 dat)// 使用Timer2做波特率.
{
T2R = 0; //Timer stop
T2_CT = 0; //Timer2 set As Timer
T2x12 = 1; //Timer2 set as 1T mode
T2H = (u8)(dat / 256);
T2L = (u8)(dat % 256);
ET2 = 0; //禁止中断
T2R = 1; //Timer run enable
}
//========================================================================
// 函数: void UART4_config(u8 brt)
// 描述: UART4初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void UART4_config(u8 brt) // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
{
if(brt == 2)
{
SetTimer2Baudraye(Baudrate4);
S4CON = 0x10; //8位数据, 使用Timer2做波特率发生器, 允许接收
}
else
{
T4R = 0; //Timer stop
S4CON = 0x50; //8位数据, 使用Timer4做波特率发生器, 允许接收
T4H = (u8)(Baudrate4 / 256);
T4L = (u8)(Baudrate4 % 256);
T4_CT = 0; //Timer3 set As Timer
T4x12 = 1; //Timer3 set as 1T mode
T4R = 1; //Timer run enable
ET4 = 1; //使能定时器中断
}
ES4= 1; //允许UART4中断
S4_S = 1; //UART4 switch bit2 to: 0: P0.2 P0.3, 1: P5.2 P5.3
B_TX4_Busy = 0;
TX4_Cnt = 0;
RX4_Cnt = 0;
}
void Uart_Start(void)
{
T4L=(u8)(Baudrate4 % 256);
T4H= (u8)(Baudrate4 / 256);
T4R=1;
}
void Uart_Stop(void)
{
T4R=0;
T4L=(u8)(Baudrate4 % 256);
T4H= (u8)(Baudrate4 / 256);
RX4_Cnt=0;
memset(RX4_Buffer,0x00,sizeof RX4_Buffer);
}
//========================================================================
// 函数: void UART4_int (void) interrupt UART4_VECTOR
// 描述: UART4中断函数。
// 参数: nine.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void UART4_int (void) interrupt 18
{
if(S4RI)
{
S4RI = 0; //Clear Rx flag
Uart_Start();
RX4_Buffer = S4BUF;
if(++RX4_Cnt >= UART4_BUF_LENGTH) RX4_Cnt = 0;
}
if(S4TI)
{
S4TI = 0; //Clear Tx flag
B_TX4_Busy = 0;
}
}
void TM4_Isr() interrupt 20
{
Uart_Stop();
}
hello 按照中断接收你的方式改了一下,读取还是不行,读不到了
为什么要清空呢,实在没看懂。TR4=0后,为什么没有开启呢? 496649247 发表于 2024-11-28 09:11
为什么要清空呢,实在没看懂。TR4=0后,为什么没有开启呢?
这个是按照https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598这个改的程序,我正常不需要清空,只需要接收处理就行,但是总是缺数据,我其实有点怀疑是不是波特率不匹配,下面的是我原来用的串口接收程序
#define MAIN_Fosc 40000000UL
#define Baudrate1 (65536 - MAIN_Fosc / 115200 / 4)
#define UART1_BUF_LENGTH 128
#define Baudrate4 (65536 - MAIN_Fosc / 115200 / 4)
#define UART4_BUF_LENGTH 256
void PrintString4(u8 *puts)
{
for (; *puts != 0;puts++) //遇到停止符0结束
{
S4BUF = *puts;
B_TX4_Busy = 1;
while(B_TX4_Busy);
}
}
//========================================================================
// 函数: SetTimer2Baudraye(u32 dat)
// 描述: 设置Timer2做波特率发生器。
// 参数: dat: Timer2的重装值.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void SetTimer2Baudraye(u32 dat)// 使用Timer2做波特率.
{
T2R = 0; //Timer stop
T2_CT = 0; //Timer2 set As Timer
T2x12 = 1; //Timer2 set as 1T mode
T2H = (u8)(dat / 256);
T2L = (u8)(dat % 256);
ET2 = 0; //禁止中断
T2R = 1; //Timer run enable
}
//========================================================================
// 函数: void UART4_config(u8 brt)
// 描述: UART4初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void UART4_config(u8 brt) // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer4做波特率.
{
if(brt == 2)
{
SetTimer2Baudraye(Baudrate4);
S4CON = 0x10; //8位数据, 使用Timer2做波特率发生器, 允许接收
}
else
{
T4R = 0; //Timer stop
S4CON = 0x50; //8位数据, 使用Timer4做波特率发生器, 允许接收
T4H = (u8)(Baudrate4 / 256);
T4L = (u8)(Baudrate4 % 256);
T4_CT = 0; //Timer3 set As Timer
T4x12 = 1; //Timer3 set as 1T mode
T4R = 1; //Timer run enable
}
ES4= 1; //允许UART4中断
S4_S = 1; //UART4 switch bit2 to: 0: P0.2 P0.3, 1: P5.2 P5.3
B_TX4_Busy = 0;
TX4_Cnt = 0;
RX4_Cnt = 0;
}
//========================================================================
// 函数: void UART4_int (void) interrupt UART4_VECTOR
// 描述: UART4中断函数。
// 参数: nine.
// 返回: none.
// 版本: VER1.0
// 日期: 2014-11-28
// 备注:
//========================================================================
void UART4_int (void) interrupt 18
{
if(S4RI)
{
S4RI = 0; //Clear Rx flag
RX4_Buffer = S4BUF;
if(++RX4_Cnt >= UART4_BUF_LENGTH) RX4_Cnt = 0;
}
if(S4TI)
{
S4TI = 0; //Clear Tx flag
B_TX4_Busy = 0;
}
} 有人能帮忙解答一下原因么
页:
[1]