代码之家  ›  专栏  ›  技术社区  ›  Alexey Romanov

向Erlang驱动程序发送条件而不是iolist

  •  1
  • Alexey Romanov  · 技术社区  · 15 年前

    有相当于 driver_output_term 在另一个方向,也就是说,发送一个Erlang术语给驱动程序,而不首先将其转换为一个iolist?如果不是,我应该用 term_to_binary 在C端用 ei ;有什么好的例子吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Felix Lange    15 年前

    根据医生的说法,你只能发送里面的东西 iodata() 格式。

    如果您只想发送给驱动程序的是整数和字符串,那么使用您自己的术语进行iodata编码可能会更有效(也更容易),如 this tutorial 来自Erlang文档。它们使用一个函数将它们的调用转换为一个可以直接发送到驱动程序的映射,因此不需要使用 term_to_binary() .

    encode({foo, X}) -> [1, X];
    encode({bar, Y}) -> [2, Y].
    

    如果 X Y 假设为小整数。 在C端,输入缓冲区的第一个字节被打开,以使用第二个字节作为参数调用相应的函数:

    static void example_drv_output(ErlDrvData handle, char *buff, int bufflen)
    {
        example_data* d = (example_data*)handle;
        char fn = buff[0], arg = buff[1], res;
        if (fn == 1) {
            res = foo(arg);
        } else if (fn == 2) {
            res = bar(arg);
        }
        driver_output(d->port, &res, 1);
    }