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

2019-07-15 20:12发布




  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!='')// 表示字符串结束标志,通过检测是否字符串末尾
  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,数据不仅多了一位还不一致,不知道是什么原因,还望大神门帮忙看看
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
zy2014
1楼-- · 2019-07-17 16:23
  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]='';
  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!='')// 表示字符串结束标志,通过检测是否字符串末尾
  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]='';
  92.                 count=0;
  93.                 flag=1;
  94.           }
  95.     }
  96.     else
  97.     {
  98.       count=0;
  99.       flag=1;
  100.     }
  101.   }
  102. }
复制代码改动过中断函数,输入的字符串以#结尾,别的实在改不动了。
294411253
2楼-- · 2019-07-17 21:12
zy2014 发表于 2014-4-14 19:46
改动过中断函数,输入的字符串以#结尾,别的实在改不动了。

谢谢 我回去试试你改动的程序
蓝色幽灵LONG
3楼-- · 2019-07-18 00:14
我是一个初学者,如果发送的字符长度不确定也可以吗?
EchoEye
4楼-- · 2019-07-18 03:43
 精彩回答 2  元偷偷看……
zhouyang12
5楼-- · 2019-07-18 05:14
想问下问题解决了吗?

一周热门 更多>