将 unsigned char 缓冲区与 node-ffi 一起使用
Posted
技术标签:
【中文标题】将 unsigned char 缓冲区与 node-ffi 一起使用【英文标题】:Using unsigned char buffer with node-ffi 【发布时间】:2015-01-12 04:54:12 【问题描述】:我在使用带有 node-ffi 的缓冲区调用以下库函数时遇到问题:
int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size) ...
http://www.intra2net.com/en/developer/libftdi/documentation/group__libftdi.html#ga72d87e30015c98bd0be22e7c8c873345
我已经看到通过将 'unsigned char buf[size]' 作为 buf 参数传递给它。
所以我用 ffi 试试这个:
ffi = require 'ffi'
ref = require 'ref'
ftdiContext = ref.types.void
ftdiContextPtr = ref.refType ftdiContext
ftdi = ffi.Library 'libftdi',
'ftdi_init': [ 'int', [ ftdiContextPtr ] ]
'ftdi_usb_open': [ 'int', [ ftdiContextPtr, 'int', 'int' ] ]
'ftdi_usb_open_desc': [ 'int', [ ftdiContextPtr, 'int', 'int', 'string', 'string'] ]
'ftdi_get_error_string': [ 'string', [ ftdiContextPtr ] ]
'ftdi_set_bitmode': [ 'int', [ ftdiContextPtr, 'uchar', 'uchar' ] ]
'ftdi_set_baudrate': [ 'int', [ ftdiContextPtr, 'int' ] ]
'ftdi_read_data': [ 'int', [ ftdiContextPtr, ref.refType(ref.types.uchar), 'int' ] ]
BITMODE_RESET = 0x00
BITMODE_BITBANG= 0x01
BITMODE_MPSSE = 0x02
BITMODE_SYNCBB = 0x04
BITMODE_MCU = 0x08
BITMODE_OPTO = 0x10
BITMODE_CBUS = 0x20
BITMODE_SYNCFF = 0x40
inputPin = 1
outputPin = 2
rxBaudRate = 9600
txBaudRate = 4500
rxBufSize = 10
buf = new Buffer rxBufSize
ctx = ref.alloc ftdiContextPtr
console.log ftdi.ftdi_init ctx
console.log ftdi.ftdi_usb_open_desc ctx, 0x0403, 0x6001, null, 'FTG4GJL1'
console.log ftdi.ftdi_set_bitmode ctx, inputPin << outputPin , BITMODE_BITBANG
console.log ftdi.ftdi_set_baudrate ctx, rxBaudRate
console.log ftdi.ftdi_read_data ctx, buf, buf.length
console.log ftdi.ftdi_get_error_string ctx
但我得到的结果是:
-22
usb bulk read failed
ftdi_read_data C 函数调用 usb_bulk_read(来自 libusb),它将 'char *' 作为缓冲区参数 - 我不确定这是否会影响任何东西..
http://www.intra2net.com/en/developer/libftdi/documentation/ftdi_8c_source.html#l01749
【问题讨论】:
【参考方案1】:似乎它失败了,因为你不能只用 void 上下文来喂它:
ret = libusb_bulk_transfer (ftdi->usb_dev, ftdi->out_ep, ftdi->readbuffer, ftdi->readbuffer_chunksize, &actual_length, ftdi->usb_read_timeout);
if (ret < 0)
ftdi_error_return(ret, "usb bulk read failed");
ftdi
应该是结构体http://www.intra2net.com/en/developer/libftdi/documentation/ftdi_8h_source.html#l00219
为此尝试使用ref-struct
library。
【讨论】:
我发布的原始代码省略了 ftdi init 调用和我在尝试执行 read_data 之前所做的进一步调用以及在 read_data 成功工作之前进行的所有调用(使用你提到的 ref-struct ftdi 上下文)。我已经用附加代码更新了原始问题,以显示它在失败之前能走多远......干杯以上是关于将 unsigned char 缓冲区与 node-ffi 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
SWIG 将 unsigned char* 转换为 20 字节缓冲区 Java 结构
在 C 中读取和写入 unsigned char 的缓冲区到文件?
使用“unsigned char”指向原始数据缓冲区时需要了解内存管理
将从 SHA1 返回的 unsigned char* 转换为字符串