找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm8 stm8s stm8af 485接口 modbus协议代码(已实现)

[复制链接]
跳转到指定楼层
楼主
ID:610433 发表于 2019-9-29 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人使用stm8af62a6,stm8s和stm8af大多数是互通的,只用一个库函数
62a6只能使用uart3!

485接口是硬件,不需要管,任何硬件接线都可以实现

代码见附件,已实现通信

主函数代码,主要为初始化函数,以及modbus帧接收处理函数,帧接收处理按自己的需求自行修改,本例的处理函数为接收数据再多输出一点数据

单片机源程序如下:
  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;       //接受计数器
  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)         //帧处理函数
  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)  //接收结束帧判断
  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],处理判断帧结构
  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文件部分(中断函数)
  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. }
复制代码

全部资料51hei下载地址:
Demo.7z (3.94 MB, 下载次数: 123)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:965139 发表于 2021-9-19 17:14 | 只看该作者
一直再寻找,非常感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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