ssd_123 发表于 2024-11-27 17:00:01

求助,ai8051串口读取的数据不全

hello ,我在调试的时候发现ai8051读取imu串口数据总是丢数据,如果电脑通过usb转串口读取的话就没问题,这样验证下来应该是程序没处理好数据,数据我打算的是字符数组循环覆盖,我读取数据打印出来,我用了中断方式还有dma方式,都读不到正确的imu数据,有哪位大神帮忙支持一下么

DebugLab 发表于 2024-11-27 17:08:30


大量数据可以使用P2P DMA










DebugLab 发表于 2024-11-27 17:26:31


串口中断方式参考:
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598

按照协议接收数据,注意分包,指针不能出错,否则一个错后面全错

ssd_123 发表于 2024-11-27 21:59:17

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 按照中断接收你的方式改了一下,读取还是不行,读不到了

496649247 发表于 2024-11-28 09:11:29



为什么要清空呢,实在没看懂。TR4=0后,为什么没有开启呢?

ssd_123 发表于 2024-11-28 10:30:00

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;
    }
}

ssd_123 发表于 2024-11-29 21:25:37

有人能帮忙解答一下原因么
页: [1]
查看完整版本: 求助,ai8051串口读取的数据不全