[求助] 单片机串口通讯存储

pengbiao1210   2015-8-23 15:33 楼主

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

问题是:当我把程序下载到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. Recptr[RX_len_temp]=RXBUF0;
  23. RX_len_temp++;
  24. if(Recptr[RX_len_temp-1]==0x0d)
  25. {
  26. RX_len=RX_len_temp;
  27. RX_flag=1;
  28. RX_len_temp=0;
  29. write_SegA(Recptr,0);
  30. }
  31. }
  32. string转int函数
  33. unsigned long int string_to_int(unsigned char *ptr)
  34. {
  35. unsigned long int Data = 0;
  36. int i = 0;
  37. for(i = 0; ptr != ''; i++)
  38. {
  39. Data = Data*10 + ptr-48;
  40. }
  41. return Data;
  42. }
  43. 将flash A中数据读出来
  44. void ProcessCMD()
  45. {int i;
  46. data=(unsigned char *)0x1080;
  47. for(i=0;i<RX_len;i++)
  48. {
  49. WorkTimeptr=*data++;
  50. }
  51. WorkTime=string_to_int(WorkTimeptr);
  52. }
  53. 定时器A中断
  54. #pragma vector=TIMERA0_VECTOR
  55. __interrupt void Timer_A0 (void)
  56. {
  57. n--;
  58. if(n<=WorkTime)
  59. P2OUT=0x00;
  60. if(n==0)
  61. {P2OUT=0xff;
  62. n=120;}
  63. }
  64. 主程序:
  65. void main()
  66. {P2DIR=0xFF;
  67. P2OUT=0xFF;
  68. WDTCTL=WDTPW+WDTHOLD;
  69. int_clk();
  70. int_usart();
  71. CCTL0 = CCIE;
  72. CCR0 = 4096;
  73. TACTL = TASSEL_1+ID_3 + MC_1;
  74. _EINT();
  75. char i;
  76. ProcessCMD();
  77. for(;;)
  78. {
  79. if(RX_flag==1)
  80. {
  81. RX_flag=0;
  82. for(i=0;i<RX_len;i++)
  83. {
  84. tmpptr=Recptr;
  85. }
  86. UART_TX_BUF[0]='o';
  87. UART_TX_BUF[1]='k';
  88. for(i=0;i<2;i++)
  89. {
  90. while (!(IFG1 & UTXIFG0));
  91. TXBUF0=UART_TX_BUF;//;
  92. }
  93. }
  94. }
  95. }
本帖最后由 qiushenghua 于 2015-8-24 23:38 编辑

回复评论 (4)

我复位后,不发数据,读出来的数据就不是之前的写进去的数据,结果就不是想要的
点赞  2015-8-23 15:34
斜体太难看了,先帮你编辑成代码,这样方便阅读
点赞  2015-8-24 23:39
有个小问题,第76-78行,main函数初始化部分,建议将关狗的语句提到最前面去。

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

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

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

我有个问题想请教一下:每次我调试时都是改程序然后用IAR的make按钮生成txt文件,用其他软件通过JTAG下载,看现象来确定程序对否,但我看人家视频里面可以不用JTAG 下载调试,可以设置断点来观察,还可以看参数的值。但我不知道该怎么样配置IAR
点赞  2015-8-25 10:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复