OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2461|回复: 2

串口输出64位数据偶尔有问题?

[复制链接]

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-1-16
在线时间
24 小时
发表于 2019-8-14 10:24:16 | 显示全部楼层 |阅读模式
背景简介:    开发板stm32f107。
    系统程序中多中断任务,在某一个中断任务中把64位变量数据输出。
    串口:波特率921600,8位数据位,1位停止位,无校验,无流控制。

输出语句:
printf("PreTIM64Real=%llu,PreTIM64INT=%llu, PreTIM64Cal=%15llu\r\n ", PreTIM64Real, PreTIM64INT,PreTIM64Cal);
printf("TIM64Real=%llu,TIM64Cal=%llu\r\n\r\n ", TIM64Real, TIM64Cal);

输出结果:
    如下,偶尔会有错误数据输出:
a.png



在本应该输出174006995的地方,输出了一个很大的数:747354352800235520。
计算器查看十六进制数,发现多了16个字节的0,去掉即正常
正确的数为:174,006,995,                     0A 5F 22 D3。
错误的数为:747354352800235520,       0A 5F 22 D3 00 00 00 00。

请问大家,这个现象怎么解释呢?


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-1-16
在线时间
24 小时
 楼主| 发表于 2019-8-14 10:26:54 | 显示全部楼层
输出数据均为uint64_t格式。
回复 支持 反对

使用道具 举报

10

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2019-1-16
在线时间
24 小时
 楼主| 发表于 2019-8-14 19:27:10 | 显示全部楼层
我解决问题的办法是,加一个函数,逐个字符输出,就不再有错误数据输出问题了:

////64位数据按字符发送。
void usart_64uint2str(uint64_t data)
{
        uint64_t Remainder = data; ////余数
        uint64_t Quotient; ////商
        uint64_t Divisor = 10000000000000000000; ////除数
        bool Flag = false; ////首位0,不打印输出
       
        while(Divisor > 0)
        {
                Quotient = Remainder / Divisor;
                Remainder = Remainder % Divisor;
                if(Quotient != 0) Flag = true;
                if(Flag) usart_putchar(Quotient + 48);
               
                Divisor = Divisor/10;
        }
}

但具体什么原因,中断耗时长?多中断任务互相打断?串口机制问题?还请大家解答,谢谢!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 23:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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