c++ - 从串口解码二进制数据
问题描述
我正在尝试通过 Raspberry Pi 上的串口与 Simplebgc 板通信。我正在向似乎正在工作的板上写命令,但我需要帮助解码二进制响应。当指南似乎添加到 18 时,为什么我得到 23 个轮空?我是 C 和二进制的新手。
void sendCommand() {
int fd;
if ((fd = serialOpen ("/dev/ttyS0", 115200)) < 0) {
//fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno));
cout<<"Unable to open serial device"<<endl;
return;
}
unsigned char motor_on[6] = {0x3E, 0x4D, 0x01, 0x4E,0x01, 0x01}; //MOTOR ON
unsigned char motor_off[6] = {0x3E, 0x6D, 0x01, 0x6E,0x01, 0x01}; //MOTOR OFF
unsigned char board_info[6] = {0x3E, 0x56, 0x01, 0x57, 0x01, 0x01}; //BOARD_INFO
serialFlush(fd);
// Send command to grab board info
write(fd, board_info, 6);
sleep(2);
// Read board response and print it
char c;
int counter = 0;
while (read(fd, &c, 1) == 1) {
//putchar(c); // print out char
printf("%d ",c);
counter++;
}
cout<<"\ncounter="<<counter<<endl;
sleep(5);
}
int main() {
sendCommand();
return 0;
}
输出:
pi@raspberrypi:~/myPrograms/SerialGPIOExamples/c++/SBGC_board $ ./serialSBGCTest 62 86 18 104 30 70 10 0 27 0 0 0 0 0 0 0 0 0 0 0 0 0 137 计数器=23
解决方案
响应是一条带有标题的消息:
消息格式
每个命令都由标头和正文组成,均带有校验和。应忽略具有错误标头或正文校验和或正文大小与预期不同的命令。解析器应扫描传入数据流中的下一个起始字符并尝试从中恢复同步。
Header:
Start Character 1u
Command ID 1u
Payload Size 1u
Header Checksum 1u
Body
18 bytes as defined by you.
Body Checksum 1u
这给了你 23 个字节。4 字节标头。身体。1 字节正文校验和。
推荐阅读
- javascript - javascript:尽管启用了cors,但拒绝访问跨域对象上的属性的权限
- regex - 如何获取逗号分隔字符串中的子字符串?
- javascript - 如何用正则表达式和 JavaScript 替换包含方括号的字符串
- r - 是否可以将 R 数据框导出到 CSV,组之间有空白行?
- codeigniter - 根据 Codeigniter 中的下拉值填充表单
- selenium-webdriver - 如何删除硒中的登录弹出窗口
- angular - 在 SpreadJS 事件绑定中没有抛出异常
- vue.js - 通用模式下的 Nuxt JS LocalStorage 不起作用
- r - 为什么assign()在for()循环中与R中的dplyr管道表现奇怪?
- python - 如何限制用户使用一个检查按钮检查 tkinter python