【NI】【i3】在NI rt linux 上使用 i3system 红外机芯库踩坑过程

由于项目需求,需要使用红外热成像,最终选用了韩国 i3system的红外机芯TE-EQ1,在价格和性能上刚好合适。但由于笔者使用的是 NI Real Time Linux 系统,i3原生并不支持,故在厂家协助下,编译了可在RTlinux下使用的i3 system库。然而在使用过程中,却并不顺利,大部分由于笔者对c/c++的理解不透彻导致,现将踩坑过程记录如下,以避免重复踩坑。

一、驱动库

TE-EQ1需要的驱动库包括【libi3system_te.so】和【libi3system_usb.so】

其中文件依赖关系:

libi3system_te.so

———libi3system_usb.so

—————libusb-1.0.so【系统包含】

—————libudev.so【系统包含】

驱动库地址 https://github.com/lingqing/i3system_te_nirtlinux_libdriver

二、使用及踩坑

机芯使用过程为:打开机芯→采集图像/采集温度→关闭机芯

1. 环境配置参考

Eclipse入门 – 用于基于NI Linux Real-Time的NI CompactRIO设备

2. 踩坑主要错误:段错误Segmentation fault

神奇的地方在于,只有在调用函数 RecvImage 时,才提示段错误,在调用其它函数时,大部分正常,让我一度怀疑是编译库的问题。

然而,当我将有段错误的自定义库使用RT Labview调用时,神奇的事情发生了,竟然可以正常运行,而且数据都还正确,让我极度怀疑人生。

2.1 尽管 RecvImage 函数可以在Labview 正常执行,然而却得不到正确的结果。

最终的最终,发现是函数参数的类型定义错误,定义时使用的是 unsigned char *, 调用时使用的是 unsigned short *

2.2 终于正常了,但是使用c调用C++时总是出现 Segmentation fault,这又是什么鬼

又是最终的最终,结果发现,在c中声明的数组变量,竟然不能当指针传入的c++ 库中调用。

例如:我使用

unsigned char temp[NUM];

get_temp(temp);

这就不可以,最终改成如下可以了

unsigned char *temp = malloc(sizeof(unsigned char)*NUM);

get_temp(temp);

神不神奇,惊喜。哎,究其原因,还是对c/c++不懂啊

    原文作者:andyhacker
    原文地址: https://www.jianshu.com/p/bb0f6ae53659
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞