由于项目需求,需要使用红外热成像,最终选用了韩国 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++不懂啊