1

QtSerialPort を使用するこの単純なコードがあります。

char foo[] = {130,50,'\0'};
serial->write(foo);

私のシリアルの結果は {2, 50} です。私が送信できる最大数は 128 だと思います (文字は -128 から 128 に移動します)。0から255までの番号を送信する方法はどこにありますか? unsigned char を使用しようとしましたが、「書き込み」メソッドが機能しません。QByteArray でも同じ問題が発生します。

皆さん、ありがとうございました。

4

2 に答える 2

1

QIODevice インターフェイスには、コンパイラに依存する可能性がある送信用のデフォルトの文字があります。詳細については、ドキュメントを参照してください。

qint64 QIODevice::write(const char * data, qint64 maxSize)

最大 maxSize バイトのデータを data からデバイスに書き込みます。実際に書き込まれたバイト数を返します。エラーが発生した場合は -1 を返します。

ただし、一方でデータをきちんと取っていれば、あまり気にする必要はありません。128 を超える値を符号付きで送信することはできますが、それらは負の値として表示されます。たとえば、0xFF は -1 になります。

受信側で同じロジックを逆の順序で実行しても、問題はないはずです。

ただし、130 に対応する負の値が得られず、7 ビットで切り刻まれるため、これは問題に関連していないようです。接続が8データビットであることを確認してください。

次のコードでポートを開いた後、明示的に設定できます。

QSerialPort serialPort;
QString serialPortName = "foo";
serialPort.setPortName(serialPortName);

if (!serialPort.open(QIODevice::WriteOnly)) {
    standardOutput << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
    return 1;
}   

if (!serialPort.setDataBits(QSerialPort::Data8)) {
    standardOutput << QObject::tr("Failed to set 8 data bits for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
    return 1;
} 

// Other setup code here

char foo[] = {130,50,'\0'};
serialPort.write(foo);
于 2014-01-06T09:46:10.610 に答える
1

Make sure you've set the serial port to send 8 bits, using QSerialPort::DataBits

The fact that '130' is coming as '2' implies that the most significant bit is being truncated.

于 2014-01-06T09:47:55.837 に答える