Boost :: Asio :: SerialPort替代方案,支持非标准波特率?

时间:2012-02-20 18:15:44

标签: c++ boost cross-platform serial-port baud-rate

有没有人知道一个好的串行通信库,它是boost :: asio :: serialport的一个不错的替代品?

Boost::Asio::SerialPort does not seem to support non-standard baud rates - 就像31250一样(它肯定不适用于Mac OS 10.6,提升1.48.0)

我需要这个库才能在最低限度的Mac OS X和Windows上运行

3 个答案:

答案 0 :(得分:1)

这是MIDI波特率。总是让我印象深刻,以确保您被迫从乐器供应商处购买硬件。首先购买硬件,软件通常随附。因此,您最终不会对您的Apple机器这样做:

enter image description here

答案 1 :(得分: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中的任何值,但这是特定于操作系统的。对于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
}

对于任何其他操作系统,您将不得不阅读一些手册页,或者它甚至可能根本不工作,它依赖于操作系统。

答案 2 :(得分:1)

最简单的解决方法是为相应的设备创建asio :: serial_port实例,然后调用serial_port.native_native()并使用返回的句柄调用ioctl()或SetCommState()来设置速度。

这样你除了设置线速度之外你可以使用asio,你可以用最少的特殊代码获得你想要的线速度。

您将需要此代码对每个操作系统都是特殊的,但至少其他一切都很常见。

但是:您引用的错误是针对特定版本的Linux / glibc的特定解决方法。您是否在Windows和OSX上遇到此问题?