久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4721|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久人人国产 | 中文字幕av亚洲精品一部二部 | 视频羞羞| 精品一区二区三区四区五区 | 国产亚洲一区精品 | 自拍亚洲| 黄色一级电影在线观看 | 日韩成人av在线 | 欧美成人精品一区二区男人看 | 99精品国产在热久久 | 欧美综合一区二区三区 | 2019精品手机国产品在线 | 国产精品99久久久久久宅男 | 国产99久久精品一区二区永久免费 | av毛片 | 久久r免费视频 | h视频在线观看免费 | 亚洲午夜在线 | 亚洲免费网址 | 国产1区| 日本精品久久 | 色免费在线视频 | 国产影音先锋 | 亚洲久久一区 | 久久久精品在线 | 综合网视频 | 免费国产视频 | 91精品久久久久久久久中文字幕 | 特一级黄色毛片 | 日韩不卡一区二区 | 一区二区三区亚洲视频 | h视频在线免费 | 三级特黄特色视频 | 亚洲欧美中文日韩在线v日本 | 亚洲网站在线播放 | 日韩在线播放视频 | 欧美精品一区二区三区四区五区 | 欧美精品一区三区 | 亚洲一区二区三区在线视频 | 粉嫩粉嫩芽的虎白女18在线视频 | 日韩精品在线播放 |