STM32如何从串口接收数据,取出数据中的密码段再保存到flash中。

STM32如何从串口接收数据,取出数据中的密码段再保存到flash中

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 success\n");
    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 %08X\n\r",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); 
  }   
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页