C++ 从串行端口解码二进制数据
我正在尝试通过Raspberry Pi上的串行与Simplebgc板通信。我正在写命令到董事会,这似乎是工作,但我需要帮助解码二进制响应。为什么我会得到23个“是”,而指南似乎加了18个?我对C和二进制都是新手C++ 从串行端口解码二进制数据,c++,raspberry-pi,serial-port,binary-data,C++,Raspberry Pi,Serial Port,Binary Data,我正在尝试通过Raspberry Pi上的串行与Simplebgc板通信。我正在写命令到董事会,这似乎是工作,但我需要帮助解码二进制响应。为什么我会得到23个“是”,而指南似乎加了18个?我对C和二进制都是新手 void sendCommand(){ int-fd; 如果((fd=serialOpen(“/dev/ttyS0”,115200))
void sendCommand(){
int-fd;
如果((fd=serialOpen(“/dev/ttyS0”,115200))<0){
//fprintf(stderr,“无法打开串行设备:%s\n”,strerror(errno));
cout响应是一条带有标题的消息:
消息格式
每个命令都由标题和正文组成,两者都带有校验和。标题错误的命令
或正文校验和,或正文大小与预期不同的,应忽略。解析器应扫描
下一个开始字符的传入数据流,并尝试从中恢复同步
这将为您提供23字节。4字节标头。正文。1字节正文校验和。您的调试输出完全无用。您正在打印一长行数字,但您不知道从电路板收到的数字是多少。例如,628
-您收到了6,后跟28,62后跟8还是6后跟2后跟8?什么是否正确执行此操作?更新了我的问题。是否%d应按照手册中的规定正确打印十进制数字?这现在是有意义的。如果值为2u,例如固件版本,我是否需要进行位移位,因为它似乎是错误的。
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;
}
Header:
Start Character 1u
Command ID 1u
Payload Size 1u
Header Checksum 1u
Body
18 bytes as defined by you.
Body Checksum 1u