我正在考虑在C / C++中为Linux实现某种守护程序/服务,该守护程序/服务将通过 shell (使用linux-gpib库)与特定的gpib设备进行通信。
这个想法是守护程序将扫描所有现有设备,并为每个设备创建文件/管道/dev/gpib#-*
(其中*
将是它们在指定的gpib总线上的地址)。使用方法例如/dev/com#
。然后,我可以输入命令行:echo "*IDN?" > /dev/gpib1-12
哪个会发送“* IDN”?串到设备1上的设备12上。
当我想从设备检索数据时,问题就开始了。我希望它以类似的方式工作,以便cat /dev/gpib1-12
会写出设备要说的内容...但是我不知道我发送给设备的哪个命令会使设备返回字符串(值),而不会返回。所以我的选择是:
-或-
/dev/gpib#-*
管道读取时查询设备。这必须通过“信号”和“等待”来提供。 出于明显的原因(性能和/或延迟障碍),我不想实施解决方案1。尽管如此,我也不知道该怎么做……我认为,必须有可能在强大的网络上实施linux,但是如何?我确实读过this,我认为
select()
函数的某些旋转是正确的前进方法,但我不知道如何解决该问题。我还偶然发现了this,那里的人解释了如何做类似但又有些不同的事情(代码mosfet.c)。问题是:我如何通过信号,等待或中断立即检测到试图从管道/ FIFO /文件的另一侧读取的消息并使用react?
谢谢答案。
PS:今天早上七点半(又是不眠之夜),所以请原谅我的英语不好...
PPS:哦,是的,如果有人已经知道用于Linux的gpib守护程序,或者是否可以通过linux-gpib库请求我(通过文件I / O访问单个设备)知道。我确实阅读了linux-gpib的文档和src,但没有发现任何帮助。 linux-gpib库提供的所有内容都是对C,Python等的绑定(bind)。
PPS:也许还有其他使用管道的替代方法吗?
最佳答案
如果您只需要gpib设备的漂亮终端,则可以使用python(甚至更好的ipython)。
linux-gpib随附python包装器(对于代码,请参见here)。因此,在您的 shell 中,通过键入python
打开python
在python解释器中,您可以像这样轻松地与设备通信
>>>import Gpib
>>>device = Gpib.Gpib(pad=2)
这将打开与主要地址2的gpib设备的连接。要与之通信,只需执行以下操作
>>>device.write('*IDN?')
>>>device.read()
'HEWLETT-PACKARD,33120A,0,8.0-5.0-1.0'
为了进一步简化,请使用ipython代替纯python。这使您可以完成制表符补全。