我的问题特定于 FTDI 的库 libMPSSE 以在 Linux 上使用 USB 到串行端口(SPI、I2C 等)适配器。
当我执行与库链接的任何程序时,将调用方法 Init_libMPSSE()(没有显式调用)并抛出以下消息。
../../Infra/src/ftdi_infra.c:243:Init_libMPSSE(): NULL expression encountered
有没有人遇到过这个问题并找到了解决方法?
谢谢。
我的问题特定于 FTDI 的库 libMPSSE 以在 Linux 上使用 USB 到串行端口(SPI、I2C 等)适配器。
当我执行与库链接的任何程序时,将调用方法 Init_libMPSSE()(没有显式调用)并抛出以下消息。
../../Infra/src/ftdi_infra.c:243:Init_libMPSSE(): NULL expression encountered
有没有人遇到过这个问题并找到了解决方法?
谢谢。
当 libMPSSE 无法打开 libftd2xx.so 共享库时,您会收到此错误。您需要将 LD_LIBRARY_PATH 设置为安装此库的路径。例如,如果库位于 /usr/local/lib 中,您将运行 SPI 静态示例,如下所示:
sudo LD_LIBRARY_PATH=/usr/local/lib ./sample-static.o
使用:
sudo LD_LIBRARY_PATH=/usr/local/lib ./your_application
只是重要步骤之一!
重要提示:不使用
sudo
可能会导致失败,如此处所述!
但在Linux上,请确保在执行上述命令之前,禁用 Linux 内核中已包含的 FTDI 的 VCP 驱动程序。VCP驱动和libftd2xx
驱动不能共存!因此,即使在执行上述命令之前,您也必须 (a) 插入设备并 (b) 禁用 VCP 驱动程序:
┌───┐
│ $ │ ziga > ziga--workstation > Downloads
└─┬─┘ /dev/pts/3
└─> sudo rmmod ftdi_sio
┌───┐
│ $ │ ziga > ziga--workstation > Downloads
└─┬─┘ /dev/pts/3
└─> sudo rmmod usbserial
现在,您的应用程序将能够与libftd2xx
驱动程序对话,因为 VCP 驱动程序不会干扰。所以现在你可以执行A:中的命令了。
请注意libMPSSE
(以及因此您的应用程序)的位数,并且libftd2xx
也必须相同!32 位或 64 位!
对于Linux,FTDI 在这里只提供 32 位预编译libMPSSE
库,但他们在这里提供 32 位和 64 位libftd2xx
驱动程序。所以如果你安装了 64-bit ,你需要自己编译 64-bit库!资源可在此处获得。libftd2xx
libMPSSE
如果我们在 64 位系统上,我们下载源代码并获得压缩文件libMPSSE_Source.zip
。我们提取它:
┌───┐
│ $ │ ziga > ziga--workstation > Downloads
└─┬─┘ /dev/pts/4
└─> unzip libMPSSE_Source.zip
我们会得到一个文件夹libMPSSE__0-6_Source
。我们搬进去尝试建造图书馆!
┌───┐
│ $ │ ziga > ziga--workstation > Downloads
└─┬─┘ /dev/pts/4
└─> cd ./libMPSSE__0-6_Source/LibMPSSE/
┌───┐
│ $ │ ziga > ziga--workstation > LibMPSSE
└─┬─┘ /dev/pts/4
└─> cp ../External/Linux/libftd2xx1.1.12/release/ftd2xx.h .
┌───┐
│ $ │ ziga > ziga--workstation > LibMPSSE
└─┬─┘ /dev/pts/4
└─> cp ../External/Linux/libftd2xx1.1.12/release/WinTypes.h .
┌───┐
│ $ │ ziga > ziga--workstation > LibMPSSE
└─┬─┘ /dev/pts/4
└─> gcc -Wall -c *.c
ftdi_mid.c: In function ‘Mid_CheckMPSSEAvailable’:
ftdi_mid.c:653:2: error: unknown type name ‘byte’
653 | byte los = strlen(devList.Description);
| ^~~~
我们会看到有一个错误,但它是可以修复的。我们只需打开一个文件ftdi_mid.h
并移动到653
我们编辑的行,如下所示:
unsigned char los = strlen(devList.Description);
现在我们将文件编译.h
为.o
文件并创建一个存档,即静态库libMPSSE.a
:
┌───┐
│ $ │ ziga > ziga--workstation > LibMPSSE
└─┬─┘ /dev/pts/4
└─> gcc -Wall -c *.c
┌───┐
│ $ │ ziga > ziga--workstation > LibMPSSE
└─┬─┘ /dev/pts/4
└─> ar -cvq libMPSSE.a *.o
a - ftdi_common.o
a - ftdi_i2c.o
a - ftdi_infra.o
a - ftdi_mid.o
a - ftdi_spi.o
我们现在也可以将这个 64 位库移动到我们项目的文件夹中,我们可以使用这个库,但是这样做会要求我们删除或重命名已经存在的 32 位库。
为了使用 32 位库编译我的应用程序,我使用了:
gcc -Wall -Wpedantic -g -gdwarf-2 -m32 -L. -o main.elf main.c -lMPSSE -ldl
请注意,我在 Debian 11 上,为了使用
-m32
flag 进行交叉编译,您需要安装 packagegcc-multiarch
。
但是为了使用 64 位库编译我的应用程序,我使用了:
gcc -Wall -Wpedantic -g -gdwarf-2 -L. -o main.elf main.c -lMPSSE -ldl