单片机串口通讯存储

2019-03-24 09:51发布

本帖最后由 qiushenghua 于 2015-8-24 23:38 编辑

目的是:将串口的数据存储下来,主程序再将数据调用。问题是:当我把程序下载到430里面,连接好串口通讯,用串口发送数据给430后,能存下来,也能调用,可为什么当我复位后就不行了。附程序:写数据到flash A
  1. void write_SegA (uchar *value, int n)
  2. {
  3.     uchar *Flash_ptr;                          // Flash pointer
  4.     uint i;
  5.     Flash_ptr = (uchar *)(0x1080 + n);         // Initialize Flash pointer
  6.     FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  7.     FCTL3 = FWKEY;                            // Clear Lock bit
  8.     *Flash_ptr = 0;                           // Dummy write to erase Flash segment
  9.     FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  10.     for (i=0; i<RX_len; i++)
  11.     {
  12.         *Flash_ptr++ = value;                   // Write value to flash
  13.     }
  14.      FCTL1 = FWKEY;                            // Clear WRT bit
  15.     FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
  16. }
  17. 串口接收中断
  18. #pragma vector=UART0RX_VECTOR
  19. __interrupt  void UART0_RX_ISR(void)
  20. {

  21. static char RX_len_temp;
  22.   
  23.   Recptr[RX_len_temp]=RXBUF0;

  24.   RX_len_temp++;
  25.   if(Recptr[RX_len_temp-1]==0x0d)
  26.   {
  27.     RX_len=RX_len_temp;
  28.     RX_flag=1;
  29.     RX_len_temp=0;
  30.    
  31.   
  32. write_SegA(Recptr,0);
  33.   
  34. }
  35. }
  36. string转int函数
  37. unsigned long int string_to_int(unsigned char *ptr)
  38. {
  39.     unsigned long int Data = 0;
  40.     int i = 0;
  41.    
  42.     for(i = 0; ptr != ''; i++)
  43.     {
  44.         Data = Data*10 + ptr-48;
  45.     }
  46.     return Data;
  47. }
  48. 将flash A中数据读出来
  49. void ProcessCMD()
  50. {int i;
  51.   
  52. data=(unsigned char *)0x1080;  
  53. for(i=0;i<RX_len;i++)
  54. {
  55.    
  56.    WorkTimeptr=*data++;
  57. }
  58.   WorkTime=string_to_int(WorkTimeptr);
  59. }
  60. 定时器A中断
  61. #pragma vector=TIMERA0_VECTOR
  62. __interrupt void Timer_A0 (void)
  63. {
  64. n--;
  65. if(n<=WorkTime)
  66.   P2OUT=0x00;
  67. if(n==0)
  68. {P2OUT=0xff;
  69. n=120;}
  70. }

  71. 主程序:
  72. void main()
  73. {P2DIR=0xFF;
  74.   P2OUT=0xFF;
  75.   WDTCTL=WDTPW+WDTHOLD;
  76.   int_clk();
  77.   int_usart();
  78. CCTL0 = CCIE;                 
  79.     CCR0 = 4096;                  
  80.     TACTL = TASSEL_1+ID_3 + MC_1;
  81.   _EINT();
  82.    char i;
  83.   ProcessCMD();

  84.   for(;;)
  85.   {
  86.   
  87.    
  88.   if(RX_flag==1)
  89.      {
  90.         RX_flag=0;
  91.         for(i=0;i<RX_len;i++)
  92.          {
  93.         tmpptr=Recptr;
  94.         
  95.   }
  96.    
  97.          
  98.         
  99.         UART_TX_BUF[0]='o';
  100.         UART_TX_BUF[1]='k';
  101.    
  102.         
  103.     for(i=0;i<2;i++)
  104.       {
  105.           while (!(IFG1 & UTXIFG0));
  106.          
  107.          
  108.           TXBUF0=UART_TX_BUF;//;
  109.       
  110.         
  111. }
  112.   }
  113.   
  114.   }
  115.   
  116. }
复制代码
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
pengbiao1210
1楼-- · 2019-03-24 17:36
我复位后,不发数据,读出来的数据就不是之前的写进去的数据,结果就不是想要的
qiushenghua
2楼-- · 2019-03-24 17:40
 精彩回答 2  元偷偷看……
qiushenghua
3楼-- · 2019-03-24 19:35
有个小问题,第76-78行,main函数初始化部分,建议将关狗的语句提到最前面去。

我不清楚你上一个帖子 http://bbs.eeworld.com.cn/thread-472042-1-1.html 是否解决,由于你的代码结构相对混乱,所以很难耐下心来帮你分析代码的运行流程。建议你自己一定要清楚代码是怎么运行的,在什么时候进行了什么操作。先搞清楚这个,就知道该在什么时候停下程序来观察运行结果是否符合预期。

你这个描述其实挺不清晰的,别人没法知晓你究竟遇到了什么问题,正常情况下复位后的程序和烧录后的程序是一致的,如果程序调试正常(下载后全速运行),复位后却得到不一样的结果,那就应该检查是不是MCU没有正常复位,亦应检查MCU的复位电路硬件结构是否正常、正确。
pengbiao1210
4楼-- · 2019-03-24 19:44
qiushenghua 发表于 2015-8-24 23:48
有个小问题,第76-78行,main函数初始化部分,建议将关狗的语句提到最前面去。

我不清楚你上一个帖子 ht ...

我有个问题想请教一下:每次我调试时都是改程序然后用IAR的make按钮生成txt文件,用其他软件通过JTAG下载,看现象来确定程序对否,但我看人家视频里面可以不用JTAG 下载调试,可以设置断点来观察,还可以看参数的值。但我不知道该怎么样配置IAR

一周热门 更多>

相关问题

    相关文章