我可以在一个小的终端应用程序中使用ioctl设置RTS,但不能在我的Mac插件代码中设置,尽管两者运行相同的代码。在插件中,我只能“获取”串行端口的标志/引脚,而不能“设置”它们。在终端应用程序中,我可以“获取”和“设置”它们。我得到了ENODEV的错误号。错误号是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项目。它们都在一开始失败,然后在页面重新加载时成功。我也有两个独立的Mac应用程序,可以正常工作。一个是SerialTools,它使用与my Terminal应用程序和插件完全相同的方法来设置RTS on (和DTR off)。
========
更新2
我已经能够在这方面得到Apple的代码级支持,所以可能会有一个解决方案。这位工程师说,代码在插件中的运行方式与在插件外的运行方式不同,这是“奇怪的”,并与Safari插件工程师交谈。
发布于 2013-07-30 04:30:31
答案是,每当在ioctl()调用中使用TIOCMSET或TIOCMGET时,第三个参数必须是int。我用的是字符。是啊。真不敢相信我错过了这个。TIOCMSET和TIOCMGET的定义如下:
#define TIOCMSET _IOW('t', 109, int) /* set all modem bits */
…
#define TIOCMGET _IOR('t', 106, int) /* get all modem bits */
因此不难想象,使用char作为我的“flag”var的类型可能会导致不可预知的行为。
发布于 2013-04-04 21:44:26
您可以制作一个AppleScript插件,它将在特定时间或在您登录时自动运行,或者在后台连续运行。
AppleScript可以运行终端代码。因此,您可以轻松地让它自动运行您当前在终端中运行的get/set代码。
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
https://stackoverflow.com/questions/14693724
复制相似问题