node-ffi でバッファを使用して次のライブラリ関数を呼び出すのに問題があります。
int ftdi_read_data(struct ftdi_context *ftdi, unsigned char *buf, int size) { ... }
「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 関数は、(libusb から) usb_bulk_read を呼び出します。これは、'char *' をバッファー引数として受け取ります。これが何かに影響を与えているかどうかはわかりません。
http://www.intra2net.com/en/developer/libftdi/documentation/ftdi_8c_source.html#l01749