野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27965|回复: 14

stm32prinf函数串口发送数据出错

[复制链接]
发表于 2014-5-16 11:24:31 | 显示全部楼层 |阅读模式
根据火哥的例程,重写了fputc函数,发送4096个浮点数到串口,定时器中断100ms发送一次,程序如下:
void TIM2_IRQHandler(void)
{
        if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
        {       
                test = ADC_Value;
                ADC_Value_16[0] = test >> 16;
                test = ADC_Value;
                test = test << 16;
                test = test >> 16;
                ADC_Value_16[1] = test;
                ADC1_ConvertedValue[counter] = (float)ADC_Value_16[0] / 4096 * 3.3;                       
                ADC2_ConvertedValue[counter] = (float)ADC_Value_16[1] / 4096 * 3.3;
                //ADC1_ConvertedValue[counter] = 3.56;
                //ADC2_ConvertedValue[counter] = 3.57;
                printf("%f \r\n", ADC1_ConvertedValue[counter]);
                printf("%f \r\n", ADC2_ConvertedValue[counter]);
                counter++;
                TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);                   
        }                        
}

串口调试助手接收到的数据大部分是正确,但是会无规律的出现一些错误值:
1.130347

1.222192

1.157739

1.224609

1.136792

1.223804

1.158545

1.223804

-2.000000

26815622248375008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000

1.148877

1.218970

1.177075

1.218164

0.000000

26815622248375008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000

1.190771

1.229443

1.237500

1.227026

1.252808

1.226221


正确的值应该是一个大于1的小数,其中0.000000 、26815622248375008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000、 -2.000000 都是错误值。

火哥的书上说在使用重定义printf函数时会因为缓冲区的大小而出现莫名其妙的错误,请教是这个原因导致的吗?如果是,要如何避免这种问题?
已经卡在这里很多天,实在没办法了。

主题推荐

回复

使用道具 举报

 楼主| 发表于 2014-5-16 11:27:44 | 显示全部楼层
求火哥指教
回复 支持 反对

使用道具 举报

发表于 2014-5-16 11:28:12 | 显示全部楼层
首先你要确定一下原始数据ADC1_ConvertedValue[counter]有没有问题
另外,把你重写的fput函数发来看看。

把波特率设置低一点试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 11:29:34 | 显示全部楼层
笪芳馥 发表于 2014-5-16 11:28
首先你要确定一下原始数据ADC1_ConvertedValue[counter]有没有问题
另外,把你重写的fput函数发来看看。
...

在Keil中调试的时候看内存里的数据是没有问题的,也就是说发送的时候出现了问题
int fputc(int ch, FILE *f)
{
                /*·¢&#203;íò&#187;&#184;&#246;×&#214;&#189;úêy&#190;Yμ&#189;USART1*/
                USART_SendData(USART1, (uint8_t) ch);
               
                 /*μè′y·¢&#203;ííê±&#207; */
                while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);               
       
                return (ch);
回复 支持 反对

使用道具 举报

发表于 2014-5-16 11:30:07 | 显示全部楼层
你确定一下数组的索引  counter会不会溢出,大于你的数组元素个数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 11:30:30 | 显示全部楼层
笪芳馥 发表于 2014-5-16 11:28
首先你要确定一下原始数据ADC1_ConvertedValue[counter]有没有问题
另外,把你重写的fput函数发来看看。
...

波特率调低也试过了,也是会出现这种情况。另外即使发送一个相同的值也会出现这个问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 11:31:46 | 显示全部楼层
姬银瑶 发表于 2014-5-16 11:30
你确定一下数组的索引  counter会不会溢出,大于你的数组元素个数

counter不会超过数组长度,后面有控制
回复 支持 反对

使用道具 举报

发表于 2014-5-16 11:33:40 | 显示全部楼层
iBer 发表于 2014-5-16 11:31
counter不会超过数组长度,后面有控制

把函数里的USART_FLAG_TC改成 USART_FLAG_TXE,使用USART_FLAG_TC标志位会有问题的

///重定向c库函数printf到USART1
int fputc(int ch, FILE *f)
{
                /* 发送一个字节数据到USART1 */
                USART_SendData(USART1, (uint8_t) ch);
               
                /* 等待发送完毕 */
                while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);               
       
                return (ch);
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 11:35:44 | 显示全部楼层
随风 发表于 2014-5-16 11:33
把函数里的USART_FLAG_TC改成 USART_FLAG_TXE,使用USART_FLAG_TC标志位会有问题的

///重定向c库函数p ...

求教两个标志位的区别
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 11:46:10 | 显示全部楼层
自行顶起。。求火哥指教强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-5-16 11:49:23 | 显示全部楼层
iBer 发表于 2014-5-16 11:35
求教两个标志位的区别

一个是发送完成标志TC,一个是数据寄存器空标志TXE。用TC标志有时会出现一些数据没有发送的情况,你先改来试一下,也不知道能不能解决你的这个问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 15:01:05 | 显示全部楼层
郑倚云 发表于 2014-5-16 11:49
一个是发送完成标志TC,一个是数据寄存器空标志TXE。用TC标志有时会出现一些数据没有发送的情况,你先改来 ...

改了还是不行……
回复 支持 反对

使用道具 举报

发表于 2014-5-16 16:01:43 | 显示全部楼层
iBer 发表于 2014-5-16 15:01
改了还是不行……

没看出有什么问题,你尝试关闭所有中断,直接在while循环输出4096个数据看看,有可能是中断导致的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-16 16:25:29 | 显示全部楼层
房宜楠 发表于 2014-5-16 16:01
没看出有什么问题,你尝试关闭所有中断,直接在while循环输出4096个数据看看,有可能是中断导致的。

的确,我也试过了,只要不进中断就没问题。但还是看不出具体是什么原因
回复 支持 反对

使用道具 举报

发表于 2014-5-16 17:05:25 | 显示全部楼层
除了TIM2,你还开了什么中断?把TIM2中断的优先级设置成最高
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 04:57 , Processed in 0.051041 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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