找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机485通讯的问题 只能接收到第一次的数据

[复制链接]
跳转到指定楼层
楼主
ID:226167 发表于 2017-11-11 10:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MCU 用STC15W408AS,接 MAX485,测试485通讯,有 RX_Buffer缓存。
在 接收端 设置接收数组。只能接收到第一次的数据,后续再次发生送,好像是不接收?
具体原因不详。测试ing,还请大神指导


// 代码

  1. /******************************************
  2. ***
  3. *PROJICT CODE: STC15
  4. *CREATE DATE : 2017/10/30
  5. *CREATED BY  : Chneg
  6. *FUNCTION    :
  7. *MODIFY DATE :
  8. *DOCUMENT    :
  9. *OTHERS      :
  10. ******************************************
  11. ***/

  12. #include "main.h"


  13. /*************        本地函数声明        **************/

  14. /*************  外部函数和变量声明 *****************/

  15. /*************  串口1初始化函数 *****************/
  16. void        UART_config(void)
  17. {
  18.         COMx_InitDefine                COMx_InitStructure;                                        //结构定义
  19.         COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;                //模式,       UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
  20.         COMx_InitStructure.UART_BRT_Use   = BRT_Timer2;                        //使用波特率,   BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
  21.         COMx_InitStructure.UART_BaudRate  = 9600ul;                        //波特率, 一般 110 ~ 115200
  22.         COMx_InitStructure.UART_RxEnable  = ENABLE;                                //接收允许,   ENABLE或DISABLE
  23.         COMx_InitStructure.BaudRateDouble = DISABLE;                        //波特率加倍, ENABLE或DISABLE
  24.         COMx_InitStructure.UART_Interrupt = ENABLE;                                //中断允许,   ENABLE或DISABLE
  25.         COMx_InitStructure.UART_Polity    = PolityLow;                        //中断优先级, PolityLow,PolityHigh
  26.         COMx_InitStructure.UART_P_SW      = UART1_SW_P30_P31;        //切换端口,   UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
  27.         COMx_InitStructure.UART_RXD_TXD_Short = DISABLE;                //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
  28.         USART_Configuration(USART1, &COMx_InitStructure);                //初始化串口1 USART1,USART2

  29.         PrintString1("STC15 UART1 Test Prgramme!\r\n");        //SUART1发送一个字符串
  30.    
  31.     /**
  32.     *RS 485 使能端口
  33.     sbit RS485_DIR = P2^0;  //RS485方向选择引脚
  34.     RS485_DIR = 0; //RS485设置为接收方向

  35.     */
  36. }



  37. /*************main.c*********************************/

  38. void main()
  39. {
  40.     u8 i = 0;
  41.     UART_config();
  42.         EA = 1;
  43.    

  44.     while(1)
  45.     {
  46.         RS485_DE = 1;
  47.         RS485_RE = 1;      
  48. //        PrintString1("\r\n");
  49.         PrintString1("Is New Over");
  50.         for(i = 0;i < 8;i++)
  51.         {
  52.             TX1_write2buff(0x40 + i);
  53.             delay_ms(1000);
  54.             
  55.             RS485_DE = 0;
  56.             RS485_RE = 0;  
  57.             if(RX1_Buffer[1] == 0xAA)
  58.             {
  59.                 RS485_DE = 1;
  60.                 RS485_RE = 1;  
  61.                
  62.                 PrintString1("进入中断");
  63.                 delay_ms(500);
  64.                
  65. //                RX1_Buffer[1] = 0;
  66.             }   
  67.             RS485_DE = 1;
  68.             RS485_RE = 1;              
  69.         }
  70.         

  71.          
  72.     } // <-- end while   
  73. } // <-- end  main
复制代码
  1. /******************************************
  2. ***
  3. *PROJICT CODE:  串口程序
  4. *CREATE DATE :  2017/10/20
  5. *CREATED BY  :  CHneg
  6. *FUNCTION    :  初始化 数据发送 数据 接收
  7. *MODIFY DATE :  /
  8. *DOCUMENT    :  STC DataSheet
  9. *OTHERS      :  /
  10. ******************************************
  11. ***/

  12. #include "main.h"


  13. COMx_Define        COM1;

  14. u8        idata TX1_Buffer[COM_TX1_Lenth];        //发送缓冲
  15. u8         idata RX1_Buffer[COM_RX1_Lenth];        //接收缓冲


  16. u8 ExtsAddr = 0x00;
  17. u8 DestAddr = 0x01;   

  18. u8 RTUOverFlag=0,RTUStartFlag=0,UART_R_RTU[20],RTUFunc,
  19.       RTUPst,RTUDataLen,UARTRTUDataCheckedFlag=0;

  20. u8 USART_Configuration(u8 UARTx, COMx_InitDefine *COMx)
  21. {
  22.         u8        i;
  23.         u32        j;
  24.         
  25.         if(UARTx == USART1)
  26.         {
  27.                 COM1.id = 1;
  28.                 COM1.TX_read    = 0;
  29.                 COM1.TX_write   = 0;
  30.                 COM1.B_TX_busy  = 0;
  31.                 COM1.RX_Cnt     = 0;
  32.                 COM1.RX_TimeOut = 0;
  33.                 COM1.B_RX_OK    = 0;
  34.                 for(i=0; i<COM_TX1_Lenth; i++)        TX1_Buffer[i] = 0;
  35.                 for(i=0; i<COM_RX1_Lenth; i++)        RX1_Buffer[i] = 0;

  36.                 if(COMx->UART_Mode > UART_9bit_BRTx)        return 1;        //模式错误
  37.                 if(COMx->UART_Polity == PolityHigh)                PS = 1;        //高优先级中断
  38.                 else                                                                        PS = 0;        //低优先级中断
  39.                 SCON = (SCON & 0x3f) | COMx->UART_Mode;
  40.                 if((COMx->UART_Mode == UART_9bit_BRTx) ||(COMx->UART_Mode == UART_8bit_BRTx))        //可变波特率
  41.                 {
  42.                         j = (MAIN_Fosc / 4) / COMx->UART_BaudRate;        //按1T计算
  43.                         if(j >= 65536UL)        return 2;        //错误
  44.                         j = 65536UL - j;
  45.                         if(COMx->UART_BRT_Use == BRT_Timer1)
  46.                         {
  47.                                 TR1 = 0;
  48.                                 AUXR &= ~0x01;                //S1 BRT Use Timer1;
  49.                                 TMOD &= ~(1<<6);        //Timer1 set As Timer
  50.                                 TMOD &= ~0x30;                //Timer1_16bitAutoReload;
  51.                                 AUXR |=  (1<<6);        //Timer1 set as 1T mode
  52.                                 TH1 = (u8)(j>>8);
  53.                                 TL1 = (u8)j;
  54.                                 ET1 = 0;        //禁止中断
  55.                                 TMOD &= ~0x40;        //定时
  56.                                 INT_CLKO &= ~0x02;        //不输出时钟
  57.                                 TR1  = 1;
  58.                         }
  59.                         else if(COMx->UART_BRT_Use == BRT_Timer2)
  60.                         {
  61.                                 AUXR &= ~(1<<4);        //Timer stop
  62.                                 AUXR |= 0x01;                //S1 BRT Use Timer2;
  63.                                 AUXR &= ~(1<<3);        //Timer2 set As Timer
  64.                                 AUXR |=  (1<<2);        //Timer2 set as 1T mode
  65.                                 TH2 = (u8)(j>>8);
  66.                                 TL2 = (u8)j;
  67.                                 IE2  &= ~(1<<2);        //禁止中断
  68.                                 AUXR &= ~(1<<3);        //定时
  69.                                 AUXR |=  (1<<4);        //Timer run enable
  70.                         }
  71.                         else return 2;        //错误
  72.                 }
  73.                 else if(COMx->UART_Mode == UART_ShiftRight)
  74.                 {
  75.                         if(COMx->BaudRateDouble == ENABLE)        AUXR |=  (1<<5);        //固定波特率SysClk/2
  76.                         else                                                                AUXR &= ~(1<<5);        //固定波特率SysClk/12
  77.                 }
  78.                 else if(COMx->UART_Mode == UART_9bit)        //固定波特率SysClk*2^SMOD/64
  79.                 {
  80.                         if(COMx->BaudRateDouble == ENABLE)        PCON |=  (1<<7);        //固定波特率SysClk/32
  81.                         else                                                                PCON &= ~(1<<7);        //固定波特率SysClk/64
  82.                 }
  83.                 if(COMx->UART_Interrupt == ENABLE)        ES = 1;        //允许中断
  84.                 else                                                                ES = 0;        //禁止中断
  85.                 if(COMx->UART_RxEnable == ENABLE)        REN = 1;        //允许接收
  86.                 else                                                                REN = 0;        //禁止接收
  87.                 P_SW1 = (P_SW1 & 0x3f) | (COMx->UART_P_SW & 0xc0);        //切换IO
  88.                 if(COMx->UART_RXD_TXD_Short == ENABLE)        PCON2 |=  (1<<4);        //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
  89.                 else                                                                        PCON2 &= ~(1<<4);
  90.                 return        0;
  91.         }
  92.         return 3;        //其它错误
  93. }


  94. /*************** 装载串口发送缓冲 *******************************/

  95. void TX1_write2buff(u8 dat)        //写入发送缓冲,指针+1
  96. {
  97.         TX1_Buffer[COM1.TX_write] = dat;        //装发送缓冲
  98.         if(++COM1.TX_write >= COM_TX1_Lenth)        COM1.TX_write = 0;

  99.         if(COM1.B_TX_busy == 0)                //空闲
  100.         {  
  101.                 COM1.B_TX_busy = 1;                //标志忙
  102.                 TI = 1;                                        //触发发送中断
  103.         }
  104. }

  105. void PrintString1(u8 *puts)  // 发送 字符串
  106. {
  107.     for (; *puts != 0;        puts++)  
  108.         TX1_write2buff(*puts);         //遇到停止符0结束
  109. }

  110. void MovCharSBuffer(unsigned char c)  //  数据帧定义及中断函数
  111. {
  112.     SBUF=c;
  113.     while(TI!=1);
  114.     TI=0;
  115. }


  116. /**************发送数据帧函数***********************/

  117. void Send_RTU(unsigned char DestAddr,unsigned char S_RTUFunc,unsigned char S_RTUDataLen,unsigned char *S_RTUData)
  118. {
  119.         unsigned char i,S_RTUCheck;
  120.         ES=0;
  121.         EA=0;
  122.         REN=0;
  123.         //RTUDataLen=0x00;
  124.         delay_ms(1);
  125.         S_RTUCheck=0;
  126.         MovCharSBuffer(FrameHead);          // 0x40 @       /1  帧头
  127.         MovCharSBuffer(DestAddr);                   // 0x01                        /2
  128.         S_RTUCheck=S_RTUCheck+DestAddr;         // 0+ 0x01
  129.         MovCharSBuffer(S_RTUFunc);                   // 0x11                        /3
  130.         S_RTUCheck=S_RTUCheck+S_RTUFunc;         // 0x01 +0x11
  131.         MovCharSBuffer(S_RTUDataLen);                  // 0x07                        /4
  132.         S_RTUCheck=S_RTUCheck+S_RTUDataLen; // 0x12 +0x07 = 0x19
  133.         
  134.         if(S_RTUDataLen!=0)
  135.     {
  136.         for(i=0;i<S_RTUDataLen;i++)
  137.         {
  138.             MovCharSBuffer(*S_RTUData);                                        //  /N* 数据
  139.             S_RTUCheck=S_RTUCheck+*S_RTUData;
  140.             S_RTUData++;
  141.         }
  142.     }
  143.         MovCharSBuffer(S_RTUCheck);                                                         // /7
  144.         MovCharSBuffer(0x23);                                                                // /8
  145.         ES=1;
  146.         EA=1;
  147.         REN=1;
  148. }


  149. /********************* UART1中断函数************************/
  150. void UART1_int (void) interrupt UART1_VECTOR
  151. {

  152.         if(RI)
  153.         {
  154.                 RI = 0;
  155.                 if(COM1.B_RX_OK == 0)
  156.                 {
  157.                         if(COM1.RX_Cnt >= COM_RX1_Lenth)  
  158.                 COM1.RX_Cnt = 0;
  159.                         RX1_Buffer[COM1.RX_Cnt++] = SBUF;
  160.             
  161.                         COM1.RX_TimeOut = TimeOutSet1;
  162.             
  163.                 }
  164.         }

  165.         if(TI)
  166.         {
  167.                 TI = 0;
  168.                 if(COM1.TX_read != COM1.TX_write)
  169.                 {
  170.                          SBUF = TX1_Buffer[COM1.TX_read];
  171.                         if(++COM1.TX_read >= COM_TX1_Lenth)               
  172.                     COM1.TX_read = 0;
  173.                 }
  174.                 else        COM1.B_TX_busy = 0;
  175.         }
  176. }





复制代码



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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