微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于单片机串口通信发送字符串问题

关于单片机串口通信发送字符串问题

时间:10-02 整理:3721RD 点击:




  1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                        
  2. #include"delay.h"
  3. #include<stdio.h>
  4. /*------------------------------------------------
  5.                 硬件端口定义
  6. ------------------------------------------------*/
  7. unsigned char rev[12];
  8. unsigned char ser_rev;
  9. unsigned char count=0;

  10. bit flag;
  11. /*------------------------------------------------
  12.                  函数声明
  13. ------------------------------------------------*/
  14. void SendStr(unsigned char *s);

  15. /*------------------------------------------------
  16.                 串口初始化
  17. ------------------------------------------------*/
  18. void InitUART  (void)
  19. {

  20.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  21.     TH1   = 0xfd;         // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
  22.           TL1=0xfd;
  23.     TR1   = 1;                  // TR1:  timer 1 打开      
  24.     REN=1;
  25.     SM0=0;
  26.     SM1=1;       
  27.     EA    = 1;                  //打开总中断
  28.     ES    = 1;                  //打开串口中断
  29. }

  30. /*------------------------------------------------
  31.                     主函数
  32. ------------------------------------------------*/
  33. void main (void)
  34. {
  35. InitUART();


  36. while (1)                       
  37.     {
  38.                 if(flag==1)
  39.                 {
  40.                 ES=0;
  41.                 SendStr(rev);
  42.                
  43.                
  44.     flag=0;


  45.                 ES=1;
  46.                 }
  47.     }
  48. }

  49. /*------------------------------------------------
  50.                     发送一个字节
  51. ------------------------------------------------*/
  52. void SendByte(unsigned char dat)
  53. {
  54. SBUF = dat;
  55. while(!TI);
  56.       TI = 0;
  57. }
  58. /*------------------------------------------------
  59.                     发送一个字符串
  60. ------------------------------------------------*/
  61. void SendStr(unsigned char *s)
  62. {
  63. while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
  64.   {
  65.   SendByte(*s);
  66.   s++;
  67.   }
  68. }

  69. void ser() interrupt 4
  70. {
  71. if(RI)
  72. {
  73.        

  74. RI=0;
  75. if(count<=11)
  76. {
  77. ser_rev=SBUF;
  78. rev[count]=ser_rev;
  79. count++;
  80. }
  81. else
  82. {
  83.          count=0;
  84.          flag=1;
  85. }

  86. }
  87. }

复制代码

本人新手菜鸟用串口助手调试,我发送123456789106,接收到1234567891066或者是2123456789100,数据不仅多了一位还不一致,不知道是什么原因,还望大神门帮忙看看

波特率对吗?

波特率应该没问题 我22.1184M 波特率19200,应该还是程序问题

跪求大神啊!

参考一下这个吧 http://bbs.21ic.com/icview-377947-3-1.html  48楼
说实话我也在写一个这样的程序,很遗憾没有看懂。

在初始化里面对TI = 0;
字符数组赋值 和字符串赋值是不同的,字符数组赋值没有自动的'\0',

发送字符串时,串口助手会在字符串后面自动发送'\0'?而数组赋值没有?

这个问题我昨天晚上弄了两三个钟也没有弄出来。但是有一点提醒一下小编。

  1. if(count<=11)
  2. {
  3.     ser_rev=SBUF;
  4.     rev[count]=ser_rev;
  5.    count++;
  6. }
  7. else
  8. {
  9.          count=0;
  10.          flag=1;
  11. }

复制代码


你的这段代码是有问题的。他接收到12个字符的时候else里面的语句还有没执行。他要等到下一次接收到字符的时候,就是接收到第13个字符的时候才执行else里面的数据。小编可以参考六楼的回复。如果他后面没有自动发送'\0',则要等到下一次串口助手下一次发送字符串的时候才能接受到第13个字符。

谢谢各位的细心解答 我今天在回去理一下思路

不会啊  我说的是他的定义   数组总长度12  接受数据12个 要是12个数据里面 没有0 不就溢出了

我看了下你说的那个帖子 发现他接受部分最后一位是有结束标志'\0'的 ,我的程序里没有,不知道是不是这个原因

我看了下你说的那个帖子 发现他接受部分最后一位是有结束标志'\0'的 ,我的程序里没有,不知道是不是这个原因

把你写的程序也贴上来看看啊 ,我发现串口问题还是有很多人提的,说明还是有一定难度的,真希望有大神能详细的讲讲哦

  1. //123456789ab#  第一次输出可能有问题,之后就是正常的 123456789ab
  2. //123456789a#   输出应该没有问题
  3. #include<reg52.h>
  4. #include<stdio.h>
  5. /*------------------------------------------------
  6.                 硬件端口定义
  7. ------------------------------------------------*/
  8. unsigned char rev[12];
  9. unsigned char ser_rev;
  10. unsigned char count=0;
  11. bit flag;
  12. /*------------------------------------------------
  13.                  函数声明
  14. ------------------------------------------------*/
  15. void SendStr(unsigned char *s);
  16. /*
  17. void InitArray()
  18. {
  19.   unsigned char len;
  20.   for(len=0;len<12;len++)
  21.   {
  22.     rev[len]='\0';
  23.         delay1ms();
  24.   }
  25. }
  26. */
  27. /*------------------------------------------------
  28.                 串口初始化
  29. ------------------------------------------------*/
  30. void InitUART  (void)
  31. {

  32.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  33.     TH1   = 0xfd;         // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
  34.     TL1=0xfd;
  35.     TR1   = 1;                  // TR1:  timer 1 打开      
  36.     REN=1;
  37.     SM0=0;
  38.     SM1=1;        
  39.     EA    = 1;                  //打开总中断
  40.     ES    = 1;                  //打开串口中断
  41. }

  42. /*------------------------------------------------
  43.                     主函数
  44. ------------------------------------------------*/
  45. void main (void)
  46. {
  47.   InitUART();
  48.   while (1)                       
  49.     {
  50.         if(flag==1)
  51.         {
  52.                 ES=0;
  53.                 SendStr(rev);
  54.                 flag=0;
  55.                 ES=1;
  56.         }
  57.     }
  58. }

  59. /*------------------------------------------------
  60.                     发送一个字节
  61. ------------------------------------------------*/
  62. void SendByte(unsigned char dat)
  63. {
  64.   SBUF = dat;
  65.   while(!TI);
  66.   TI = 0;
  67. }
  68. /*------------------------------------------------
  69.                     发送一个字符串
  70. ------------------------------------------------*/
  71. void SendStr(unsigned char *s)
  72. {
  73.   while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
  74.   {
  75.     SendByte(*s);
  76.     s++;
  77.   }
  78. }

  79. void ser() interrupt 4
  80. {
  81.   if(RI)
  82.   {
  83.     RI=0;
  84.     if(count<11)
  85.     {
  86.           count++;
  87.       ser_rev=SBUF;

  88.       rev[count-1]=ser_rev;
  89.           if(ser_rev=='#')
  90.           {
  91.             rev[count-1]='\0';
  92.                 count=0;
  93.                 flag=1;
  94.           }
  95.     }
  96.     else
  97.     {
  98.       count=0;
  99.       flag=1;
  100.     }
  101.   }
  102. }

复制代码

改动过中断函数,输入的字符串以#结尾,别的实在改不动了。

谢谢 我回去试试你改动的程序

我是一个初学者,如果发送的字符长度不确定也可以吗?

不错。值得学习!

想问下问题解决了吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top