我正在考虑在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。这使您可以完成制表符补全。

    07-26 06:57