找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3860|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

stm8 stm8s stm8af 485接口 modbus協(xié)議代碼(已實(shí)現(xiàn))

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:610433 發(fā)表于 2019-9-29 10:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本人使用stm8af62a6,stm8s和stm8af大多數(shù)是互通的,只用一個(gè)庫函數(shù)
62a6只能使用uart3!

485接口是硬件,不需要管,任何硬件接線都可以實(shí)現(xiàn)

代碼見附件,已實(shí)現(xiàn)通信

主函數(shù)代碼,主要為初始化函數(shù),以及modbus幀接收處理函數(shù),幀接收處理按自己的需求自行修改,本例的處理函數(shù)為接收數(shù)據(jù)再多輸出一點(diǎn)數(shù)據(jù)

單片機(jī)源程序如下:
  1. /******************************************************************
  2. mian.c文件部分
  3. ******************************************************************/

  4. void main(void)
  5. {

  6.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);

  7.   GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);

  8.   UART3_DeInit();
  9.   UART3_Init((u32)9600, UART3_WORDLENGTH_8D, UART3_STOPBITS_1, UART3_PARITY_NO, UART3_MODE_TXRX_ENABLE);
  10.   UART3_ITConfig(UART3_IT_RXNE_OR, ENABLE);

  11.   TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 1000, 0);
  12.   TIM1_ARRPreloadConfig(ENABLE);
  13.   TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
  14.   TIM1_Cmd(ENABLE);

  15.   ITC_SetSoftwarePriority(ITC_IRQ_UART3_RX, ITC_PRIORITYLEVEL_3);
  16.   ITC_SetSoftwarePriority(ITC_IRQ_TIM1_OVF, ITC_PRIORITYLEVEL_1);

  17.   enableInterrupts();

  18.   while (1)
  19.   {
  20.     UartDriver();
  21.   }

  22. }


  23. /******************************************************************
  24. modbus.c文件
  25. ******************************************************************/
  26. #include "stm8s.h"

  27. extern void Delay(uint16_t nCount);     //延遲1us


  28. unsigned char cntRxd = 0;       //接受計(jì)數(shù)器
  29. unsigned char bufRxd[64];       //接受寄存器

  30. unsigned char flagFrame = 0;

  31. void UartWriteBuf(unsigned char * buf ,unsigned char len)       //串口輸出buf
  32. {
  33.   GPIO_WriteHigh(GPIOD, GPIO_PIN_3);

  34.   while(len--)
  35.   {
  36.     while(( UART3_GetFlagStatus(UART3_FLAG_TXE)==RESET));
  37.     UART3_SendData8(*buf++);
  38.     while(( UART3_GetFlagStatus(UART3_FLAG_TXE)==RESET));
  39.   }

  40.   Delay(0xFFFF);
  41.   GPIO_WriteLow(GPIOD, GPIO_PIN_3);
  42. }

  43. void UartAction(unsigned char * buf ,unsigned char len)         //幀處理函數(shù)
  44. {
  45.   buf[len++] = '\r';
  46.   buf[len++] = '\n';
  47.   UartWriteBuf(buf ,len);
  48. }

  49. unsigned char UartReadBuf(unsigned char * buf ,unsigned char len)       //串口buf讀取
  50. {
  51.   unsigned char i;
  52.   if(len > cntRxd)
  53.   {
  54.     len = cntRxd;
  55.   }

  56.   for(i = 0; i < len; i++)
  57.   {
  58.     *buf++ = bufRxd[i];
  59.   }
  60.   cntRxd = 0;

  61.   return len;
  62. }

  63. void UartReadMonitor(unsigned char ms)  //接收結(jié)束幀判斷
  64. {
  65.   static unsigned char cntbkp = 0;
  66.   static unsigned char idletmr = 0;

  67.   if(cntRxd > 0)
  68.   {
  69.     if(cntbkp != cntRxd)
  70.     {
  71.       cntbkp = cntRxd;
  72.       idletmr = 0;
  73.     }
  74.     else
  75.     {
  76.       if(idletmr < 30)
  77.       {
  78.         idletmr += ms;
  79.         if(idletmr >= 30)
  80.         {
  81.           flagFrame = 1;
  82.         }
  83.       }
  84.     }
  85.   }
  86.   else
  87.   {
  88.     cntbkp = 0;
  89.   }
  90. }

  91. void UartDriver(void)   //接收buf[len-2],處理判斷幀結(jié)構(gòu)
  92. {
  93.   unsigned char len;
  94.   unsigned char buf[40];

  95.   if(flagFrame)
  96.   {
  97.     flagFrame = 0;
  98.     len = UartReadBuf(buf ,sizeof(buf)-2);
  99.     UartAction(buf ,len);
  100.   }
  101. }

  102. /******************************************************************
  103. it.c文件部分(中斷函數(shù))
  104. ******************************************************************/

  105. INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
  106. {  
  107.   TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
  108.   UartReadMonitor(1);
  109. }



  110. INTERRUPT_HANDLER(UART3_RX_IRQHandler, 21)
  111. {
  112.    UART3_ClearITPendingBit(UART3_IT_RXNE);
  113.    if(cntRxd < sizeof(bufRxd))
  114.    {
  115.      bufRxd[cntRxd++] = UART3_ReceiveData8();
  116.    }
  117. }
復(fù)制代碼

全部資料51hei下載地址:
Demo.7z (3.94 MB, 下載次數(shù): 128)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:965139 發(fā)表于 2021-9-19 17:14 | 只看該作者
一直再尋找,非常感謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表