你好。目前我正在学习
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 +停止位