gpt4 book ai didi

C++ libserial 跳过 0x09

转载 作者:行者123 更新时间:2023-11-28 06:15:47 25 4
gpt4 key购买 nike

我正在尝试通过串行方式从通过 Mavlink 协议(protocol)通信的 Pixhawk 飞行 Controller 读取数据。它发送 17 个字节,前三个是 0xFE、0x09,后面是一个递增每条消息的计数器。我已经用 GtkTerm 确认了这一点。

但是,当我运行以下代码时,总是会跳过 0x09(第二个字节),因此每条 17 字节的消息中只收到 16 字节。

有什么想法吗?谢谢,詹姆斯。

LibSerial::SerialStream pixhawkSerial;

pixhawkSerial.Open("/dev/ttyACM0");

pixhawkSerial.SetBaudRate( LibSerial::SerialStreamBuf::BAUD_57600 ) ;

pixhawkSerial.SetCharSize( LibSerial::SerialStreamBuf::CHAR_SIZE_8 );

pixhawkSerial.SetNumOfStopBits(1);

pixhawkSerial.SetParity( LibSerial::SerialStreamBuf::PARITY_NONE ) ;

pixhawkSerial.SetFlowControl( LibSerial::SerialStreamBuf::FLOW_CONTROL_NONE );

char next_byte [100];
int i = 0;
while (i<100){
if( pixhawkSerial.rdbuf()->in_avail() > 0 ){
pixhawkSerial >> next_byte[i];
i++;
}
else cout << "No data" << endl;
}

最佳答案

无法让 libserial 工作,但我试了一下 temios,它没有问题地工作。

附件是工作代码。

int fd;
struct termios oldAtt, newAtt;
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY);

tcgetattr(fd, &oldAtt);
memset(&newAtt, 0, sizeof(newAtt));
newAtt.c_cflag = CRTSCTS | CS8 | CLOCAL | CREAD;
newAtt.c_iflag = IGNPAR;
newAtt.c_ispeed = B57600;
newAtt.c_oflag = 0;
newAtt.c_ospeed = B57600;
newAtt.c_lflag = 0;

newAtt.c_cc[VTIME] = 0;
newAtt.c_cc[VMIN] = 1;

tcflush(fd, TCIOFLUSH);
tcsetattr(fd, TCSANOW, &newAtt);

char rBuffer;
char next_byte [100];
int i=0;
int dataReceived;

while (i<100) {
dataReceived = read(fd,&rBuffer,1);
if (dataReceived>0){
next_byte[i] = rBuffer;
i++;
}
}

tcsetattr(fd,TCSANOW,&oldAtt);
close(fd);

关于C++ libserial 跳过 0x09,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30350585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com