串口协议代码示例加上注释
时间: 2023-07-27 07:10:16 浏览: 86
以下是一个简单的串口协议代码示例,加上了注释以方便理解:
```c
// 定义常量
#define START_BYTE 0x7E // 起始字节
#define END_BYTE 0x0D // 结束字节
// 定义结构体
typedef struct {
uint8_t start_byte; // 起始字节
uint8_t data_len; // 数据长度
uint8_t data[255]; // 数据
uint8_t crc; // 校验和
uint8_t end_byte; // 结束字节
} Packet;
// 计算校验和
uint8_t calcCRC(Packet *p) {
uint8_t crc = 0;
for (int i = 0; i < p->data_len; i++) {
crc += p->data[i];
}
return crc;
}
// 发送数据包
void sendPacket(Packet *p) {
// 发送起始字节
Serial.write(START_BYTE);
// 发送数据长度
Serial.write(p->data_len);
// 发送数据
for (int i = 0; i < p->data_len; i++) {
Serial.write(p->data[i]);
}
// 发送校验和
Serial.write(p->crc);
// 发送结束字节
Serial.write(END_BYTE);
}
// 接收数据包
bool recvPacket(Packet *p) {
// 等待起始字节
while (Serial.read() != START_BYTE) {}
// 读取数据长度
p->data_len = Serial.read();
// 读取数据
for (int i = 0; i < p->data_len; i++) {
p->data[i] = Serial.read();
}
// 读取校验和
p->crc = Serial.read();
// 读取结束字节
p->end_byte = Serial.read();
// 检查起始字节和结束字节
if (p->start_byte != START_BYTE || p->end_byte != END_BYTE) {
return false;
}
// 检查校验和
if (p->crc != calcCRC(p)) {
return false;
}
return true;
}
```
上述代码中,我们定义了一个结构体 `Packet`,用于表示一个数据包。数据包包含起始字节、数据长度、数据、校验和和结束字节。我们还定义了函数 `calcCRC`,用于计算校验和;函数 `sendPacket`,用于发送数据包;函数 `recvPacket`,用于接收数据包。在 `recvPacket` 函数中,我们使用了一个 `while` 循环来等待起始字节,并使用 `Serial.read()` 函数读取数据。最后,我们检查了起始字节、结束字节和校验和,以确保接收到的数据是正确的。
阅读全文