找回密码
 立即注册
查看: 248|回复: 6

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2024-12-02 16:32:35

1

主题

6

回帖

111

积分

注册会员

积分
111
发表于 2024-11-27 17:00:01 | 显示全部楼层 |阅读模式
hello ,我在调试的时候发现ai8051读取imu串口数据总是丢数据,如果电脑通过usb转串口读取的话就没问题,这样验证下来应该是程序没处理好数据,数据我打算的是字符数组循环覆盖,我读取数据打印出来,我用了中断方式还有dma方式,都读不到正确的imu数据,有哪位大神帮忙支持一下么

这个不正常

这个不正常

这个是我正常接收的

这个是我正常接收的

SSD1306驱动0.96寸OLED12864显示屏程序-SPI-DMA.7z

152.56 KB, 下载次数: 39

SSD1306驱动0.96寸OLED12864显示屏程序-SPI-DMA.zip

255.8 KB, 下载次数: 41

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4850

回帖

8388

积分

超级版主

DebugLab

积分
8388
发表于 2024-11-27 17:08:30 | 显示全部楼层

大量数据可以使用P2P DMA
截图202411271708154295.jpg

截图202411271706586246.jpg

截图202411271707121582.jpg

截图202411271707234192.jpg

截图202411271707374055.jpg

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4850

回帖

8388

积分

超级版主

DebugLab

积分
8388
发表于 2024-11-27 17:26:31 | 显示全部楼层

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

按照协议接收数据,注意分包,指针不能出错,否则一个错后面全错
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2024-12-02 16:32:35

1

主题

6

回帖

111

积分

注册会员

积分
111
发表于 2024-11-27 21:59:17 | 显示全部楼层
Debu*** 发表于 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[RX4_Cnt] = 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 按照中断接收你的方式改了一下,读取还是不行,读不到了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:108
  • 最近打卡:2025-04-28 08:34:00
已绑定手机

5

主题

118

回帖

674

积分

高级会员

积分
674
发表于 2024-11-28 09:11:29 | 显示全部楼层
截图202411280909593378.jpg
截图202411280910425382.jpg
为什么要清空呢,实在没看懂。TR4=0后,为什么没有开启呢?
高级软件工程师-唐工
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2024-12-02 16:32:35

1

主题

6

回帖

111

积分

注册会员

积分
111
发表于 2024-11-28 10:30:00 | 显示全部楼层
49664*** 发表于 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[RX4_Cnt] = S4BUF;
        if(++RX4_Cnt >= UART4_BUF_LENGTH)   RX4_Cnt = 0;
    }

    if(S4TI)
    {
        S4TI = 0;    //Clear Tx flag
        B_TX4_Busy = 0;
    }
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2024-12-02 16:32:35

1

主题

6

回帖

111

积分

注册会员

积分
111
发表于 2024-11-29 21:25:37 | 显示全部楼层
有人能帮忙解答一下原因么
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 05:31 , Processed in 0.992446 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表