首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Mac插件中使用ioctl()设置RTS?

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

Stack Overflow用户
提问于 2013-02-05 03:08:16
回答 2查看 1.4K关注 0票数 16

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

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

代码语言:javascript
复制
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项目。它们都在一开始失败,然后在页面重新加载时成功。我也有两个独立的Mac应用程序,可以正常工作。一个是SerialTools,它使用与my Terminal应用程序和插件完全相同的方法来设置RTS on (和DTR off)。

========

更新2

我已经能够在这方面得到Apple的代码级支持,所以可能会有一个解决方案。这位工程师说,代码在插件中的运行方式与在插件外的运行方式不同,这是“奇怪的”,并与Safari插件工程师交谈。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-30 04:30:31

答案是,每当在ioctl()调用中使用TIOCMSET或TIOCMGET时,第三个参数必须是int。我用的是字符。是啊。真不敢相信我错过了这个。TIOCMSET和TIOCMGET的定义如下:

代码语言:javascript
复制
  #define   TIOCMSET    _IOW('t', 109, int) /* set all modem bits */
  …
  #define   TIOCMGET    _IOR('t', 106, int) /* get all modem bits */

因此不难想象,使用char作为我的“flag”var的类型可能会导致不可预知的行为。

票数 1
EN

Stack Overflow用户

发布于 2013-04-04 21:44:26

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

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

AppleScript插件的代码如下所示::

代码语言:javascript
复制
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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14693724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档