Согласно документации, вы можете отправлять только то, что находится в формате 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);
}