STM32L4 Modbus串口中断轮询接收

1.中断接收轮询函数

1.1.数据类型

uint8_t UART2_RxBuffer[20];//串口接收缓冲变量
uint8_t AddrFlag;//地址标志
uint8_t CodeFlag;//操作码标志
uint8_t CrcFlag;//校验标志
uint8_t SendFlag;//返回帧发送标志
uint8_t uart2_rx_flag = 0;//串口完全接收标志

下侧函数不公开仅提供思路

ModbusAddrJudge:地址判断
ModbusOptCodeJudge:操作码判断
ModbusRecvCrcJudge:CRC16校验判断
ModbusReturnBuilder:返回帧生成

1.2.详细函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart == &huart2){
    uart2_rx_flag = 1;
  }
}
void Uart2_RecvPoll(void)
{
  static uint32_t tick=0;
  uint32_t t=HAL_GetTick();
  if(t - tick >= 10)
  {
    tick = t;
     if(uart2_rx_flag)
    {
        uart2_rx_flag = 0;
        HAL_UART_Receive_IT(&huart2, UART2_RxBuffer, 8);
        AddrFlag = ModbusAddrJudge(UART2_RxBuffer);
        CodeFlag = ModbusOptCodeJudge(UART2_RxBuffer);
        CrcFlag = ModbusRecvCrcJudge(UART2_RxBuffer);
        if(AddrFlag){
          if(CodeFlag)
          {
            if(CrcFlag)
            {
              SendFlag = ModbusReturnBuilder(UART2_RxBuffer);
              //可添加自定义函数
              
            }
          }
        }
        memset(ReturnOrder, 0, UART_RXBUFFER_SIZE);
        memset(UART2_RxBuffer, 0, UART_RXBUFFER_SIZE);
        AddrFlag = 0;
        CodeFlag = 0;
        CrcFlag = 0;
        SendFlag = 0;
    }
  }
}

2.基于RS485的Modbus协议

RS485虽然历史有点久远,但是稳定性和便携性是No.1。

2.1.数据帧

操作码功能描述
0x03读取数据
0x06写入数据
  1. 读取数据帧(下面是读取四个继电器的状态):
地址码操作码起始高起始低数量高数量低校验高校验低
0303010000044417
  1. 应答帧:
地址码操作码数据数数据高数据低数据高数据低校验高校验低
03030400000100D863

3.写入数据帧(下面是写入从机地址):

地址码操作码地址高地址低数值高数值低校验高校验低
0306003100011827

4.应答帧:

地址码操作码地址高地址低数值返回校验高校验低
0303003101B414

2.2.Modbus 收发逻辑

不同从机设备通过分配十六进制的地址码来区分设备

1发送查询帧
2发送查询帧
3发送查询帧
3发送应答帧
2发送应答帧
1发送应答帧
Modbus主机
Modbus从机1
Modbus从机2
Modbus从机3

3.总结

说着简单,实际做要细心把逻辑干到位,继续加油。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AzusaFighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值