0

boost::asio::serialport の適切な代替手段である優れたシリアル通信ライブラリを知っている人はいますか?

Boost::Asio::SerialPort は 31250 のような非標準のボーレートをサポートしていないようです(Boost 1.48.0 を使用する Mac OS 10.6 では確実に動作しないようです)。

少なくとも Mac OS X と Windows で動作するライブラリが必要です

4

3 に答える 3

2

最も簡単な回避策は、適切なデバイスの asio::serial_port インスタンスを作成してから、serial_port.native_native() を呼び出し、返されたハンドルを使用して ioctl() または SetCommState() を呼び出して速度を設定することです。

そうすれば、回線速度の設定以外のすべてに asio を使用でき、最小限の特別なコードで必要な回線速度を取得できます。

このコードはオペレーティング システムごとに特別なものにする必要がありますが、少なくとも他のすべては共通です。

ただし、参照するバグは、特定のバージョンの Linux/glibc での特定の回避策に関するものです。Windows と OSX でもこの問題が発生していますか?

于 2012-02-20T22:01:55.323 に答える
1

ioctl と termios を使用して、ボー レートとシリアル ポート パラメータを直接制御できます。それほど難しいことではありません。

単純なシリアル ポートのみが必要で、非同期 IO コンポーネントが不要な場合は、https ://github.com/wjwwood/serial を試すことができます。これは、私の友人が彼のプロジェクトのために書いたライブラリです。必ずboostless支店をご利用ください。OS X ドライバーがカスタム ボー レートをサポートしていることは知っています。それらをテストしたところ、カスタム ボー レートは Linux でも動作するはずです。現在 Windows をサポートしていないため、Windows のサポートが必要な場合、現時点ではあまり役に立ちません。

ioctl と termios のみを使用する場合は、次のようにします。

#define IOSSIOSPEED _IOW('T', 2, speed_t)
int new_baud = static_cast<int> (baudrate_);
ioctl (fd_, IOSSIOSPEED, &new_baud, 1);

また、OS X でボーレートを任意の値に設定できますが、これは OS 固有です。Linux の場合は、次のことを行う必要があります。

struct serial_struct ser;
ioctl (fd_, TIOCGSERIAL, &ser);
// set custom divisor
ser.custom_divisor = ser.baud_base / baudrate_;
// update flags
ser.flags &= ~ASYNC_SPD_MASK;
ser.flags |= ASYNC_SPD_CUST;

if (ioctl (fd_, TIOCSSERIAL, ser) < 0)
{
  // error
}

他のOSの場合は、いくつかのマニュアルページを読む必要があります。そうしないと、まったく機能しない可能性があり、OSに大きく依存します。

于 2012-02-20T19:40:40.110 に答える
1

それが MIDI ボーレートです。楽器ベンダーからハードウェアを購入することを余儀なくされるように最適化されたレートとして、常に私を驚かせました. 最初にハードウェアを購入します。通常、ソフトウェアは付属しています。したがって、素敵な Apple マシンに対してこれを行うことはありません。

ここに画像の説明を入力

于 2012-02-20T18:59:37.163 に答える