我试图从一个Pixhawk飞行控制器上读取数据,该控制器通过Mavlink协议进行通信。它发送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;
}发布于 2015-05-23 11:14:29
无法让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);https://stackoverflow.com/questions/30350585
复制相似问题