找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1817|回复: 6
打印 上一主题 下一主题
收起左侧

简化版的modbus协议一带二通信系统,MCU不能成功通信,求告知原因?

[复制链接]
跳转到指定楼层
楼主
ID:479916 发表于 2019-3-25 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     打算设计一套一主二从的多机通信系统。主机发送自己的供电状态给从机,读取从机的扫描的按键数据。由于系统功能比较简单,考虑到modbus协议相对来说挺复杂,所以设计了一个简化的通信协议:1、主机、从机UART均为模式1。主机发送2个字节的数据给从机,第1个字节为地址字节,寻址,第2个字节是数据字节,用来将主机的供电状态发给从机,并读取从机按键状态。2个从机,有时候2台都接入系统,有时候只有1台接入系统。此为设计功能要求。
     设计中,在程序初始化时,主机发送一次数据给从机0x01,启动通信。然后进入while(1)循环。在循环中,定时读取供电状态,调用串口驱动函数。通信过程:启动通信后,主机接收从机的数据,1,接收成功,解析地址,地址解析相符的话,解析数据,有数据,执行数据,并再次发送数据给0x01,无数据,寻址另一台从机。2、接收成功,解析地址,不相符,寻址另一台从机,3、计时时间内,未收到数据,认为接收失败,寻址另一台从机。
    串口接收2个字节为1帧数据,接收2个字节完成后,即认为数据接受完成,置位帧接收完成标志。   
    从机接收主机发来的2个字节的数据,同样进行地址、数据解析,完成后,回发数据给主机。
   上述为通信流程。帖程序:

主机程序:
main.c:
  1. # define _MAIN_C
  2. # include "config.h"
  3. # include "tmr_uart.h"
  4. # include "action.h"
  5. # include "main.h"




  6. uchar8 OCBuf[]={0xFF,0xFF};
  7. bit OCflag=0;                                                                                //过流标志
  8. //uchar8 Powflag;
  9. uchar8 PowSta=0xFF;                                                                        //供电状态标志
  10. uchar8 PowCNTR=0;                                                                        //供电采集计数
  11. uchar8 TxdBuf[2]={0xFF,0xFF};                                                       //发送缓冲
  12. uchar8 buf[2];
  13. bit Txdflag=0;                                                                                //字节发送标志
  14. uchar8 RxdBuf[2];                                                                        //接收缓冲
  15. uchar8 cntRxd=0;                                                                        //接收计数
  16. bit RxFr_Succ=0;                                                                        //帧接收成功标志。
  17. bit TxFr_Succ=0;                                                                        //帧发送成功标志
  18. bit RxFr_Fail=0;                                                                               //帧接收失败标志
  19. uchar8 sl_select=0;                                                                        //从机选择索引


  20. void main()
  21. {
  22.         ROE=1;        RA3=1;        RA2=1;        RA1=1;                                        //释放所有输出
  23.         Buz=0;                                                                                        //蜂鸣器响
  24.         DelayX50ms(5);                                                                               //
  25.         Buz=1;                                                                                        //蜂鸣器关
  26.         P1=0x00;                                                                                      //数据管全亮,检测数据管是否正常
  27.         DelayX50ms(5);
  28.         P1=0xFF;                                                                                    //关闭数据管
  29.         DIR_485=0;                                                                            //485通信处于接收状态
  30.         ConfigTimer0();                                                                      //配置定时器0
  31.         ConfigUART();                                                                        //配置UART
  32.         UartSend(0x01);                                                                          //发送数据给从机0x01.
  33.         while(1)
  34.         {
  35.                 OCProtect();                                                                //检测过流保护
  36.                 PowCheck(10);                                                                //检测供电状态
  37.                 UartDriver();                                                             //串口驱动
  38.         }
  39. }
  40. //串口驱动
  41. void UartDriver()
  42. {
  43.         switch(sl_select)
  44.         {
  45.                 case 0: if(RxFr_Succ)                                                                                //接收数据成功
  46.                                 {
  47.                                         RxFr_Succ=0;
  48.                                         UartReceive();                                                                        //串口读数据
  49.                                         UartAction(0xF1);                                                                //接收数据解析(含地址)
  50.                                         if((buf[1]>=0x03)&&(buf[1]<=0x11))                                  //buf[1]>=0x03,且小于0x11,表示有数据
  51.                                         {
  52.                                                 UartSend(0x01);                                                                //继续发数据给0x01从机
  53.                                         }
  54.                                         else                                                                                   //无数据
  55.                                         {
  56.                                                 sl_select++;                                                              //从机选择索引+1
  57.                                                 UartSend(0x02);                                                                //给0x02发数据
  58.                                         }
  59.                                        
  60.                                 }
  61.                                 if(RxFr_Fail)                                                                                //接收数据失败,(此从机不在线)
  62.                                 {
  63.                                         RxFr_Fail=0;
  64.                                         UartSend(0xF2);                                                                        //给0x02发数据
  65.                                         sl_select++;                                                                        //从机选择索引+1
  66.                                 }
  67.                                 break;
  68.                 case 1: if(RxFr_Succ)                                                                                  //接收数据成功
  69.                                 {
  70.                                         RxFr_Succ=0;
  71.                                         UartReceive();                                                                       
  72.                                         if((buf[1]>=0x03)&&(buf[1]<=0x11))                                   //有数据
  73.                                         {
  74.                                                 UartSend(0x02);                                                               //继续给从机0x02发数据
  75.                                         }
  76.                                         else                                                                                 //无数据
  77.                                         {
  78.                                                 sl_select--;                                                                //从机索引-1
  79.                                                 UartSend(0x01);                                                        //发送数据给0x01
  80.                                         }
  81.                                 }
  82.                                 if(RxFr_Fail)                                                                                //数据接收失败(此从机不在线)
  83.                                 {
  84.                                         RxFr_Fail=0;
  85.                                         UartSend(0x01);                                                                        //发送数据给0x01
  86.                                         sl_select--;                                                                                //索引-1
  87.                                 }
  88.                                 break;
  89.                 default:sl_select=0; break;
  90.         }
  91. }
  92. //串口发送函数,只发送2个字节.
  93. void UartSend(uchar8 addr)
  94. {
  95.         uchar8 len=0;
  96.         DIR_485=1;
  97.         TxdBuf[0]=addr;                                                                           //将要发送的从机的地址装入发送缓冲内
  98.         while(len<2)
  99.         {
  100.                 Txdflag=0;
  101.                 SBUF=TxdBuf[len++];
  102.                 while(!Txdflag);
  103.         }
  104.         TxFr_Succ=1;                                                                                //置位发送成功标志
  105.         DelayX10us(5);
  106.         DIR_485=0;
  107. }
  108. //串口接收函数
  109. void UartReceive()
  110. {
  111.         uchar8 len=0;
  112.         uchar8 buf[2];
  113.         while(len<2)
  114.         {
  115.                 buf[len++]=RxdBuf[len++];
  116.         }
  117.         DelayX10us(5);
  118. }
  119. //串口中断函数
  120. void InterruptUART() interrupt 4
  121. {
  122.         if(RI)
  123.         {
  124.                 RI=0;
  125.                 RxdBuf[cntRxd++]=SBUF;
  126.                 if(cntRxd>=2)
  127.                 {
  128.                         cntRxd=0;
  129.                         RxFr_Succ=1;                                //接收成功
  130.                         RxFr_Fail=0;
  131.                         TxFr_Succ=0;
  132.                 }
  133.         }
  134.         if(TI)
  135.         {
  136.                 TI=0;
  137.                 Txdflag=1;
  138.         }
  139. }
  140. //T0中断函数
  141. void InterruptTimter0() interrupt 1
  142. {
  143.         static uchar8 i=0;                                        //1yá÷Ë÷òy
  144.         static uchar8 j=0;                                        //供电索引
  145.         static uchar8 k=0;                                        //串口发送计时
  146.         TH0=0xF8;
  147.         TL0=0xCC;                                                        //2ms
  148. //过流检测,同时躲过电机启动瞬间的尖峰电流
  149.         OCBuf[0]=(OCBuf[0]<<1)|GL1;
  150.         OCBuf[1]=(OCBuf[1]<<1)|GL2;
  151.         if((OCBuf[0]==0x00)||(OCBuf[1]==0x00))
  152.         {
  153.                 i++;
  154.                 OCBuf[0]=0xFF;
  155.                 OCBuf[1]=0xFF;
  156.                 if(i>=2)
  157.                 {
  158.                         i=0;
  159.                         OCflag=1;
  160.                 }
  161.         }
  162. //供电状态检测
  163.         PowSta=(PowSta<<1)|DcBat;                       
  164.         j++;
  165.         if(j>=8)
  166.         {
  167.                 j=0;
  168.                 PowCNTR++;
  169.         }
  170. //通信接收计时,TxFr_Succ为发送成功标志,RxFr_Succ为接收成功标志(置位表示接收成功,不置位不代表接收失败).RxFr_Fail接收失败标志,(置位表示接收失败,不置位不代表接收成功)
  171.         if((TxFr_Succ)&&(!(RxFr_Succ)))                        //数据发送成功,但尚未接收到,开始计时
  172.         {
  173.                 k++;
  174.                 if(k>=20)                                                        //计时40ms
  175.                 {
  176.                         k=0;
  177.                         RxFr_Fail=1;                                        //接收失败,(从机不在线)
  178.                         TxFr_Succ=0;                                        //
  179.                 }
  180.                        
  181.         }
  182.         else                                                                        //计时清0,从数据发送成功开始计时,数据未发送成功,不计时,k清0,数据接收
  183.         {                                                                       //成功后,k清0.
  184.                 k=0;
  185.         }
  186. }

  187. 定时器,UART,过流检测,供电状态检测,延时函数
  188. # define _TMR_UART_C
  189. # include "config.h"
  190. # include "tmr_uart.h"
  191. # include "main.h"


  192. //T0配置函数
  193. void ConfigTimer0()
  194. {
  195.         TMOD&=0xF0;                 
  196.         TMOD|=0x01;                 
  197.         TF0=0;                        
  198.         TH0=0xF8;               
  199.         TL0=0xCC;                 
  200.         ET0=1;                        
  201.         TR0=1;                        
  202.         EA=1;                        
  203. }
  204. /*UART配置函数*/
  205. void ConfigUART()
  206. {
  207.         SCON=0x50;                                                                //ÅäÖÃ′®¿úÎa·½ê½1£¬8λUART,2¨ìØÂê¿é±ä
  208.         TMOD&=0x0F;                                                                //ÇåáãT1¿ØÖÆλ¡£
  209.         TMOD|=0x20;                                                                //ÅäÖÃT1ÎaÄ£ê½2.
  210.         TH1=0xFD;
  211.         TL1=TH1;                                                                          //2¨ìØÂê9600
  212.         ES=1;                                                                        //¿aÆô′®¿úÖD¶Ï
  213.         ET1=0;                                                                        //½ûÖ1T1ÖD¶Ï
  214.         TR1=1;                                                                        //Æô¶ˉT1                       
  215. }
  216. /*过流检测函数*/
  217. void OCProtect()                                                                   //n*40ms½øDDò»′Î1yá÷ÅD¶Ï
  218. {
  219.         if(OCflag)                                                                //ÖμÎa0x00,±íê¾òѾ-2úéú1yá÷¡£
  220.         {      
  221.                 ROE=1;RA3=1;RA2=1;RA1=1;                        //½«¿ØÖƼìμçÆ÷òy½Åè«2¿à-¸ß£¬êí·ÅËùóD¼ìμçÆ÷¡£
  222.                 while(1)
  223.                 {
  224.                         Buz=!Buz;                                               
  225.                         DelayX50ms(5);                                        //·äÃùÆ÷ÿ¸ô1SÏìò»′Ρ£
  226.                 }
  227.         }
  228. }
  229. //供电状态检测函数
  230. void PowCheck(uchar8 t)
  231. {
  232.         if(PowCNTR>=t)
  233.         {
  234.                 PowCNTR=0;
  235.                 if(PowSta==0xFF)
  236.                 {      
  237.                         TxdBuf[1]=0x12;                                        //将供电状态变量赋给发送缓冲
  238.                 }
  239.                 else if(PowSta==0x00)
  240.                 {
  241.                         TxdBuf[1]=0x13;                                        //将供电状态变量赋给发送缓冲
  242.                 }
  243.                 else;
  244.         }
  245. }
  246. /*延时函数*/
  247. void DelayX50ms(uchar8 t)                //@11.0592MHz
  248. {
  249.         uchar8 i, j,k;
  250.         i = 5;
  251.         j = 121;
  252.         for(k=0;k<t;k++)
  253.         {
  254.                 do
  255.                 {
  256.                         while (--j);
  257.                 }
  258.                 while (--i);
  259.         }
  260. }
  261. //延时函数
  262. void DelayX10us(uchar8 t)
  263. {
  264.         do{
  265.                 _nop_();
  266.                 _nop_();
  267.                 _nop_();
  268.                 _nop_();
  269.                 _nop_();
  270.                 _nop_();
  271.                 _nop_();
  272.                 _nop_();
  273.         }while(--t);
  274. }

  275. # define _ACTION_C
  276. # include "config.h"
  277. # include "action.h"
  278. # include "main.h"


  279. //串口数据解析函数
  280. void UartAction(uchar8 addr)
  281. {
  282.         if(buf[0]!=addr)                                                                //ê×Ïèo˶ÔμØÖ·£¬2»êÇ′ó»úF1·¢à′μÄêy¾Y£¬Ö±½ó·μ»Ø
  283.         {
  284.                 return;
  285.         }
  286.         switch(buf[1])
  287.         {
  288.                 case 0x03:ReturnPos(addr);break;
  289.                 case 0x04:ROE=0;RA3=0;RA2=0;RA1=0; LedDisp(1); break;                 //C1PÎaμíμçƽ
  290.                 case 0x05:ROE=0;RA3=0;RA2=1;RA1=0; LedDisp(2); break;                 //C2PÏòí·Æ½òÆ
  291.                 case 0x06:ROE=1;RA3=0;RA2=1;RA1=0; LedDisp(5); break;                 //C5P±3°åéÏéy
  292.                 case 0x07:ROE=0;RA3=1;RA2=1;RA1=0; LedDisp(11);break;                         //1#Y6  é23μ
  293.                 case 0x08:ROE=0;RA3=0;RA2=1;RA1=1; LedDisp(7); break;                    //C2NÏò½ÅƽòÆ
  294.                 case 0x09:ROE=1;RA3=0;RA2=1;RA1=1; LedDisp(10);break;                //C5N±3°åϽμ
  295.                 case 0x0A:ROE=0;RA3=0;RA2=0;RA1=1; LedDisp(6); break;                //C1NϽμ
  296.                 case 0x0B:ROE=1;RA3=1;RA2=0;RA1=0; LedDisp(13);break;                //2#Y4  Ñüéy
  297.                 case 0x0C:ROE=1;RA3=0;RA2=0;RA1=0; LedDisp(4); break;                //C4P×óÇã
  298.                 case 0x0D:ROE=0;RA3=1;RA2=1;RA1=1; LedDisp(12);break;                //1#Y7 Ëéé23μ
  299.                 case 0x0E:ROE=0;RA3=1;RA2=0;RA1=1; LedDisp(8); break;                //C3Ní·½μ½Åéy
  300.                 case 0x0F:ROE=1;RA3=1;RA2=0;RA1=1; LedDisp(14);break;                //2#Y5  Ñü½μ
  301.                 case 0x10:ROE=0;RA3=1;RA2=0;RA1=0; LedDisp(3); break;                //C3Pí·éy½Å½μ
  302.                 case 0x11:ROE=1;RA3=0;RA2=0;RA1=1; LedDisp(9); break;                //C4NóòÇã      
  303.                 case 0xFF:ROE=1;RA3=1;RA2=1;RA1=1; LedDisp(19);break;                //êí·ÅËùóD¼ìμçÆ÷
  304.                 default:ROE=1;RA3=1;RA2=1;RA1=1;Dis_Pin=0xFF;break;
  305.         }
  306. }
  307. //LED显示函数
  308. void LedDisp(uchar8 temp)
  309. {
  310.         switch(temp)
  311.         {
  312.                 case 1:  Dis_Pin=0x9F;break;        //9F:1001 1111 ÏÔê¾1
  313.                 case 2:  Dis_Pin=0x31;break;        //31:1010 1110 ÏÔê¾2
  314.                 case 3:  Dis_Pin=0x15;break;        //15:                   ÏÔê¾3
  315.                 case 4:  Dis_Pin=0x9C;break;        //                           ÏÔê¾4
  316.                 case 5:  Dis_Pin=0x54;break;        //                           ÏÔê¾5
  317.                 case 6:  Dis_Pin=0x8F;break;        //                           ÏÔê¾1.
  318.                 case 7:  Dis_Pin=0x21;break;        //                           ÏÔê¾2.
  319.                 case 8:  Dis_Pin=0x05;break;        //                           ÏÔê¾3.
  320.                 case 9:  Dis_Pin=0x8C;break;        //                           ÏÔê¾4.
  321.                 case 10: Dis_Pin=0x44;break;        //                       ÏÔê¾5.
  322.                 case 11: Dis_Pin=0x50;break;        //                           ÏÔê¾6
  323.                 case 12: Dis_Pin=0x40;break;        //                           ÏÔê¾6.
  324.                 case 13: Dis_Pin=0x1F;break;        //                           ÏÔê¾7
  325.                 case 14: Dis_Pin=0x0F;break;        //                           ÏÔê¾7.
  326.                 default: Dis_Pin=0x00;break;
  327.         }
  328. }
  329. //复位函数
  330. void ReturnPos(uchar8 addr)
  331. {
  332.         if(RW5==0)
  333.         {      
  334.                 ROE=1;RA3=0;RA2=1;RA1=0; LedDisp(5);                                //±3°åéÏéy
  335.                 while(RW5==0)
  336.                 {
  337.                         ReAction(addr);
  338.                 }
  339.         }
  340.         else if(RW5==1)
  341.         {      
  342.                 ROE=1;RA3=0;RA2=1;RA1=1; LedDisp(10);                                //±3°åϽμ
  343.                 while(RW5==1)
  344.                 {      
  345.                         ReAction(addr);
  346.                 }
  347.         }
  348. //×óóòÇãD±¸′λ


  349.         if(RW4==0)
  350.         {      
  351.                 ROE=1;RA3=0;RA2=0;RA1=0; LedDisp(4);                                //×óÇã
  352.                 while(RW4==0)
  353.                 {
  354.                         ReAction(addr);
  355.                 }
  356.         }
  357.         else if(RW4==1)
  358.         {      
  359.                 ROE=1;RA3=0;RA2=0;RA1=1; LedDisp(9);                                //óòÇã
  360.                 while(RW4==1)
  361.                 {
  362.                         ReAction(addr);
  363.                 }
  364.         }
  365. //Ç°oóÇãD±¸′λ
  366.         if(RW3==0)
  367.         {
  368.                 ROE=0;RA3=1;RA2=0;RA1=0; LedDisp(3);                                //Ç°Çã
  369.                 while(RW3==0)
  370.                 {
  371.                         ReAction(addr);
  372.                 }
  373.         }
  374.         else if(RW3==1)
  375.         {      
  376.                 ROE=0;RA3=1;RA2=0;RA1=1; LedDisp(8);                                //oóÇã
  377.                 while(RW3==1)
  378.                 {
  379.                         ReAction(addr);
  380.                 }
  381.         }
  382.         if(RW2==0)
  383.         {
  384.                 ROE=0;RA3=0;RA2=1;RA1=0; LedDisp(2);                                //Ïòí·Æ½òÆ
  385.                 while(RW2==0)
  386.                 {
  387.                         ReAction(addr);
  388.                 }
  389.         }
  390.         else if(RW2==1)
  391.         {
  392.                 ROE=0;RA3=0;RA2=1;RA1=0; LedDisp(7);                                //Ïò½ÅƽòÆ
  393.                 while(RW2==1)
  394.                 {
  395.                         ReAction(addr);
  396.                 }
  397.         }
  398.         if(RW1==0)
  399.         {      
  400.                 ROE=0;RA3=0;RA2=0;RA1=1; LedDisp(6);                                //Ïòí·Æ½òÆ
  401.                 while(RW1==0)
  402.                 {
  403.                         ReAction(addr);
  404.                 }      
  405.         }      
  406.         ROE=1;RA3=1;RA2=1;RA1=1;                                                                //1رռìμçÆ÷êä3ö¡£
  407. }
  408. //复位解析函数,复位期间,也要一直与从机进行通信,并解析数据.
  409. void ReAction(uchar8 addr)
  410. {
  411.         UartSend(addr);
  412.         switch(sl_select)
  413.         {
  414.         case 0:if(RxFr_Succ)
  415.                 {
  416.                         RxFr_Succ=0;
  417.                         UartReceive();
  418.                         if(buf[0]!=addr)
  419.                         {
  420.                                 return;
  421.                         }
  422.                         if((buf[1]==0xFF)||(buf[1]==0x03))
  423.                         {
  424.                                 sl_select++;
  425.                         }
  426.                         else
  427.                                 break;
  428.                 }
  429.         case 1:if(RxFr_Succ)
  430.                 {
  431.                         RxFr_Succ=0;
  432.                         UartReceive();
  433.                         if(buf[0]!=addr)
  434.                         {
  435.                                 return;
  436.                         }
  437.                         if((buf[1]==0xFF)||(buf[1]==0x03))
  438.                         {
  439.                                 sl_select--;
  440.                         }
  441.                         else
  442.                                 break;
  443.                 }
  444.         default:break;
  445.         }
  446. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:479916 发表于 2019-3-25 16:55 | 只看该作者
从机程序:

# define _MAIN_C
# include "config.h"
# include "botton.h"
# include "inital.h"
# include "leddisp.h"
# include "main.h"


uchar8 ScanKeyCNTR=0;                                        //扫描按键计数
uchar8 cntRxd=0;                                                 //接收计数
bit flagFrame=0;                                                  //帧接收成功标志
uchar8 RxdBuf[2];                                               //串口接收缓冲
uchar8 TxdBuf[2];                                               //发送缓冲
uchar8 PowSta;                                                   //供电状态
uchar8 PowCNTR=0;                                          //供电状态显示计时
uint16 SlpCNTR=SleepTime;                               //休眠
bit flagTxd=0;                                                   //字节发送标志
uchar8 Slpbuf=0xFF;
uint16 KeyBuf=0xFFFF;                                     //按键读取
uchar8 ReturnCNTR=20;
uchar8 pdata buf[2];

void main()
{
        P3M1=0x00;
        P3M0=0x40;                                                                         //设计商品模式为强推挽
        P1M1=0x00;
        P1M0=0x03;                                                                        //P1.0,P1.1端口为强推挽
        SleepDisp=1;                                                                //休眠指示灯
        PowDisp=0;                                                                        //供电指示灯
        DIR_485=0;                                                                        //485方向控制
        ConfigTimer0();
        ConfigUART();
        while(1)
        {
                SlpMode();                                                             //执行休眠函数
                if(ScanKeyCNTR>=2)
                {
                        ScanKeyCNTR=0;
                        ScanKey();                                                            //按键扫描
                        KeyCode();                                                        //按键编码
                }
                UartDriver();
        }
}
//串口驱动函数
void UartDriver()
{
        if(flagFrame)                                              //帧接收成功
        {
                flagFrame=0;
                UartReceive();                                   //串口接收函数
                if(buf[0]!=0xF1)                                                //地址解析
                {
                        return;
                }
                switch(buf[1])                                            //数据解析
                {
                        case 0x12:PowSta=buf[1];break;
                        case 0x13:PowSta=buf[1];break;
                        default:break;
                }
                PowStaDisp();                                                        //供电状态显示
                UartSend();                                                                //发送
        }
}
//串口接收函数
void UartReceive()
{
        uchar8 len=2;
        while(len<2)
        {
                buf[len++]=RxdBuf[len++];
        }
}
//串口发送函数
void UartSend()
{
        uchar8 len=0;
        TxdBuf[0]=0xF1;
        DIR_485=1;
        _nop_();
        while(len<2)
        {
                flagTxd=0;
                SBUF=TxdBuf[len];
                len++;
                while(!flagTxd);
        }
        DelayX10us(6);
        DIR_485=0;
}
//中断函数
void InterruptUART() interrupt 4
{
        if(RI)
        {
                RI=0;
                RxdBuf[cntRxd++]=SBUF;
                if(cntRxd>=2)
                {
                        cntRxd=0;
                        flagFrame=1;           置位接收成功标志
                }
        }
        if(TI)
        {
                TI=0;
                flagTxd=1;
        }
}
//T0中断函数
void InterruptTimer0() interrupt 1
{
        TH0=0xF8;
        TL0=0xCC;
//休眠计时
        if(KeyBuf==0xFFFF)
                SlpCNTR--;                                                                        //ÿ¸ô2msË÷òy¼õD¡ò»′Î
        else
                SlpCNTR=SleepTime;                                                        //Ë÷òyÖμ»Ö¸′3õÖμ
//唤醒计时
        Slpbuf=(Slpbuf<<1)|Wake_up;

        PowCNTR++;

        ScanKeyCNTR++;
}

回复

使用道具 举报

板凳
ID:479916 发表于 2019-3-25 16:56 | 只看该作者
现在通信不成功,求哪位老师给看看,问题出在哪儿?
回复

使用道具 举报

地板
ID:365802 发表于 2019-3-25 18:31 | 只看该作者
沒看出錯誤在哪裡, 不過建議你先電腦用串口助手調通.
回复

使用道具 举报

5#
ID:479916 发表于 2019-3-26 08:08 | 只看该作者
ping264888 发表于 2019-3-25 18:31
沒看出錯誤在哪裡, 不過建議你先電腦用串口助手調通.

现在用串口助手调试, 主机能发数据,但数据不正确,为什么 不正确,一直没有找到原因呢.
回复

使用道具 举报

6#
ID:416287 发表于 2019-3-27 14:40 | 只看该作者
先确定双方波特率相同 然后看寻址是否正确
回复

使用道具 举报

7#
ID:479916 发表于 2019-3-28 19:46 | 只看该作者
奋斗的小白熊 发表于 2019-3-27 14:40
先确定双方波特率相同 然后看寻址是否正确

已经解决了,在串口发达函数中,应该在每个字节发送完成后,延时半个左右的波特率周期,而不是在整个帧发送完成后进行延时.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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