这位老师分析的很精辟,但是我遇到了相同的问题,我想在串口中断发生的时候,在SD里新建一个txt文档,然后以后串口发生中断的时候,在txt里更新数据,但是始终不行,串口中断程序如下:
void USART2_IRQHandler(void)
{
char t;
//处理接收到的数据
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
/* Clear the USART1 Receive interrupt */
t=USART_ReceiveData(USART2);
//com2_buffer[0]= 0x22;
// i=i+1;
f_mount(0,&fs);
res = f_open( &fsrc , "0:/Demo.TXT" , FA_CREATE_NEW | FA_WRITE);
if ( res == FR_OK )
{
/* Write buffer to file */
res = f_write(&fsrc, com2_buffer, sizeof(com2_buffer), &br);
// printf("Demo.TXT successfully created \r\n");
/*close file */
f_close(&fsrc);
}
else if ( res == FR_EXIST )
{
f_open( &fsrc , "0:/Demo.TXT" ,FA_WRITE | FA_READ);
f_lseek(&fsrc,20);
f_write(&fsrc, com2_buffer, sizeof(com2_buffer), &br);
f_close(&fsrc);
// printf("Demo.TXT created in the disk \r\n");
}
// scan_files(path);
// SD_TotalSize();
USART_SendData(USART1,t);
// USART_SendData(USART1,com2_buffer[1]);
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
}
if(USART_GetITStatus(USART2, USART_IT_RXNE) !=RESET)
{ USART_ClearITPendingBit(USART2,USART_IT_RXNE); }//清中断标识
/* com2_buff[com2_receive_count++]= USART_ReceiveData(USART2);
for(i=0;i<=com2_receive_count;i++)
USART_SendData(USART1, com2_buff);
com2_buff[com2_receive_count]=0;
//串口中断查询位,由此位可以知道串口2中有没有数据
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET){}
printf(" \r\n"); *?
/* com2_bit=1;
if(com2_receive_count>523) //最大值处理,要与定义的一样才行
com2_receive_count=0; */
//溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR
USART_ReceiveData(USART2); //读DR
}
}
注意:else if ( res == FR_EXIST ) 这一段 总是执行不了,只能在reset后才能执行以下。弄了好几天了 ,希望老师也能指导下,是不是open的模式不对啊? |