STM32 保存 串口接收到的数据,但是程序很快就死了,而且只保存了其中一部分。。
voidUSART1_IRQHandler(void){intNum=0;intSave_Num;if(USART_GetITStatus(USART1,USART_IT...
void USART1_IRQHandler(void)
{
int Num = 0;
int Save_Num ;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //若接收数据寄存器满
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET); //RXNE=1时,读数据寄存器非空,可以读数据
UART1_Receive_Buf[Num] = USART_ReceiveData(USART1);
Num++;
Save_Num = Num;
}
USART_TX_Data(USART1, UART1_Receive_Buf, Save_Num);
Num = 0;
}
以上是本人写的代码,但是有个问题,通过串口助手给串口1发数据,保存起来在发给串口1看时,数据只收到其中的一部分,还请高人指点,谢谢大家!
各位,有个新进展
void USART1_IRQHandler(void)
{
int Num = 0;
int Save_Num ;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
UART1_Receive_Buf[Num++] = USART_ReceiveData(USART1); Save_Num = Num;
}
USART_TX_Data(USART1, UART1_Receive_Buf, Save_Num);
Num = 0;
} 展开
{
int Num = 0;
int Save_Num ;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //若接收数据寄存器满
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET); //RXNE=1时,读数据寄存器非空,可以读数据
UART1_Receive_Buf[Num] = USART_ReceiveData(USART1);
Num++;
Save_Num = Num;
}
USART_TX_Data(USART1, UART1_Receive_Buf, Save_Num);
Num = 0;
}
以上是本人写的代码,但是有个问题,通过串口助手给串口1发数据,保存起来在发给串口1看时,数据只收到其中的一部分,还请高人指点,谢谢大家!
各位,有个新进展
void USART1_IRQHandler(void)
{
int Num = 0;
int Save_Num ;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
UART1_Receive_Buf[Num++] = USART_ReceiveData(USART1); Save_Num = Num;
}
USART_TX_Data(USART1, UART1_Receive_Buf, Save_Num);
Num = 0;
} 展开
1个回答
展开全部
1、初始化部分你没给出来,不知道你有没有使能发送中断或串口其他中断什么的。
2、你再中断函数里面多次读取了SR状态寄存器:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)这里一次,
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET);这里读了不知道多少次,要知道状态寄存器里面有些位你一旦读取了以后就会自动清零了,你可以去查看手册去,因此是不推荐在中断函数中多次读取状态寄存器的。3、从程序上来看,只要进入中断,就肯定会执行USART_TX_Data函数而不管有没有收到数据,这样一来,如果不是因为接收中断而是其他原因的串口中断的话那样就会有问题了。
4、USART_TX_Data里面是怎么写的我们也不知道。
综上,问题既有可能出现在问题2,你要作为数据接收的话建议你这样:
if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE) == SET) //这句已经能判断收到数据了
{
Data = USART_ReceiveData(USART2); //不用清除接收标志位,读取数据就自动清除了
............... //然后在这里做你想做的事情
}
2、你再中断函数里面多次读取了SR状态寄存器:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)这里一次,
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET);这里读了不知道多少次,要知道状态寄存器里面有些位你一旦读取了以后就会自动清零了,你可以去查看手册去,因此是不推荐在中断函数中多次读取状态寄存器的。3、从程序上来看,只要进入中断,就肯定会执行USART_TX_Data函数而不管有没有收到数据,这样一来,如果不是因为接收中断而是其他原因的串口中断的话那样就会有问题了。
4、USART_TX_Data里面是怎么写的我们也不知道。
综上,问题既有可能出现在问题2,你要作为数据接收的话建议你这样:
if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE) == SET) //这句已经能判断收到数据了
{
Data = USART_ReceiveData(USART2); //不用清除接收标志位,读取数据就自动清除了
............... //然后在这里做你想做的事情
}
更多追问追答
追问
你好,我的中断函数只是保存数据,这样我也试过,保存数组UART1_Receive_Buf[Num] 里面全部是一个数。
追答
1、那你就再继续用你原来的方法,中断里面只保存数据。UART1_Receive_Buf[Num]里面全是一个数问题应该出现在Num这个数组下标这里,因为你的Num是定义在函数里面的局部变量,你必须要定义成全局变量或者局部静态变量,否则每次进入中断函数来Num永远都是等于0,你永远都是把接收到的数据放在UART1_Receive_Buf[0]里面,这样肯定会出错。
2、不要再中断函数里面有等待的语句,比如:
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET);和USART_TX_DATA函数里面的while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);,这些最好不要,如果在等待的时候,又有数据过来了,但是你这次中断还没有结束,那肯定会丢失数据。
综上,你程序会间隔的丢失掉数据原因就在于:你发送数据的同时,还要等待数据发送完毕,在等待发送完毕的过程中又有数据过来,然后就没有然后了...
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询