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

北京市朝阳区住房建设网站迁安做网站中的cms润强

北京市朝阳区住房建设网站,迁安做网站中的cms润强,医院网站建设策划案模板,容桂网站建设原创文章目录一、基础知识点二、开发环境三、STM32CubeMX相关配置1、STM32CubeMX基本配置2、STM32CubeMX RS485 相关配置四、Vscode代码讲解五、结果演示以及报文解析一、基础知识点 了解 RS485 Modbus协议技术 。本实验是基于STM32F103开发 实现 通过RS-485实现modbus协议。 准备… 文章目录一、基础知识点二、开发环境三、STM32CubeMX相关配置1、STM32CubeMX基本配置2、STM32CubeMX RS485 相关配置四、Vscode代码讲解五、结果演示以及报文解析一、基础知识点 了解 RS485 Modbus协议技术 。本实验是基于STM32F103开发 实现 通过RS-485实现modbus协议。 准备好了吗开始我的show time。 二、开发环境 1、硬件开发准备 主控STM32F103ZET6 RS485收发器SP3485P 2、软件开发准备 软件开发使用虚拟机 VScode STM32Cube 开发STM32在虚拟机中直接完成编译下载。 该部分可参考软件开发环境构建 三、STM32CubeMX相关配置 1、STM32CubeMX基本配置 本实验基于CubeMX详解构建基本框架 进行开发。 2、STM32CubeMX RS485 相关配置 (1)发送接收控制脚配置GPIO配置 gpio输出电平 低控制引脚默认低电平芯片处于读状态 gpio模式 推挽输出 gpio上下拉设置 不上下拉 gpio输出速度 低速 gpio命名 RS485_DE_nRE 与硬件标识一致便于代码编写 2串口UART3配置 根据硬件引脚连接RS485芯片连接UART3通信 基本配置 实验波特率采用9600、数据位8bit、无奇偶校验、停止位1bit 数据方向 接收发送 DMA配置 Add添加发送和接收的DMADMA参数保持默认状态 3中断配置 实验中接收数据采用空闲触发发送数据采用DMA发送触发后发送完成中断 UART3总中断USART3 global interrupt必须打开为了发送完成中断实现 UART_RX (DMA1 channel3 global interrupt) DMA接收中断不打开取消对钩这里对钩无法改变后续解决 UART_TX (DMA1 channel2 global interrupt) DMA发送中断打开。 进行NVIC中断等级配置0等级最高 上述讲到无法取消DMA接收中断原因是选中了强制DMA中断右上角蓝色框取消对钩就ok 四、Vscode代码讲解 1、初始化相关中断 #ifdef STM32_F407_RS485_Modbusprintf(----DWB 此程序通过RS-485实现modbus协议----\r\n);__HAL_UART_ENABLE_IT(huart3, UART_IT_IDLE); // 使能串口3空闲中断HAL_UART_Receive_DMA(huart3, UART3.pucRec_Buffer, UART3_Rec_LENGTH); #endif2、RS485 结构体 以及函数实现 typedef struct {uint8_t* pucSend_Buffer; //发送缓存指针 uint8_t* pucRec_Buffer; //接收缓存指针 void (*SendArray)(uint8_t*, uint16_t); //串口发送数组void (*SendString)(uint8_t*); //串口发送字符串void (*RS485_Set_SendMode)(void); //RS-485接口设置为发送模式void (*RS485_Set_RecMode)(void); //RS-485接口设置为接收模式/* data */ } UART_t;// 串口发数组 static void SendArray(uint8_t* p_Arr,uint16_t LEN) {UART3.RS485_Set_SendMode(); HAL_UART_Transmit_DMA(huart3,p_Arr,LEN); }// RS485接口设置发送模式 static void RS485_Set_SendMode() {HAL_GPIO_WritePin(RS485_DE_nRE_GPIO_Port, RS485_DE_nRE_Pin,,GPIO_PIN_SET); }// RS485接口设置接收模式 static void RS485_Set_RecMode() {HAL_GPIO_WritePin(RS485_DE_nRE_GPIO_Port, RS485_DE_nRE_Pin,,GPIO_PIN_RESET); }3、RS485 Modbus发送 重构接收回调函数整个DMA发送过程后面有讲解 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {/* Prevent unused argument(s) compilation warning */if(huart-Instance huart3.Instance){UART3.RS485_Set_RecMode();} }4、RS485 Modbus接收 接收使用空闲中断 在串口总中断中添加空闲中断检测。 void USART3_IRQHandler(void) {/* USER CODE BEGIN USART3_IRQn 0 */if(__HAL_UART_GET_FLAG(huart3, UART_FLAG_IDLE)) // 判断空闲中断标志位{__HAL_UART_CLEAR_IDLEFLAG(huart3); // 1、清除中断标志位HAL_UART_IdleCallback(huart3); // 2、空闲中断回调函数}/* USER CODE END USART3_IRQn 0 */HAL_UART_IRQHandler(huart3);/* USER CODE BEGIN USART3_IRQn 1 *//* USER CODE END USART3_IRQn 1 */ }在 Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h 文件中回调函数并没有串口空闲中断回调函数 重构空闲中断回调函数 void HAL_UART_IdleCallback(UART_HandleTypeDef *huart) {if(huart-Instance huart3.Instance){Modbus.Protocol_Analysis(UART3); // 接收数据解析HAL_UART_Receive_DMA(huart3, UART3.pucRec_Buffer, UART3_Rec_LENGTH); // 重新开启接收DMA在数据解析中会暂时关闭接收DMA} }5、Modbus 收发数据详解 1Modbus结构体 typedef struct {uint16_t addr;void (*Protocol_Analysis)(UART_t*); } Modbus_t;2Modbus接收数据整体框架 #define UART_Order_Index 8 #define FunctionCode_Read_Register 0x03 #define FunctionCode_Write_Register 0x06 #define UART3_Send_LENGTH 20 #define UART3_Rec_LENGTH 20static void Protocol_Analysis(UART_t* UART) {UART_t* const COM_UART UART;uint8_t i 0, Index 0;// 1、关闭接收HAL_UART_AbortReceive(huart3);// 2、整理接收数据for(i0; iUART3_Rec_LENGTH; i){if(Index 0){if(*(COM_UART-pucRec_Bufferi) ! Modbus.addr)continue;}*(COM_UART-pucRec_Buffer Index) *(COM_UART-pucRec_Buffer i);// 取7字节if(Index UART_Order_Index) break; Index;}// 4、校验码CRC_16.CRC_Value CRC_16.CRC_Check(COM_UART-pucRec_Buffer, 6);CRC_16.CRC_H (u_int8_t)(CRC_16.CRC_Value 8);CRC_16.CRC_L (u_int8_t)CRC_16.CRC_Value;if(((*(COM_UART-pucRec_Buffer6) CRC_16.CRC_L) (*(COM_UART-pucRec_Buffer7) CRC_16.CRC_H))||((*(COM_UART-pucRec_Buffer6) CRC_16.CRC_H) (*(COM_UART-pucRec_Buffer7) CRC_16.CRC_L))){//校验地址if((*(COM_UART-pucRec_Buffer0)) Modbus.addr){// 5、数据处理if((*(COM_UART-pucRec_Buffer1)) FunctionCode_Read_Register){Modbus_Read_Register(COM_UART);}else if((*(COM_UART-pucRec_Buffer1)) FunctionCode_Write_Register){Modbus_Wrtie_Register(COM_UART);} }}//清缓存for(i0;iUART3_Rec_LENGTH;i){*(COM_UART-pucRec_Bufferi) 0x00;} }Modbus_Read_Register函数数据解析协议数据地址码功能码数据长度(字节)发送数据CRC连续读取从设备寄存器值返回给主设备。 static void Modbus_Read_Register(UART_t* UART) {UART_t* const COM_UART UART;//校验地址if((*(COM_UART-pucRec_Buffer2) 0x9C) (*(COM_UART-pucRec_Buffer3) 0x41)){回应数据//地址码*(COM_UART-pucSend_Buffer0) Modbus.addr;//功能码*(COM_UART-pucSend_Buffer1) FunctionCode_Read_Register;//数据长度(字节)*(COM_UART-pucSend_Buffer2) 2;//发送数据// deep status*(COM_UART-pucSend_Buffer3) 0;*(COM_UART-pucSend_Buffer4) Deep.Read_Deep();*(COM_UART-pucSend_Buffer5) 0;*(COM_UART-pucSend_Buffer6) 0x66;//插入CRCCRC_16.CRC_Value CRC_16.CRC_Check(COM_UART-pucSend_Buffer,7); //计算CRC值CRC_16.CRC_H (uint8_t)(CRC_16.CRC_Value 8);CRC_16.CRC_L (uint8_t)CRC_16.CRC_Value;*(COM_UART-pucSend_Buffer7) CRC_16.CRC_L;*(COM_UART-pucSend_Buffer8) CRC_16.CRC_H;//发送数据UART3.SendArray(COM_UART-pucSend_Buffer,9);} } Modbus_Wrtie_Register函数数据解析。从主设备获取控制从设备外设的数值解析后控制外设。 static void Modbus_Wrtie_Register(UART_t* UART) {UART_t* const COM_UART UART;uint8_t i0;//回应数据for(i0;i8;i){*(COM_UART-pucSend_Bufferi) *(COM_UART-pucRec_Bufferi);}//发送数据UART3.SendArray(COM_UART-pucSend_Buffer,8);//解析数据控制外设if((*(COM_UART-pucRec_Buffer2) 0x9C) (*(COM_UART-pucRec_Buffer3) 0x42)){if(*(COM_UART-pucRec_Buffer5) Deep_Status_ON )Deep.Deep_Enable();elseDeep.Deep_Disable();} }为什么要使能DMA发送完成中断才会触发UART的发送完成中断 答案就在代码里带大家解析一遍相关代码 // 调用HAL_UART_Transmit_DMA函数实现DMA发送 HAL_UART_Transmit_DMA- huart-hdmatx-XferCpltCallback UART_DMATransmitCplt; // 设置发送完成回调函数static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma) {UART_HandleTypeDef *huart (UART_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)-Parent;/* DMA Normal mode*/if ((hdma-Instance-CCR DMA_CCR_CIRC) 0U){huart-TxXferCount 0x00U;/* Disable the DMA transfer for transmit request by setting the DMAT bitin the UART CR3 register */CLEAR_BIT(huart-Instance-CR3, USART_CR3_DMAT);/* Enable the UART Transmit Complete Interrupt */SET_BIT(huart-Instance-CR1, USART_CR1_TCIE); // 当DMA发送完成后会使能串口发送完成中断}/* DMA Circular mode */else{ #if (USE_HAL_UART_REGISTER_CALLBACKS 1)/*Call registered Tx complete callback*/huart-TxCpltCallback(huart); #else/*Call legacy weak Tx complete callback*/HAL_UART_TxCpltCallback(huart); #endif /* USE_HAL_UART_REGISTER_CALLBACKS */} }当DMA发送完成后会使能串口发送完成中断。配置打开UART3中断总开关。 HAL_UART_IRQHandler- if (((isrflags USART_SR_TC) ! RESET) ((cr1its USART_CR1_TCIE) ! RESET))- UART_EndTransmit_IT(huart);- HAL_UART_TxCpltCallback(huart); // 回调函数为弱函数可重构五、结果演示以及报文解析 实验测试使用USB转RS485工具。从设备板子上A B接口连接USB转RS485工具上对应A B接口。主设备为PC端安装的MThings进行Modbus收发数据测试。有兴趣的小伙伴可以体验下MTings官网 发送数据报文解析 [2023-03-05 13:13:03-802]COM34-发送01 06 9c 42 00 01 c6 4e [2023-03-05 13:13:03-827]COM34-接收01 06 9c 42 00 01 c6 4e 0x01主机要查询的从设备地址 0x06功能码 修改写操作 0x9c 0x42寄存器地址0x9c42转十进制地址为40,002 0x00 0x01写入地址的数值为0x01 控制从设备蜂鸣器打开 0xc6 0x4eCRC校验码 [2023-03-05 13:13:04-980]COM34-发送01 06 9c 42 00 00 07 8e [2023-03-05 13:13:05-012]COM34-接收01 06 9c 42 00 00 07 8e 0x01主机要查询的从设备地址 0x06功能码 修改写操作 0x9c 0x42寄存器地址0x9c42转十进制地址为40,002 0x00 0x01写入地址的数值为0x00 控制从设备蜂鸣器关闭 0xc6 0x4eCRC校验码 接收数据报文解析 [2023-03-05 13:41:54-954]COM34-发送01 06 9c 42 00 01 c6 4e [2023-03-05 13:41:54-977]COM34-接收01 06 9c 42 00 01 c6 4e 0x01从设备地址 0x06功能码 修改写操作 0x9c 0x42寄存器地址0x9c42转十进制地址为40,002 0x00 0x01写入地址的数值为0x00 控制从设备蜂鸣器关闭 0xc6 0x4eCRC校验码 [2023-03-05 13:41:56-289]COM34-发送01 03 9c 41 00 02 ba 4f 0x01主机要查询的从设备地址 0x03功能码 查询读操作 0x9c 0x42寄存器地址0x9c41转十进制地址为40,001 0x00 0x02读取两个数据一个数据2字节 0xba 0x4fCRC校验码 [2023-03-05 13:41:56-320]COM34-接收01 03 02 00 01 00 66 d9 a3 0x01告诉主机自己从设备地址 0x03功能码 读操作 0x00 0x01读出第一个数据为0x01当前蜂鸣器打开状态 0x00 0x66读取第二个数据为0x66该值是本猿在代码中写死的值后续功能会结合本章节modbus功能通信敬请期待 0xd9 0xa3CRC校验码
http://www.hkea.cn/news/14394933/

相关文章:

  • 在门户网站做推广内蒙古建设项目环保备案网站
  • 邯郸网站建设品牌公司微信网站建设报价表
  • 深圳商城网站哪家做的好保定网站网站建设
  • 怎么做自动下单网站网站如何设置微信支付功能
  • 个人做同城网站赚钱吗潍坊网站制作最低价格
  • 为什么就一个网站打不开含关键词的网站建设
  • 余姚做企业网站企业网站设计制作价格
  • 找论文的免费网站音乐网站要怎么做
  • ajax网站模板wordpress 百家号插件
  • 网站建设报价怎么差别那么大临沂网站制作案例
  • 网站域名服务错误六安人才网官网
  • 江苏建设部网站工程建设公司官网
  • 江西企业网站建设价格网站建设jnlongji
  • 网站整合营销wordpress+分页静态
  • 网站后台用户管理系统提供建议的网站模板
  • 地产项目网站北京网站备案拍照
  • 常州住房和城乡建设局网站苏州做网站多少钱
  • 阿里巴巴官网网站c2c模式的例子
  • 网站维护的具体方法网站改版后新版前台如何跟旧版后台链接
  • 建设网站需要云服务器吗wordpress怎么弄会员
  • 网站建设与推广协议书在线注册公司营业执照
  • 天河区门户网站教育局板块在线推广网站的方法有哪些
  • 网站备案 费用建设工程施工合同范文
  • mysql 视频网站开发深圳住房和建设局网站官网
  • 网站怎么更改关键词域名注册信息查询
  • 怎么打击对手网站排名齐鲁人才网泰安招聘
  • 玄武网站制作收费报价中山网站方案
  • shanxi建设银行网站首页做网站需要软件
  • 请详细说明网站开发流程及原则公司网站彩页怎么做
  • 电商扶贫网站建设自己创做网站