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

发布于 2025-01-07 13:16:45 字数 266 浏览 1 评论 0原文

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

Boost::Asio::SerialPort 似乎不支持非标准波特率 - 像 31250 (它似乎绝对不能在带有 boost 1.48.0 的 Mac OS 10.6 上工作)

我需要该库至少在 Mac OS X 和 Windows 上工作

Does anybody know of a good serial communication library that is a decent alternative to boost::asio::serialport?

Boost::Asio::SerialPort does not seem to support non-standard baud rates - like 31250 (it definitely does not seem to work on Mac OS 10.6 with boost 1.48.0)

I need the library to work on a minimum of Mac OS X and Windows

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烛影斜 2025-01-14 13:16:45

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

这样你就可以使用 asio 来做除了设置线速度之外的所有事情,并且你可以用最少的特殊代码获得你想要的线速度。

您需要此代码对于每个操作系统都是特殊的,但至少其他一切都是通用的。

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

The easiest workaround is to create the asio::serial_port instance for the appropriate device, and then call serial_port.native_native() and use the returned handle to call ioctl() or SetCommState() to set the speed.

That way you can use asio for everything except setting the line speed, and you can get the line speed you want with minimal special code.

You will need this code to be special for each operating system, but at least everything else is common.

However: The bug you reference is for a specific workaround on a specific version of Linux/glibc. Are you having this problem on Windows and OSX as well?

耳根太软 2025-01-14 13:16:45

这就是 MIDI 波特率。一直让我印象深刻的是,价格经过优化,以确保您被迫从乐器供应商那里购买硬件。首先购买硬件,通常会附带软件。所以你最终不会对你漂亮的 Apple 机器执行此操作:

在此处输入图像描述

That's the MIDI baudrate. Always struck me as a rate optimized to ensure you're forced to buy hardware from the music instrument vendors. Shop for the hardware first, the software usually comes with it. So you don't end up doing this to your nice Apple machine:

enter image description here

呆萌少年 2025-01-14 13:16:45

可以使用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
}

对于任何其他操作系统,你必须去阅读一些手册页,否则它甚至可能根本无法工作,它非常依赖于操作系统。

You can use ioctl and termios to directly control the baud rate and serial port parameters. Its not terribly difficult.

If you only need a simple serial port and do not need the asynchronous IO components you can try: https://github.com/wjwwood/serial its a library a friend of mine wrote for some of his projects. Be sure to use the boostless branch. I know the OS X drivers support custom baud rates, I have tested those, and custom baud rates should work in Linux as well. It doesn't currently support Windows, so if you need Windows support, its won't be much help at the moment.

If you only want to use ioctl and termios you can do:

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

And it will let you set the baud rate to any value in OS X, but that is OS specific. for Linux you need to do:

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
}

For any other OS your gonna have to go read some man pages or it might not even work at all, its very OS dependent.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文