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

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条回答
依然落叶飘零
1楼-- · 2019-07-16 18:47
这个问题我昨天晚上弄了两三个钟也没有弄出来。但是有一点提醒一下楼主。
  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里面的数据。楼主可以参考六楼的回复。如果他后面没有自动发送'',则要等到下一次串口助手下一次发送字符串的时候才能接受到第13个字符。
294411253
2楼-- · 2019-07-17 00:07
谢谢各位的细心解答 我今天在回去理一下思路
qq729101414
3楼-- · 2019-07-17 00:59
本帖最后由 qq729101414 于 2014-4-14 12:09 编辑
依然落叶飘零 发表于 2014-4-14 09:25
发送字符串时,串口助手会在字符串后面自动发送''?而数组赋值没有?
...

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

294411253
4楼-- · 2019-07-17 03:32
294411253 发表于 2014-4-14 11:15
谢谢各位的细心解答 我今天在回去理一下思路

我看了下你说的那个帖子 发现他接受部分最后一位是有结束标志''的 ,我的程序里没有,不知道是不是这个原因
294411253
5楼-- · 2019-07-17 09:23
 精彩回答 2  元偷偷看……
294411253
6楼-- · 2019-07-17 13:19
zy2014 发表于 2014-4-13 21:51
参考一下这个吧 http://bbs.21ic.com/icview-377947-3-1.html  48楼
说实话我也在写一个这样的程序,很遗 ...

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

一周热门 更多>