2010-11-18 1 views
1

Есть ли эквивалент driver_output_term в другом направлении, то есть отправка термина Erlang водителю, не преобразовывая его сначала в iolist? Если нет, я, по-видимому, должен преобразовать свой термин, используя term_to_binary, и проанализировать его на стороне C с помощью ei; любые хорошие примеры?Отправка терминов вместо iolists в драйвер Erlang

ответ

2

Согласно документам, вы можете отправлять материалы только в формате iodata().

Если все, что вы хотите отправить водителю, это целые числа и строки, возможно, было бы более эффективно (и намного проще) использовать вашу собственную кодировку от термина к йодату, как в this tutorial из документации Erlang. Они используют функцию для преобразования своих вызовов в сопоставление, которое может быть отправлено непосредственно в драйвер, и поэтому не нужно кодировать, используя term_to_binary().

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

Это отображение является возможным, если X и Y предполагаются небольшие целые числа. На стороне С, первый байт буфера ввода переключается на, чтобы вызвать соответствующую функцию, используя второй байт в качестве аргумента:

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); 
} 
+0

К сожалению, мои условия достаточно сложны, что использование 'ei' проще. –

Смежные вопросы