C++ OSX上用于高波特率串行的Boost ASIO
我使用Boost的ASIO类进行串行通信。我想在OSX系统上以1M波特率运行它。每当我试图将波特率设置为高于115200的标准值时,就会出现异常C++ OSX上用于高波特率串行的Boost ASIO,c++,macos,boost,serial-port,boost-asio,C++,Macos,Boost,Serial Port,Boost Asio,我使用Boost的ASIO类进行串行通信。我想在OSX系统上以1M波特率运行它。每当我试图将波特率设置为高于115200的标准值时,就会出现异常 boost::asio::serial_port m_port; baudrate = 1000000; try { m_port.open(serial_port_path); } catch (boost::system::system_error::exception e) { // ... } try { m_port.set_o
boost::asio::serial_port m_port;
baudrate = 1000000;
try {
m_port.open(serial_port_path);
} catch (boost::system::system_error::exception e) {
// ...
}
try {
m_port.set_option(boost::asio::serial_port_base::baud_rate(baudrate));
} catch (boost::system::system_error::exception e) {
// Tripped here on OS X
}
我正在运行OS X(约塞米蒂),并通过自制软件安装了Boost。我在linux虚拟机(运行在我的OSX系统之上)上测试了我的代码,它运行得很好
有没有办法使Boost在OS X中支持更高的波特率?您可以使用
本机句柄()
方法获取端口的文件描述符,然后使用tcsetattr()
函数设置任意速度。我怀疑Linux将B1000000
定义为预处理器对速度的定义,而OSX没有
更新:
如何执行此操作的快速示例(仅键入,未测试):
#包括
无效设置速度(boost::asio::串行端口和p,无符号速度)
{
termios t;
int fd=p.native_handle();
if(tcgetattr(fd,&t)<0){/*句柄错误*/}
如果(cfsetspeed(&t,speed)<0{/*句柄错误*/}
if(tcsettr(fd,&t)<0{/*句柄错误*/}
//速度变化
}
使用tcsetattr()
我现在可以让它运行到921600波特,这应该足够接近我的应用程序。1000000波特率仍然失败,tcsetattr()
返回-1,errno表示参数无效。如果在第二天左右没有更好的事情发生,我会把这个作为答案。谢谢遇到同样的问题,您能否通过tcsetattr()
?@PacificStickler更新分享设置速度的示例命令,希望对您有所帮助。
#include <termios.h>
void set_speed(boost::asio::serial_port& p, unsigned speed)
{
termios t;
int fd = p.native_handle();
if (tcgetattr(fd, &t) < 0) { /* handle error */ }
if (cfsetspeed(&t, speed) < 0) { /* handle error */ }
if (tcsetattr(fd, &t) < 0) { /* handle error */ }
// Speed changed
}