请问串口USART全局变量数组的个数怎么查找?

2019-07-14 16:08发布

问题如下,特别奇怪,百思不得其解,求高手指点一二,谢谢。

主要功能就是串口接收字符串,并发送字符串中以‘@’开头和以‘#’结尾之间的字符串。
1、当调整USART_Rx_Buffer[4096]数组个数时会出现问题,当大于4096(具体没测试,换成32768肯定出问题)时,运行程序会卡在HardFault_Handler中断。
网上查了下,只知道局部变量会进堆栈,且受到Stack_Size      EQU     0x00000400的限制,但是我声明的是全局变量,应该不会存在类似问题啊,但是问题还是发生了,也就是说全局变量数组的个数还是有上限的,请问怎么计算,或者查找?
亦或者是其他问题造成的硬件HardFault_Handler中断?
请问怎么解决?


2、目前程序功能是实现了,问题是,当发送字符串大于估计有25+左右字符的时候,发送几次就停止了……我串口助手那端设置的自动循环发送……
当发送字符数较小的字符串时,一点问题没有……很奇怪,不知道是什么问题造成的?
请问如何解决?


3、看了一些资料说STM32的USART有一个中断bug,请问是否值得是ore溢出的标志位bug,如果是请问怎么在代码上做修改,谢谢。
请问2的问题是否是因为这个问题产生的呢?目前只能瞎猜了……
诚心请教!

#include "stm32f10x.h"
#include "usart1.h"
#include


u8 USART_State = 0;
uint16_t Uart1_Len;
unsigned char USART_Rx_Buffer[4096];        //串口接收数据缓冲区
unsigned char USART_Tx_Buffer[4096];        //串口发送数据缓冲区
uint16_t temp_Counter = 0;
uint16_t Rx_Counter = 0;


/*
* 函数名:main
* 描述  :主函数
* 输入  :无
* 输出  :无
*/
int main(void)
{        
        /* USART1 config 115200 8-N-1 */
        USART1_Config();
        NVIC_Configuration();        



        printf(" 请开始输入字符串开始,#结束 ");
        
        
        while(1)
                {        
                        if( USART_State )  
                                        {  
                                                        printf("%s ",USART_Tx_Buffer);
                                                        USART_State = 0;
                                                        Rx_Counter = 0;
                                                        temp_Counter = 0;
                                        }
                }
}




void USART1_IRQHandler(void)   
{  
        u8 i;
        if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET) //中断产生
        {  
                USART_Rx_Buffer[Rx_Counter] = USART_ReceiveData(USART1);               
                if(USART_Rx_Buffer[Rx_Counter] == '@') //头         
                        temp_Counter = Rx_Counter;  
                if((USART_Rx_Buffer[temp_Counter] == '@')&&(USART_Rx_Buffer[Rx_Counter] == '#')) //检测到头的情况下检测到尾      
                {  
                        Uart1_Len = Rx_Counter - temp_Counter - 1; //长度  
                        memset(USART_Tx_Buffer,0,sizeof(USART_Tx_Buffer));   //清空串口发送寄存器
<span style="font-size: larger;">                        for(i=0,temp_Counter+=1; i
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
60user108
2019-07-15 06:51
回复第 3 楼 于2014-08-09 09:23:47发表:
具体说一下你的芯片名称,一般芯片的RAM是32K,甚至一部分是16K。按32K算,还要去掉一些其他的变量、寄存器的空间。实际没有32K这么大。楼主定义32K,肯定会超出RAM空间的。
串口溢出的时候,要先读取串口数据,再清除溢出标志位。
串口发送的间隔是多少?如果太短,还未等到要发生,他就又重新计算了数据。
 
stm32f103rc
ARM 32-bit Cortex-M3 Microcontroller, 72MHz, 256kB Flash, 48kB SRAM,
PLL, Embedded Internal RC 8MHz and 32kHz, Real-Time Clock,
Nested Interrupt Controller, Power Saving Modes, JTAG and SWD,
4 Synch. 16-bit Timers with Input Capture, Output Compare and PWM,
2 16-bit Advanced Timer, 2 16-bit Basic Timer, 2 16-bit Watchdog Timers,
SysTick Timer, 3 SPI/I2S, 2 I2C, 5 USART, USB 2.0 Full Speed Interface,
CAN 2.0B Active, 3 12-bit 16-ch A/D Converter, 2 12-bit D/A Converter, 
SDIO, Fast I/O Ports
 
1、恩,这么看来多半是sram不够的原因了,多谢!
2、串口溢出的网上找了一个版本,那您看对吗?我看的不是很明白……
     if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出      
 {  
 
            USART_ClearFlag(USART2,USART_FLAG_ORE); //SR              
            USART_ReceiveData(USART2); //DR       
}   加在中断后面……
他调用了USART_ReceiveData,但是这个寄存器的内容,读到哪去了呢,如果是想利用USART_Tx_Buffer继续存起来,应该怎么处理呢?还有这个溢出中断不是发送中断标志位,不该置位的时候置位,就算中断吗,在中断程序里,怎么体现的?
 
3、串口时间我都调整过,最少的是10ms/次,最长的是100ms/次,都会应为25+个字符的数组停止接收,短的例如10+字符就很流畅……非常困惑……感觉代码没问题啊……
 
谢谢您的耐心回复~

 

 

一周热门 更多>