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

这就是 MIDI 波特率。总是让我印象深刻,因为它优化了价格,以确保您被迫从乐器供应商处购买硬件。首先购买硬件,软件通常附带它。所以你最终不会对你漂亮的苹果机器这样做:

在此处输入图像描述

于 2012-02-20T18:59:37.163 回答
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
}

对于任何其他操作系统,您都必须阅读一些手册页,否则它甚至可能根本不起作用,它非常依赖于操作系统。

于 2012-02-20T19:40:40.110 回答