c++ - 在 MacOS 上写入串行端口时出现问题
问题描述
背景
我正在尝试在 MacOS Mojave 上写入/打印到串行端口。串行端口连接到具有 ESC/POS 仿真功能的热敏打印机。我已经boost::asio::serial_port
从boost 1.67.0
这个任务中使用过。请参阅以下代码:
#define SUCCESS 0
#define FAIL -1
#include <string>
#include <cstdio>
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/serial_port.hpp>
int main(int argc, char *argv[]){
boost::system::error_code ec;
boost::asio::io_service io;
boost::asio::serial_port port( io );
std::string portname="/dev/tty.usbserial-12";
try{
port.open(portname.c_str(), ec);
if (ec) {
std::cout << "error : port.open() failed... portname=" << portname << ", e=" << ec.message().c_str() << std::endl;
return FAIL;
}
port.set_option( boost::asio::serial_port_base::baud_rate( 19200 ) );
unsigned char init[2] = { 27, 64 };
unsigned char hello[6] = { 'h', 'e', 'l', 'l', 'o', '\0'};
unsigned char cut[2] = { 29, 86 };
boost::asio::write(port, boost::asio::buffer(init, sizeof(init)));
boost::asio::write(port, boost::asio::buffer(hello, sizeof(hello)));
boost::asio::write(port, boost::asio::buffer(cut, sizeof(cut)));
port.close();
return SUCCESS;
}catch(...){
return FAIL;
}
}
编辑 1
我尝试在以下代码段中使用 FileDescriptor:
int fd; //Descriptor for the port
fd = open("/dev/tty.usbserial-12", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd == -1) {
std::cout << "Unable to open port. \n";
return FAIL;
}
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B19200);
cfsetospeed(&options, B19200);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_oflag &= ~OPOST;
options.c_cflag |= CS8;
options.c_cflag |= (CLOCAL | CREAD);
tcsetattr(fd, TCSANOW, &options);
std::cout << "Port configured.\n";
unsigned char init[2] = { 27, 64 };
unsigned char hello[6] = { 'h', 'e', 'l', 'l', 'o', '\0'};
unsigned char cut[2] = { 29, 86};
int rv = FAIL;
rv = write(fd, init, 2);
if(rv<SUCCESS){
std::cout << "could not write" << std::endl;
return FAIL;
}
rv = write(fd, "hello\n", 6);
if(rv<SUCCESS){
std::cout << "could not write" << std::endl;
return FAIL;
}
rv = write(fd, cut, 2);
if(rv<SUCCESS){
std::cout << "could not write" << std::endl;
return FAIL;
}
std::cout << "closing FD" << std::endl;
close(fd);
return SUCCESS;
上一个片段的控制台输出:
Port configured.
closing FD
不幸的是,设备端没有错误也没有输出。
编辑 1 结束
我可以通过检查将其连接到我的 Mac 之前和之后ls /dev/tty.usbserial*
的输出来确认 MacOS 拾取连接的串行端口。ls /dev/cu.usbserial*
此外,如果我运行screen /dev/tty.usbserial-12 19200
然后运行我的应用程序,我会收到一条错误消息,指出resource busy
.
在网上搜索时,我遇到了一个SimpleSerial
在文件顶部写有以下注释的实现:
重要提示:在 Mac OS X boost asio 的串行端口有错误,并且此类的通常实现不起作用。因此临时编写了一个解决方法类,直到 asio(希望)修复串行端口的 Mac 兼容性。请注意,与 OS X 文档中所说的不同,直到 asio 将被修复,串行端口写入不是异步的,但至少异步读取有效。此外,串口打开忽略以下选项:奇偶校验、字符大小、流、停止位,默认为 8N1 格式。我知道这很糟糕,但至少总比没有好。
我尝试在线搜索以确认存在已知错误,但找不到相关错误。
问题
上面的代码执行没有任何错误,但由于我不知道的原因,在打印机上没有输出。我可以使用screen /dev/tty.usbserial-12 19200
.
相同的代码在运行 raspbian 的 Raspberry PI 上工作,并在打印机上产生所需的输出。
问题
我的代码有什么问题吗?我是否错过了一些步骤?我该如何解决这个问题?
解决方案
推荐阅读
- python - Adwords API OperationAccessDenied.ADD_OPERATION_NOT_PERMITTED
- php - PHP 邮件 - 在 html 邮件中使用 php 字符串
- charts - Flutter - 使用 json 迭代图表
- mongodb - 更新数组中的项目,出现错误“位置运算符未从查询中找到所需的匹配项。”
- ios - 在 tableview 中填充数组字典的高效和干净的方法
- javascript - 在量角器茉莉花测试中从浏览器获取警报测试后继续循环
- android - 如何为 ImageView/FrameLayout 做一个特殊的圆角形状?
- excel - Excel:具有相关长度变化参考的下拉列表自发地参考
- java - 背景模式android oreo ionic
- json - 如何计算结构或 JSON 文档中的属性数量?