ST意法半导体
直播中

崔映芬

7年用户 947经验值
私信 关注
[问答]

怎样通过UART发送modbus写入保持寄存器消息呢

你好。目前我正在学习STM32和UART。我已经配置了 UART4,并且正在发送各种数据。我在 RX 和 TX 引脚上连接了逻辑分析仪,我正在监视信号。
我使用以下功能通过 UART 发送 modbus 写入保持寄存器消息:
我发送的数据:
0x01 0x06 0x0004 0x1234 0x7CC5
  • uint8_t MODBUS_write_holding(uint8_t slave_id,uint16_t start_address,uint16_t value){
  •         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, 1); // ENABLE THE TRANSCEIVER
  •         uint8_t message_buffer[20];
  •         message_buffer[0] = slave_id;
  •         message_buffer[1] = WRITE_SINGLE_HOLDING;
  •         message_buffer[2] =  ((uint16_t)start_address >> 8) & 0xFF;
  •         message_buffer[3] = ((uint16_t)start_address >> 0) & 0xFF;
  •         message_buffer[4] =  ((uint16_t)value >> 8) & 0xFF;
  •         message_buffer[5] = ((uint16_t)value >> 0) & 0xFF;
  •         uint16_t crc = MODBUS_CRC16_v3(message_buffer,6);
  •         message_buffer[6] = ((uint16_t)crc >> 0) & 0xFF;
  •         message_buffer[7] = ((uint16_t)crc >> 8) & 0xFF;
  • /*
  •         for(int i = 0; i <8;i++){
  • printf("message_buffer[%i]=%02x
    ",i,message_buffer);
  •         }
  •         printf("CRC calculated = %02x
    ",crc);
  • */
  •         HAL_UART_Transmit(&huart4, message_buffer, 8, 10);
  •         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, 0); // DISABLE THE TRANSCEIVER
  •         return 0;
  • }

我在 main.c 中调用函数:
  • MODBUS_write_holding(1,4,0x1234);
当我在信号分析仪上监视信号时,我看到以下内容:

我有一个愚蠢的问题:
据我了解,默认情况下,STM32 UART 中的数据首先传输 LSB。但是,我很难理解的是为什么我需要反向读取位,例如:
如果我从左到右读取位,我会得到以下信息:
1000 0000 +停止位
0110 0000 +停止位
ETC....
而实际上我发送:
0000 0001 +停止位
0000 0110 +停止位




回帖(1)

张丽

2022-12-7 10:25:29
1 位是数据字节的 LSB,它按时间顺序首先发送到线上。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分