干货|手把手带你搞懂Modbus通信协议-腾讯云开发者社区-腾讯云干货|手把手带你搞懂Modbus通信协议-腾讯云开发者社区-腾讯云
大致分为以下几种:
- Modbus-RTU
- Modbus-ASCII
- Modbus-TCP
以上三种协议,一个设备只会有一种协议,如果你的设备使用的是Modbus-RTU,只需查看以下对应部分,一般来说大部分的设备都是Modbus-RTU协议的。
Modbus通讯时规定主机久再发送下一组新命令,这个命令(数据)已结束。
翻译中
组命令必须间隔3.5个字符主要用来告诉其他设备这次命令已经发送完了
类似于句号。断句
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM1) // TIM1定时器中断(1ms周期)
{
if(modbus.time_run == 1) // 检查MODBUS接收超时定时器是否运行
{
modbus.timeout ++; // 超时计数器递增
if(modbus.timeout >= 7) // 超时时间达到7ms(MODBUS帧间隔超时)
{
modbus.rx_flag = 1; // 设置接收完成标志,通知主程序处理数据
modbus.time_run = 0; // 关闭定时器运行
}
}
}
检测MODBUS的初始通讯
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART3) // 检查是否为USART3中断
{
if(modbus.rx_flag == 1) // 如果正在处理上一帧数据,则忽略新数据
{
return ; // 直接返回,等待主程序处理完当前帧
}
// 将接收到的字符存入MODBUS接收缓冲区
modbus.modbus_buf[modbus.modbus_count ++] = ch;
modbus.timeout = 0; // 重置超时计数器
if(modbus.modbus_count == 1) // 如果是本帧的第一个字节
{
modbus.time_run = 1; // 启动超时定时器
}
// 重新启动串口接收中断,等待下一个字符
HAL_UART_Receive_IT(&huart3,&ch,1);
}
}
将发送来的数据转存MODBUS接收缓冲区并开始重新接收流程
