Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OSX上用于高波特率串行的Boost ASIO_C++_Macos_Boost_Serial Port_Boost Asio - Fatal编程技术网

C++ OSX上用于高波特率串行的Boost ASIO

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类进行串行通信。我想在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_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
}