由于項目需求,需要使用紅外熱成像溉委,最終選用了韓國 i3system的紅外機芯TE-EQ1衡载,在價格和性能上剛好合適。但由于筆者使用的是 NI Real Time Linux 系統(tǒng)矮嫉,i3原生并不支持,故在廠家協(xié)助下牍疏,編譯了可在RTlinux下使用的i3 system庫蠢笋。然而在使用過程中,卻并不順利鳞陨,大部分由于筆者對c/c++的理解不透徹導(dǎo)致昨寞,現(xiàn)將踩坑過程記錄如下瞻惋,以避免重復(fù)踩坑。
一援岩、驅(qū)動庫
TE-EQ1需要的驅(qū)動庫包括【libi3system_te.so】和【libi3system_usb.so】
其中文件依賴關(guān)系:
libi3system_te.so
---------libi3system_usb.so
---------------libusb-1.0.so【系統(tǒng)包含】
---------------libudev.so【系統(tǒng)包含】
驅(qū)動庫地址?https://github.com/lingqing/i3system_te_nirtlinux_libdriver
二歼狼、使用及踩坑
機芯使用過程為:打開機芯→采集圖像/采集溫度→關(guān)閉機芯
1. 環(huán)境配置參考
Eclipse入門 – 用于基于NI Linux Real-Time的NI CompactRIO設(shè)備
2. 踩坑主要錯誤:段錯誤Segmentation fault
神奇的地方在于,只有在調(diào)用函數(shù) RecvImage 時享怀,才提示段錯誤羽峰,在調(diào)用其它函數(shù)時,大部分正常添瓷,讓我一度懷疑是編譯庫的問題梅屉。
然而,當我將有段錯誤的自定義庫使用RT Labview調(diào)用時鳞贷,神奇的事情發(fā)生了坯汤,竟然可以正常運行,而且數(shù)據(jù)都還正確搀愧,讓我極度懷疑人生惰聂。
2.1 盡管 RecvImage 函數(shù)可以在Labview 正常執(zhí)行,然而卻得不到正確的結(jié)果妈橄。
最終的最終庶近,發(fā)現(xiàn)是函數(shù)參數(shù)的類型定義錯誤,定義時使用的是 unsigned char *眷蚓, 調(diào)用時使用的是 unsigned short *
2.2 終于正常了鼻种,但是使用c調(diào)用C++時總是出現(xiàn) Segmentation fault,這又是什么鬼
又是最終的最終沙热,結(jié)果發(fā)現(xiàn)叉钥,在c中聲明的數(shù)組變量,竟然不能當指針傳入的c++ 庫中調(diào)用篙贸。
例如:我使用
unsigned char temp[NUM];
get_temp(temp);
這就不可以投队,最終改成如下可以了
unsigned char *temp = malloc(sizeof(unsigned char)*NUM);
get_temp(temp);
神不神奇,驚喜爵川。哎敷鸦,究其原因,還是對c/c++不懂啊