2019/08/04 06:36 編集
削除
投稿2019/08/04 05:42
編集2019/08/05 04:16現在、Python からCライブラリを利用することができるctypesを利用して.dllを読み込み、測定装置からデータを読み込むプログラムの作成をしています。
C
1//ドライバアクセス用API 2//Visual C++/CLI 用モジュール 3 4// 連続取り込み設定用構造体宣言 5[StructLayout(LayoutKind::Sequential)] value struct adsms_setting 6//struct adsms_setting 7{ 8 unsigned char ChLen; //チャンネル長 1-16 9 [MarshalAs(UnmanagedType::ByValArray, SizeConst = 16)] 10 array<unsigned char> ^ ChPattern; 11 [MarshalAs(UnmanagedType::ByValArray, SizeConst = 16)] 12 array<unsigned char> ^ ChPatternRange; 13 unsigned char TriggerType; //トリガ種類 1:ソフト 2:外部ディジタル立上り 3:外部ディジタル立下り 4:立上エッジ 5:立下エッジ 6:上限レベル 7:下限レベル 14 short TriggerLevel; //エッジやレベルの閾値 15 unsigned char TriggerCh; //エッジやレベルを検出するチャンネル位置(パターンバッファのポインタ) 16 unsigned char ClockSel; //0:内部クロック 1:外部クロック 17 int SamplingClock; //内部クロック間隔 10~16,777,215[uS] 18 int PreTriggerLen; //プレトリガ長 0~10,000,000 19 int TotalLen; //全取込データバッファ 1~10,000,000
このようなCで書かれた構造体をctypesを使って書き換え、値を入力しました。
python
1import ctypes 2from ctypes import* 3"""構造体宣言""" 4class ADSMS_SETTING(Structure): 5 _fields_ = [ 6 ("ChLen",c_ubyte), 7 ("ChPattern", c_ubyte*3), 8 ("ChPatternRange", c_ubyte*3), 9 ("TriggerTypes",c_ubyte), 10 ("TriggerLevel",c_short), 11 ("TriggerCh",c_ubyte), 12 ("ClockSel",c_ubyte), 13 ("SamplingClock",c_int), 14 ("PreTriggerLen",c_int), 15 ("TotalLen",c_int)] 16adsms=ADSMS_SETTING() 17adsms.ChLen=1 18adsms.ChPattern[0]=0 19adsms.ChPatternRange[0]=0 20adsms.TriggerTypes=1 21adsms.TriggerLevel=100 22adsms.TriggerCh=0 23adsms.ClockSel=0 24adsms.SamplingClock=100 25adsms.PreTriggerLen=0 26adsms.TotalLen=9000 27
実際に関数を呼び出し、構造体を引数として動かしたところ、pythonでのエラーは起きませんでしたが、各機能関数(プロシージャ)から戻る処理結果コードでは、「指定パラメータのエラー」という戻り値がきます。おそらく構造体が間違っていると思うのですが...
つたない文章で分かりにくいとは思いますが、何卒よろしくお願いいたします
追記
C++
1 //保存先ファイル名の取得 2 SaveFileDialog1->OverwritePrompt = true; 3 SaveFileDialog1->Filter = "データファイル(*.dat)|*.dat"; 4 if( SaveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK ) 5 { 6 if( System::IO::File::Exists(SaveFileDialog1->FileName))//既存ファイルチェック 7 { 8 System::IO::File::Delete(SaveFileDialog1->FileName); 9 } 10 11 SaveFile = gcnew StreamWriter(SaveFileDialog1->FileName);//ファイルを開く 12 ret = Tusbadsms_Sample_Start((short) IdSel->SelectedIndex,smpl_setting); 13 if( ret == 0 )//正常にスタートできた 14 { 15 StopReq = false; 16 TotalLeng = 0; 17 EnableDisableControl(2); 18 Timer1->Interval = 100; 19 Timer1->Enabled = true; 20 } 21 else//正常にスタートできなかった 22 { 23 SaveFile->Close(); 24 Tusbadsms_Device_Close((short) IdSel->SelectedIndex); 25 } 26 } 27 }
Tusbadsms_Sample_Startが関数となっています。
回答1件
あなたの回答
tips
プレビュー