2014-02-20 163 views
1

我正在使用MATLAB從外部庫調用函數來控制設備, 我遇到的問題是具有特定函數的參數未正確轉換且奇怪的字符出現在它的位置。當在Matlab中調用庫函數時出現奇怪/奇怪的字符

例如,調用:

ERRCODE = calllib ('MEDAQLib','ExecSCmd',1,int8('Laser_On')); 

其中ExecSCmd參數在libfunctionview被定義爲ulong,int8Ptr

現在,當我登錄的命令發生這種情況

ExecSCmd,回車,instanceHandle = 1,sensorCommand ='Laser_On''£〜'' MESensor :: SensorCommand,Enter,this = 0x30c07b50,S_Command = Laser_On'「£〜d ERRORMSG :: Error_SetText集,留言:-14 (ERR_UNKNOWN_SENSOR_COMMAND):Laser_On'「£〜d

相反的Laser_On'「£~ð它的意思是顯示一個乾淨Laser_On像它與其他功能呢。它變得更加怪異,有時稱它爲隨機工作,但這樣做的次數很少。

當使用不同的計算機,使用相同的Matlab版本,相同的編譯器,相同的庫,但操作系統不同時,會出現類似的問題。 使用的編譯器是Windows SDK 7.1,Matlab版本2012b。

爲什麼這些奇怪的字符出現在參數中?

回答

1

看起來庫預計該字符串是零終止的,就像C中的字符串一樣。您可以嘗試使用int8(['Laser_On', char(0)])。實際上,reference表示您的數組按照C指示的char *傳遞,指向字符串的第一個字符'L'。而不是僅僅使用int8,你也可以寫得更精確int8(char(['Laser_On', 0]))

出現奇怪的字符是因爲庫中的記錄器會一個接一個地打印一個字符,直到達到零字節。因此,在你的案例中,行爲變得不確定,並且你有記錄器打印這些奇怪的字符,直到碰巧爲零。

+0

很好解釋!我現在知道了。我現在沒有機會對此進行測試,但這可能會起作用。只有一件事,我認爲函數輸入仍然需要Matlab上的整數格式,因此:'int8(char ['Laser_On',0])'應該這樣做。如果這個工作很快就會確認。 – DonD

+0

非常感謝您的反饋。如果你發現只有'int8'可以工作,你可以編輯我的答案。 –