0

Mavlink プロトコルを介して通信する Pixhawk フライト コントローラからシリアル経由でデータを読み取ろうとしています。17 バイトを送信します。最初の 3 つは 0xFE、0x09 で、その後にメッセージごとにインクリメントするカウンターが続きます。これは GtkTerm で確認済みです。

ただし、次のコードを実行すると、0x09 (2 番目のバイト) は常にスキップされるため、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;
}
4

1 に答える 1

1

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);
于 2015-05-23T11:14:29.537 に答える