STM32F103C8T6,HAL库,RS485通讯,从机地址通用地址为 0x7E,并机使用时的从机地址为0x00-0x7d,校验和( 8 位)为校验和之前所有数据项累加和;所有数据低字节在前,高字节在后;包含主机发送命令格式,即帧头0x3A+从机地址+协议版本号0x01+读写标志+功能码1-255+数据长度(小于120)+数据内容(数据长度*1Byte)+8位CRC校验和。从机响应主机写/读命令格式,即帧头0x3B+从机地址+协议版本号0x01+读写标志+功能码(与主机相同)+数据长度(与主机相同)+数据内容(数据长度*1Byte)+8位CRC校验和。
时间: 2025-09-02 07:24:09 AIGC 浏览: 4
### 硬件连接
芯片STM32F103C8T6的封装是LQFP48,注意BOOT引脚接10K电阻,参考资料为STM32中文参考手册_V10和博客https://blog.csdn.net/sinat_40936062/article/details/95244689 [^2]。
### 软件实现
#### 1. 校验和计算
```c
// 计算8位校验和(累加和)
uint8_t calculateChecksum(uint8_t *data, uint8_t length) {
uint8_t sum = 0;
for (uint8_t i = 0; i < length; i++) {
sum += data[i];
}
return sum;
}
```
#### 2. 主机发送命令
```c
// 主机发送命令
void sendHostCommand(uint8_t slaveAddress, uint8_t readWriteFlag, uint8_t functionCode, uint8_t *data, uint8_t dataLength) {
uint8_t frame[128];
uint8_t index = 0;
// 帧头
frame[index++] = 0x3A;
// 从机地址
frame[index++] = slaveAddress;
// 协议版本号
frame[index++] = 0x01;
// 读写标志
frame[index++] = readWriteFlag;
// 功能码
frame[index++] = functionCode;
// 数据长度
frame[index++] = dataLength;
// 数据内容
for (uint8_t i = 0; i < dataLength; i++) {
frame[index++] = data[i];
}
// 计算校验和
uint8_t checksum = calculateChecksum(frame, index);
frame[index++] = checksum;
// 发送数据,这里假设使用UART发送
HAL_UART_Transmit(&huart1, frame, index, HAL_MAX_DELAY);
}
```
#### 3. 从机响应主机命令
```c
// 从机响应主机命令
void sendSlaveResponse(uint8_t slaveAddress, uint8_t readWriteFlag, uint8_t functionCode, uint8_t *data, uint8_t dataLength) {
uint8_t frame[128];
uint8_t index = 0;
// 帧头
frame[index++] = 0x3B;
// 从机地址
frame[index++] = slaveAddress;
// 协议版本号
frame[index++] = 0x01;
// 读写标志
frame[index++] = readWriteFlag;
// 功能码
frame[index++] = functionCode;
// 数据长度
frame[index++] = dataLength;
// 数据内容
for (uint8_t i = 0; i < dataLength; i++) {
frame[index++] = data[i];
}
// 计算校验和
uint8_t checksum = calculateChecksum(frame, index);
frame[index++] = checksum;
// 发送数据,这里假设使用UART发送
HAL_UART_Transmit(&huart1, frame, index, HAL_MAX_DELAY);
}
```
#### 4. 从机地址设置
从机地址可以设置为通用地址0x7E,或者在并联使用时设置为0x00 - 0x7D。在从机程序中,可以通过一个全局变量来存储从机地址,例如:
```c
uint8_t slaveAddress = 0x7E; // 默认从机地址
```
### 注意事项
- 数据字节顺序为低字节在前,高字节在后,在数据处理时需要注意。
- 数据长度需要小于120。
阅读全文
相关推荐















