STM32如何从串口接收数据,取出数据中的密码段再保存到flash中
u8 Usart2_buf[256];
unsigned int usart2_lent;
void main(void)
{
char buf_password[19] = "000000";//6位密码
memset((char *) &buf_password, 0, sizeof(buf_password));
strncpy(buf_password, Usart2_buf + 9, 6);//从外键获取的信息保存到Usart2_buf中,其中从第10-15位保存的是密码
if(save_password()==1)
{
soundBee(1);
}
else
{
soundBee(0);
}
}
//单独存储密码
int save_password()
{
char in_data[7]="";
sprintf(in_data, "%s",buf_password);
if(strlen(in_data)==18)
{
write_flash(0x0800F800, (u16 *) in_data, 7);
ACCLOG("write password successn");
return 1;
}
else
{
ACCLOG("write password fail...n");
return 0;
}
}
//把密码保存到flash
int write_flash(u32 StartAddr,u16 *buf,u16 len)
{
volatile FLASH_Status FLASHStatus;
u32 FlashAddr;
len=(len+1)/2;
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
FlashAddr=StartAddr;
FLASH_ErasePage(StartAddr);
while(len--)
{
FLASHStatus = FLASH_ProgramHalfWord(FlashAddr,*buf++);
if (FLASHStatus != FLASH_COMPLETE)
{
//printf("FLSH :Error %08Xnr",FLASHStatus);
return -1;
}
FlashAddr += 2;
}
FLASH_Lock();
return 0;
}
//串口2终中断(串口2接收到数据先给GetData1,再存入Usart2_buf)
void USART2_IRQHandler(void)
{
u8 GetData1;
if(USART_GetITStatus(USART2, USART_IT_RXNE)!=RESET)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
GetData1=(u8)USART_ReceiveData(USART2)&0xff;
if(usart2_read_en==0&&usart2_lent<256)
{
Usart2_buf[usart2_lent]=GetData1;
usart2_lent++;
}
}
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART2,USART_FLAG_ORE);
USART_ReceiveData(USART2);
}
}
上一篇:STM32串口实时接收数据与所提前定义的比较,并作出相应的操作
下一篇:延时函数delay_ms,delay_us会出现进入延时函数出不来的情况
推荐阅读最新更新时间:2024-11-11 11:05