1

是否有driver_output_term另一个方向的等价物,即在没有先将其转换为 iolist 的情况下向驱动程序发送 Erlang 术语?如果不是,我大概应该使用转换我的术语term_to_binary并在 C 端用ei;解析它。有什么好的例子吗?

4

1 回答 1

2

根据文档,您只能发送iodata()格式的内容。

如果您想要发送给驱动程序的只是整数和字符串,那么使用您自己的 term-to-iodata 编码可能会更有效(也更容易),如本教程中的 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);
}
于 2010-11-30T00:50:41.873 回答