• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

单片机串口通讯存储

日出东方,唯我不败 2015-08-23 浏览量:1048

目的是:将串口的数据存储下来,主程序再将数据调用。

问题是:当我把程序下载到430里面,连接好串口通讯,用串口发送数据给430后,能存下来,也能调用,可为什么当我复位后就不行了。

附程序:写数据到flash A 

void write_SegA (uchar *value, int n)
{
    uchar *Flash_ptr;                          // Flash pointer
    uint i;
    Flash_ptr = (uchar *)(0x1080 + n);         // Initialize Flash pointer
    FCTL1 = FWKEY + ERASE;                    // Set Erase bit
    FCTL3 = FWKEY;                            // Clear Lock bit
    *Flash_ptr = 0;                           // Dummy write to erase Flash segment
    FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
    for (i=0; i     {
        *Flash_ptr++ = value[i];                   // Write value to flash
    }
     FCTL1 = FWKEY;                            // Clear WRT bit
    FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
}

串口接收中断

#pragma vector=UART0RX_VECTOR
__interrupt  void UART0_RX_ISR(void)
{
 
static char RX_len_temp;
  
  Recptr[RX_len_temp]=RXBUF0;
 
  RX_len_temp++;
  if(Recptr[RX_len_temp-1]==0x0d)
  {
    RX_len=RX_len_temp;
    RX_flag=1;
    RX_len_temp=0;
    
  
 write_SegA(Recptr,0);
  
}
}
string转int函数

unsigned long int string_to_int(unsigned char *ptr)
{
    unsigned long int Data = 0;
    int i = 0;
    
    for(i = 0; ptr[i] != \'\'; i++)
    {
        Data = Data*10 + ptr[i]-48;
    }
    return Data;
}
将flash A中数据读出来

void ProcessCMD()
{int i;
  
 data=(unsigned char *)0x1080;  
 for(i=0;i  {
   
   WorkTimeptr[i]=*data++;
 }
  WorkTime=string_to_int(WorkTimeptr);
}

定时器A中断

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A0 (void)
{
n--;
if(n<=WorkTime)
  P2OUT=0x00;
if(n==0)
{P2OUT=0xff;
n=120;}
}

主程序:

void main()
{P2DIR=0xFF;
  P2OUT=0xFF;
  WDTCTL=WDTPW+WDTHOLD;
  int_clk();
  int_usart();
 CCTL0 = CCIE;                 
    CCR0 = 4096;                  
    TACTL = TASSEL_1+ID_3 + MC_1; 
  _EINT();
   char i;
  ProcessCMD();
 
  for(;;)
  {
  
    
  if(RX_flag==1)
     {
        RX_flag=0;
        for(i=0;i          { 
        tmpptr[i]=Recptr[i];
        
  }
   
         
        
        UART_TX_BUF[0]=\'o\';
        UART_TX_BUF[1]=\'k\';
    
        
    for(i=0;i<2;i++)
      { 
          while (!(IFG1 & UTXIFG0));
         
          
          TXBUF0=UART_TX_BUF[i];//;
       
        
 }
  }
  
  }
  
}

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  •        430的Flash有保存数据的功能?那不是epprom干的事吗?stm8,ardunio自带epprom的可以干?但我不明白为什么Flash复位后还可以保存之前储存的随机数据?这个不可思议?复位掉电后Flash只能保存程序 存储空间,数据的是保存在ram中吧?有一种可能是例外,就是某段Flash经过特殊处理,可以掉电数据不掉失功能,我记得stm32f1x系列中其内部rtc时钟有64bit的特殊Flash空间,具有epprom功能,其他的要么是epprom器件或者专门的存储芯片,sd卡等。
    • 发布于 2015-08-23
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:2
  • 当我复位后,不发数据,读出来的数据就不是之前的写进去的数据,结果就不是想要的
    • 发布于2015-08-23
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

单片机串口通讯存储