找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2115|回复: 1
收起左侧

关于加通讯协议的串口通讯问题

[复制链接]
ID:93526 发表于 2015-10-25 15:50 | 显示全部楼层 |阅读模式
想在串口助手输入55 aa 03 01 02 03 06 在接收区收到01 02 03 试了好多次 不能成功 求大神帮助

  1. /*-----------------------------------------------
  2.   名称:串口通信
  3.   编写:shifang
  4.   日期:2009.5
  5.   修改:无
  6.   内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源
  7.         打开串口调试程序,将波特率设置为9600,无奇偶校验
  8.         晶振11.0592MHz,发送和接收使用的格式相同,如都使用
  9.         字符型格式,按复位重启程序,可以看到接收到 UART test, 请在发送区输入任意信
  10.                 然后在发送区发送任意信息,接收区返回同样信息,表明串口收发无误
  11. ------------------------------------------------*/


  12. /*-----------------------------------------------
  13.   名称:串口通信
  14.   编写:shifang
  15.   日期:2009.5
  16.   修改:无
  17.   内容:连接好串口或者usb转串口至电脑,下载该程序,打开电源
  18.         打开串口调试程序,将波特率设置为9600,无奇偶校验
  19.         晶振11.0592MHz,发送和接收使用的格式相同,如都使用
  20.         字符型格式,按复位重启程序,可以看到接收到 UART test, 请在发送区输入任意信
  21.                 然后在发送区发送任意信息,接收区返回同样信息,表明串口收发无误
  22. ------------------------------------------------*/

  23. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                        

  24. /*------------------------------------------------
  25.                    函数声明
  26. ------------------------------------------------*/
  27. void SendStr(unsigned char *s);

  28. /*------------------------------------------------
  29.                     串口初始化
  30. ------------------------------------------------*/
  31. unsigned char re[30];
  32. unsigned char tx[30];
  33. unsigned char sum[30];
  34. int i=0,j=0,k=0,a=0,b=0,c=0;
  35. unsigned char DataLong,and;
  36. void InitUART  (void)
  37. {

  38.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  39.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  40.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
  41.     TR1   = 1;                  // TR1:  timer 1 打开                        
  42.     EA    = 1;                  //打开总中断
  43.    // ES    = 1;                  //打开串口中断
  44. }                           
  45. /*------------------------------------------------
  46.                     主函数
  47. ------------------------------------------------*/
  48. void main (void)
  49. {

  50. InitUART();

  51. SendStr("UART test,请在发送区输入任意信息");

  52. ES    = 1;                  //打开串口中断
  53. while (1)                       
  54.     {
  55.      SendStr("UART test,请在发送区输入任意信息");
  56.     }
  57. }

  58. /*------------------------------------------------
  59.                     发送一个字节
  60. ------------------------------------------------*/
  61. void SendByte(unsigned char dat)
  62. {
  63. SBUF = dat;
  64. while(!TI);
  65.       TI = 0;
  66. }
  67. /*------------------------------------------------
  68.                     发送一个字符串
  69. ------------------------------------------------*/
  70. void SendStr(unsigned char *s)
  71. {
  72. while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾
  73.   {
  74.   SendByte(*s);
  75.   s++;
  76.   }
  77. }
  78. /*------------------------------------------------
  79.                      串口中断程序
  80. ------------------------------------------------*/
  81. void UART_SER (void) interrupt 4 //串行中断服务程序
  82. {
  83. //    unsigned char Temp;          //定义临时变量

  84.    if(RI)                        //判断是接收中断产生
  85.      {
  86.           RI=0;                      //标志位清零
  87.           re[i]=SBUF;                 //读入缓冲区的值
  88.           if(j=0)
  89.                   {
  90.                    if(re[0]==0x55) j=1;
  91.                    else j=0;
  92. while(!TI);
  93.       TI = 0;         
  94.                   }
  95.           else if(j=1)
  96.                   {
  97.                    if(re[1]==0xaa) j=2;
  98.                    else j=0;
  99. while(!TI);
  100.       TI = 0;

  101.                   }
  102.           else if(j==2)
  103.                   {
  104.                    DataLong=re[2];
  105.                    j=3;
  106. while(!TI);
  107.       TI = 0;

  108.                   }
  109.           else if((j>=3)&&j<=(3+DataLong))
  110.                  {
  111.               sum[k++]=re[i];
  112.                   j++;
  113. while(!TI);
  114.       TI = 0;            
  115.                  }
  116.           else if(j==4+DataLong)
  117.                   {
  118.                           tx[0]=re[i];
  119.                         for(a=0;a<DataLong;a++)
  120.                         {
  121.                          and+=sum[a];
  122.                          and=and&&0xff;
  123.                         }
  124.                         if(and==tx[0])
  125.                         for(c=0;c<DataLong;c++)
  126.                         {
  127.                          SBUF =sum[c++];
  128. while(!TI);
  129.       TI = 0;

  130.                          }
  131.                          else j=0;
  132.               }
  133.                  i++,j++;
  134.                  if(i=30) i=0;
  135.                  if(j=30) j=0;
  136.            if(TI)                        //如果是发送标志位,清零
  137.              TI=0;
  138.         }
  139. }

  140.   
  141. }
复制代码


回复

使用道具 举报

ID:93469 发表于 2015-10-25 19:22 | 显示全部楼层
TL1   = 1;   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表