当前位置: 首页 > news >正文

RS485

#ifndef __RS485_H
#define __RS485_H    
#include "sys.h"#include "stdio.h"    #define SLAVE_ADDR  0x01
#define RX_BUF_SIZE 64
#define RS485_TX_EN()   GPIO_SetBits(GPIOB, GPIO_Pin_7)
#define RS485_RX_EN()   GPIO_ResetBits(GPIOB, GPIO_Pin_7)void UART5_RS485_Init(uint32_t baud);void RS485_Send(uint8_t *buf, uint16_t len);void Modbus_Slave_Poll(void);extern uint16_t Modbus_CRC16(uint8_t *buf, uint16_t len);extern volatile uint8_t rx_buf[RX_BUF_SIZE];
extern volatile uint8_t rx_len ;
extern uint16_t HoldingReg[10];#endif 

 

 

#include "RS485.h"
#include "sys.h"uint16_t Modbus_CRC16(uint8_t *buf, uint16_t len);volatile uint8_t rx_buf[RX_BUF_SIZE];
volatile uint8_t rx_len = 0;
uint16_t HoldingReg[10] = {3300,   // 40001:电压 mV123,    // 40002:示例数据
};void UART5_IRQHandler(void)
{if(USART_GetITStatus(UART5, USART_IT_RXNE)){if(rx_len < RX_BUF_SIZE)rx_buf[rx_len++] = USART_ReceiveData(UART5);}
}void UART5_RS485_Init(uint32_t baud)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC |RCC_APB2Periph_GPIOD |RCC_APB2Periph_AFIO, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);/* TX PC12 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);/* RX PD2 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOD, &GPIO_InitStructure);/* DE PB7 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure);RS485_RX_EN();USART_InitStructure.USART_BaudRate = baud;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(UART5, &USART_InitStructure);USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);USART_Cmd(UART5, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void RS485_Send(uint8_t *buf, uint16_t len)
{RS485_TX_EN();for(uint16_t i = 0; i < len; i++){USART_SendData(UART5, buf[i]);while(USART_GetFlagStatus(UART5, USART_FLAG_TXE) == RESET);}while(USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET);RS485_RX_EN();
}uint16_t Modbus_CRC16(uint8_t *buf, uint16_t len)
{uint16_t crc = 0xFFFF;for(uint16_t i = 0; i < len; i++){crc ^= buf[i];for(uint8_t j = 0; j < 8; j++){if(crc & 1) crc = (crc >> 1) ^ 0xA001;else crc >>= 1;}}return crc;
}void Modbus_Slave_Poll(void)
{if(rx_len < 8) return;uint16_t crc_calc = Modbus_CRC16((uint8_t*)rx_buf, rx_len-2);uint16_t crc_recv = rx_buf[rx_len-2] | (rx_buf[rx_len-1]<<8);if(crc_calc != crc_recv) goto clear;if(rx_buf[0] != SLAVE_ADDR) goto clear;if(rx_buf[1] == 0x03){uint16_t start = (rx_buf[2]<<8) | rx_buf[3];uint16_t num   = (rx_buf[4]<<8) | rx_buf[5];uint8_t tx[64], idx = 0;tx[idx++] = SLAVE_ADDR;tx[idx++] = 0x03;tx[idx++] = num * 2;for(uint16_t i=0;i<num;i++){tx[idx++] = HoldingReg[start+i] >> 8;tx[idx++] = HoldingReg[start+i] & 0xFF;}uint16_t crc = Modbus_CRC16(tx, idx);tx[idx++] = crc & 0xFF;tx[idx++] = crc >> 8;RS485_Send(tx, idx);}clear:rx_len = 0;
}

 

http://www.jsqmd.com/news/257479/

相关文章:

  • Eclipse 重启选项详解
  • 2026年深圳热门的GEO全场景推广解决方案推荐,哪家公司靠谱? - 工业品牌热点
  • 基于VUE的高校发展学生党员管理系统[VUE]-计算机毕业设计源码+LW文档
  • Perl 数据库连接
  • RDF 规则:构建语义网的基础
  • Markdown 列表
  • JavaScript 变量提升
  • HTML5 Web Workers
  • AngularJS 指令
  • Python 环境搭建指南
  • 智能垃圾桶、垃圾分类 App、环卫机器人、政策评估系统 YOLOV8模型如何训练生活垃圾分类检测数据集 建立基于深度学习框架YOLOV8垃圾检测系统
  • QLC pSLC模式|超低功耗LDPC解码器
  • 互联网核心系统架构白皮书:从 MySQL 到千万 QPS 的全链路工程体系
  • 并查集路径压缩
  • 动态NAND恢复技术打破QLC寿命天花板
  • Kubernetes Pod 存储全景图:Volume、PVC、PV 到 CSI 的完整链路解析
  • C 结构体
  • 为NAND续命:页隔离技术如何让“坏块“重获新生?
  • 短视频软件代码,改进for循环时间复杂度的一种办法 - 云豹科技
  • NVIDIA点燃HBM4竞速赛:12层量产前夜,16层博弈定生死
  • 英伟达CES 2026深度解读:物理AI革命与全栈技术重构(附演讲ppt)
  • GESP认证C++编程真题解析 | P11962 [GESP202503 六级] 树上漫步
  • 网站流量资产的永久性迁移:301 重定向
  • LeetCode100天Day13-移除元素与多数元素
  • 2026年卷闸门厂家专业推荐榜:自动/车库/电动/不锈钢/快速卷闸门及工业门解决方案厂家精选 - 品牌推荐官
  • 重磅福利,TRAE 国际版全部用户限免一个月!
  • 推荐几个不错的 Linux 服务器管理工具
  • 智纺云ERP开发实战
  • 【算法题】堆
  • PasteEx:一款.NET开源的Windows快捷粘贴神器