c++ - 如何在 Mac 插件中使用 ioctl() 设置 RTS?

标签 c++ macos plugins serial-port ioctl

我可以在一个小型终端应用程序中使用 ioctl 设置 RTS,但不能在我的 Mac 插件代码中设置,尽管两者都运行相同的代码。在插件中,我只能“获取”串行端口标志/引脚,但不能“设置”它们。在终端应用程序中,我可以“获取”和“设置”它们。我得到了 ENODEV 的 errno。错误号是 19,消息是“设备不支持操作。”

如果这是一个安全问题(在浏览器的上下文中),是否有办法获得使用 ioctl 修改标志的权限?我有一个连接到 USB 端口的串行设备。我正在使用 FTDI vcp(虚拟 com 端口)驱动程序。 Windows 端的一切都很顺利。顺便说一句,我使用 Safari 和 Firefox 得到了相同的结果。以下是我的代码:

int disableRTS ()
{
    char fd, ret, flags;

    // open device
    if ((fd = open("/dev/cu.mydevice", O_RDWR | O_NDELAY)) < 0)
    {
        fprintf(stderr, "failed to open device");
        return -1;
    }

    // Get the current state of the bits
    ioctl(fd, TIOCMGET, &flags);
    fprintf(stderr, "Flags are %x.\n", flags);    

    flags &= ~TIOCM_RTS;  // Disable the RTS bit
    ret = ioctl(fd, TIOCMSET, &flags);

    if (ret == -1)
        fprintf(stderr, "TIOCMSET failed\n");
    else
        fprintf(stderr, "TIOCMSET succeeded. flags: %x.\n", flags);

    return 0;
}

=========

更新

如果我刷新浏览器页面,强制再次执行代码,ioctl()返回0,表示成功。不幸的是,我需要它第一次工作。即使我使用 usleep() 方法编写一个循环并暂时暂停,并进行后续尝试,它也会失败。但是,当我刷新它成功时。我还在 Mozilla 提供的第二个专门的 NPAPI 项目“BasicPlugin.xcodeproj”中复制了这个问题。我的第一个插件项目是 Firebreath 项目。他们都首先失败,然后在页面重新加载时成功。我还有 2 个独立的 Mac 应用程序可以正常工作。一种是 SerialTools,它使用与我的终端应用程序和插件完全相同的方法来设置 RTS 开启(和 DTR 关闭)。

========

更新 2

我已经获得了 Apple 对此的代码级支持,因此可能即将推出解决方案。工程师说,代码在插件中的运行方式与在插件之外的方式不同,这“很奇怪”,并且正在与 Safari 插件工程师交谈。

最佳答案

您可以制作一个 AppleScript 插件,该插件将在特定时间或登录期间自动运行,或在后台持续运行。

AppleScript 可以运行终端代码。因此,您可以轻松地让它自动运行您当前在终端中运行的获取/设置代码。

AppleScript 插件的代码将是这样的::

tell application "Finder"
    display dialog explanation buttons {"GET", "SET"} default button "GET"
    if result = {button returned:"GET"} then
        tell application "Terminal"
                 set status to (do shell script "terminal code for getting the RTS here")
            end tell
    else if result = {button returned:"SET"} then
            tell application "Terminal"
                 set status to (do shell script "terminal code for setting the RTS here")
            end tell
    end if
end tell 

关于c++ - 如何在 Mac 插件中使用 ioctl() 设置 RTS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14693724/

相关文章:

c++ - 从函数返回指向二维数组的指针 - C++

c++ - 如何在 Windows 和 Mac 上提供原生用户界面?

c++ - MacOS 10.12 上的 getopt

python - 如何将 Composer 项目发送到 QGIS 底部?

c# - .NET 动态 DLL 加载和安全

c++ - 编译器无法推断出 std::max 的重载

c++ - CPropertySheet 只显示一秒钟

c++ - 可变参数模板上的变换算法

sql-server - 将 DbVisualizer 与 Azure SQL 结合使用的数据库驱动程序是什么?

java - 是否可以在android中捕获屏幕截图并将其保存到统一的图库中