首页 > 其他分享 >串口实现modbus通讯

串口实现modbus通讯

时间:2023-12-15 14:45:57浏览次数:28  
标签:NVIC 通讯 USART modbus InitStructure Mode 串口 GPIO USART2

代码

#include "sys.h"
#include "485.h"    
#include "delay.h"
#include "modbus.h"
void RS485_Init(u32 bound){
  //GPIO端口设置
     GPIO_InitTypeDef GPIO_InitStructure;
     USART_InitTypeDef USART_InitStructure;
     NVIC_InitTypeDef NVIC_InitStructure;
         
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA , ENABLE);    //使能GPIO时钟
//         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);    //使能GPIO时钟
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);    //使能USART2时钟
//     GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);//调用重映射函数 
        
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                 //LED0-->PA.8 端口配置
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         //IO口速度为50MHz
     GPIO_Init(GPIOD, &GPIO_InitStructure);                     
     GPIO_SetBits(GPIOD,GPIO_Pin_3);    
        
    
//    //USART1_TX   GPIO
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //P
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
//  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO
//   
//  //USART1_RX      GPIOA初始化
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//PA
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
//  GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIO 
  

     //USART2_TX   PA.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); 
   
    //USART2_RX      PA.3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //子优先级0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

    USART_InitStructure.USART_BaudRate = bound;//串口波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式

  USART_Init(USART2, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART2, ENABLE);                    //使能串口1 
  RS485_TX_EN=0;            //默认为接收模式
}
/***********************************************/


u8 RS485_8bit_PutChar_send(u8 ch)
 {
    RS485_TX_EN=1;
    USART_SendData(USART2, (u8) ch);
    while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
   {
   }
     RS485_TX_EN=0;
   return ch;
}
void RS485_8bit_PutString_send(u8* buf , u16 len)
{   u8 i;
//    RS485_TX_EN=1;
    for(i=0;i<len;i++)
    {
        RS485_8bit_PutChar_send(*buf++);
    }
    //    RS485_TX_EN=0;
}

u16 RS485_16bit_PutChar_send(u16 ch)
{
    /* Write a character to the USART */
    USART_SendData(USART2, (u8) ch);
    while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
   {
   }
   return ch;
}
void RS485_16bit_PutString_send(u16* buf , u16 len)
{   u8 i;
    for(i=0;i<len;i++)
    {
        RS485_16bit_PutChar_send(*buf++);
    }
}

void RS485_byte(u8 d)  //485发送一个字节
{
  
 // RS485_RT_1;  //??
  USART_SendData(USART2, d);
      while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
  USART_ClearFlag(USART2,USART_FLAG_TC );
   
 // RS485_RT_0;  //?
  
}

void USART2_IRQHandler(void)                    //串口1中断服务程序
    { u8 st,sbuf;
         if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)//注意!不能使用if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)来判断  
    {  
        sbuf=USART_ReceiveData(USART2);  
    } 
    st=USART_GetITStatus(USART2, USART_IT_RXNE);
    if(st==SET)  //
   {            
          sbuf=USART2->DR;
     if( modbus.reflag==1)  //有数据包正在处理
         {
           return ;
         }             
          modbus.rcbuf[modbus.recount++]=sbuf;
      modbus.timout=0;  
      if(modbus.recount==1)  //收到主机发来的一帧数据的第一字节
            {
              modbus.timrun=1;  //启动定时
            }
            USART_ClearITPendingBit(USART2,USART_IT_RXNE);
   } 

  } 
485.c

 

标签:NVIC,通讯,USART,modbus,InitStructure,Mode,串口,GPIO,USART2
From: https://www.cnblogs.com/zhouyuqing1024/p/17903323.html

相关文章

  • 关于EthernetIP转ModbusTCP协议转换的成熟应用
    在现代工业自动化领域,以太网和互联网的集成已经成为一种趋势。Ethernet/IP转ModbusTCP网关作为一种关键的通信设备,能够实现以太网和ModbusTCP协议之间的转换,从而在工业自动化领域中发挥重要作用。本文将详细介绍Ethernet/IP转ModbusTCP网关的应用和配置方法。Ethernet/IP转Mo......
  • Qt之modbus_slave例程的底层串口数据分析
    一.参考网址1. qCDebug输出到日志文件2. HowtoredirectqDebug,qWarning,qCriticaletcoutput?二.问题1. 如何查看slave底层收到的主机发送的消息和回复的消息?解决办法:在main.cpp代码中取消注释 注:QLoggingCategory::setFilterRules函数不能重复使用,其只能最后......
  • Modbus转Profinet网关的配置步骤和注意事项
     Modbus转Profinet网关的配置步骤和注意事项当拿到Modbus转Profinet网关(XD-MDPN100/200)不会配置或是配置完成后发现Modbus转Profinet网关(XD-MDPN100/200)与设备通讯不上等问题。下面就这些问题给大家详细解读。 首先,确保Modbus转Profinet网关(XD-MDPN100/200)的电源连接正常。检......
  • modbus转profinet网关连接6台232modbus伺服同时控制案例
    modbus转profinet网关连接6台232modbus伺服同时控制案例Modbus转Profinet网关是一种用于连接不同网络之间的通讯设备。它的原理是通过将Modbus协议转换为Profinet协议,实现Modbus设备与Profinet网络之间的数据交换。其功能具体包括将Modbus设备发送的数据转发到Profinet网络中,并将P......
  • s32k-I.MX8 基于串口通讯xrce-dds搭建
    s32k-iMX8平台XRCE-DDS的搭建1.引言XRCE-DDS简述     XRCE-DDS是可以在资源受限的MCU运行的DDS,在MCU侧运行客户端,通过代理服务参与DDS通信。 使用范围      本文将描述整个XRCE-DDS在GEN2平台的搭建过程,包含SOC侧imx8上运行xrce-dds的anget和s32k312单片机......
  • 隧道施工防爆应急通讯系统(防爆电话)
    是为了保障隧道施工安全、防范事故、提高应急响应能力而设计的重要设施。隧道施工过程中,由于环境复杂,容易产生瓦斯、粉尘等爆炸危险因素,因此防爆应急通讯系统的建设显得尤为重要。本文将探讨隧道施工防爆应急通讯系统的设计要点、功能特点及其作用,为读者带来深入了解和认识。【云南......
  • 台达 通讯出现 DriverInf.txt文件丢失 方便别人
    DriverInf.txt文件丢失是因为计算机使用了mindmanager6免安装版本而把登入文件里面的msxmldll路径修改掉造成有使用到msxmlDLL的所有应用程序都会发生问题.下载链接:DownloadKB2758694:MicrosoftXMLCoreServices4.0ServicePack3安全性更新fromOfficialMicrosoft......
  • NRF52832---串口通信
    我在做一个蓝牙demo,蓝牙主控用的nrf52832。在添加DFU功能后,使用“nRFConnect”app连接上demo后,点击“notify”,蓝牙就会断开连接,log打印如下图 没有提示出错的行号。我是用的蓝牙传输方式是透传。我查遍了关于nrf52832内存不足的帖子,都没有解决。我去问了技术售后(我买的开发......
  • 即时通讯技术文集(第27期):实时音视频技术合集(Part2) [共17篇]
    ​为了更好地分类阅读52im.net总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第27 期。[- 1 -] 专访微信视频技术负责人:微信实时视频聊天技术的演进[链接] http://www.52im.net/thread-1201-1-1.html[摘要] 本次专访是对谷沉沉老师在即将到来的2017Ar......
  • WorkPlus即时通讯,让沟通零障碍!企业协作更高效
    如今,随着信息技术的快速发展,企业对于高效沟通和即时协作的需求也日益增长。在这个数字化时代,WorkPlus作为一款领先的企业级移动办公平台,以其强大的即时通讯功能和卓越的用户体验,成功为企业打造了高效沟通的新时代。【沟通便捷,WorkPlus即时通讯助力企业协作】WorkPlus提供了强大的即......