40: 2017-12-17 (日) 21:28:48 takaboo | 現: 2021-10-08 (金) 21:38:39 takaboo | ||
---|---|---|---|
Line 1: | Line 1: | ||
TITLE:Dynamixel Protocol Library | TITLE:Dynamixel Protocol Library | ||
**概要 [#va21cbfb] | **概要 [#va21cbfb] | ||
- | Dynamixel Protocol LibraryはDynamixel Protocol 1の通信プロトコルをサポートした製品をWindows等のOSから操作するためのライブラリ集です。~ | + | Dynamixel Protocol Libraryは[[DYNAMIXEL Communiation Protocol 1.0]]に対応した製品をWindows等のOSから操作するためのライブラリ集です。~ |
シリアル通信に関するAPI、タイミングやエラー処理、プロトコルの整合性チェック等を本ライブラリ内で行っているため、シリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができます。 | シリアル通信に関するAPI、タイミングやエラー処理、プロトコルの整合性チェック等を本ライブラリ内で行っているため、シリアル通信である事をほとんど意識すること無くアプリケーションの作りこみに専念することができます。 | ||
- | なお、PCと[[BTE061D]]・[[BTE061E]]・[[BTE068]]・[[BTE068B]]・[[BTE082]]・[[BTE083]]・[[BTE074]]・[[BTE079]]・[[BTE080]]・[[BTE079B]]・[[BTE080B]]のいずれかがUSBポートに接続され、PCのOSに仮想COMポートが増設された状態で使用するものとします。 | + | なお、PCと[[BTE061D]]・[[BTE061E]]・[[BTE068]]・[[BTE068B]]・[[BTE068C]]・[[BTE082]]・[[BTE083]]・[[BTE074]]・[[BTE079]]・[[BTE080]]・[[BTE079B]]・[[BTE080B]]・[[BTE079C]]・[[BTE080C]]・[[BTE096]]・[[BTE101]]・[[BTX229>http://emanual.robotis.com/docs/en/parts/interface/u2d2/]]のいずれかがUSBポートに接続され、PCのOSに仮想COMポートが増設された状態で使用するものとします。[[BTE100]]の場合はRaspberry Piに依存します。 |
**ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f] | **ライブラリおよびサンプルプログラムのダウンロード [#j8bd290f] | ||
以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 | 以下のリンクよりライブラリ及びサンプルプログラムをアーカイブしたファイルがダウンロードできます。 | ||
- | -''2016/07/13 Ver.3.3''~ | + | -''2022/3/1 Ver.4.6''~ |
- | #ref(http://www.besttechnology.co.jp/download/DXLIB_V3.3.zip) | + | #ref(https://www.besttechnology.co.jp/download/DXLIB_V4.6.zip) |
+ | 更新内容 | ||
+ | --最新GCC Developer Liteの更新に伴うコンパイル環境の調整 | ||
+ | --新しく追加されたDynamixelの定義を追加 | ||
+ | --コンパイル用バッチファイルの名称を変更 | ||
+ | --バッチファイル中のパスの指定はジャンクションを使用する事で空白を含むファイル名によるコンパイル時の問題を回避 | ||
+ | -2021/10/8 Ver.4.5~ | ||
+ | 更新内容 | ||
+ | #ref(https://www.besttechnology.co.jp/download/DXLIB_V4.5.zip) | ||
+ | --タイムアウトのデフォルトオフセット時間を30msに変更 | ||
+ | --全プラットホームにおけるコンパイル時のウォーニング抑止 | ||
+ | --Linux上における非標準ボーレート指定を許容 | ||
+ | --Linux環境における受信処理の見直し | ||
+ | --追加APIの各デバイス毎の速度リミッタ見直し | ||
+ | --追加APIのDX-116のモデル番号の誤記修正 | ||
+ | --Dynamixelの最新ファームに備わったTime-based profileに対応したAPI(DXL_SetDriveMode, DXL_SetDriveModesEquival, DXL_SetGoalAngleAndTime2, DXL_SetGoalAnglesAndTime2)を追加 | ||
+ | --makedll.batとbuild_dxlib.shの内容を一部変更 | ||
+ | --dxlib.py内のDXL_ScanDevicesの誤記修正 | ||
+ | --macOS暫定対応 | ||
+ | --C言語のサンプルコードをプラットホーム共通に | ||
+ | --放置していたRubyのサンプルを修正 | ||
+ | -2021/1/22 Ver.4.4~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/DXLIB_V4.4.zip) | ||
+ | 内容 | ||
+ | --新しく追加されたDynamixelの定義を追加 | ||
+ | --makedll.batの内容を一部変更 | ||
+ | -2019/11/15 Ver.4.3~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/DXLIB_V4.3.zip) | ||
+ | 内容 | ||
+ | --Visual Studio上での動作検証を行いヘッダを一部修正 | ||
+ | --ライブラリソースのエンコードをUTF-8のBOM付きに統一 | ||
+ | --新しく追加されたDynamixelの定義を追加 | ||
+ | -2019/03/27 Ver.4.2~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/DXLIB_V4.2.zip) | ||
+ | 内容 | ||
+ | --追加APIの正式リリース | ||
+ | --C言語による追加APIのサンプルプログラムを拡充 | ||
+ | --Pythonによるサンプルプログラムを拡充 | ||
+ | -2016/07/13 Ver.3.3~ | ||
+ | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.3.zip) | ||
内容 | 内容 | ||
--Linux上でのttyの初期化処理を修正 | --Linux上でのttyの初期化処理を修正 | ||
--Linux上でのスリープ命令をusleepに置換する様に変更 | --Linux上でのスリープ命令をusleepに置換する様に変更 | ||
-2016/01/12 Ver.3.2~ | -2016/01/12 Ver.3.2~ | ||
- | #ref(http://www.besttechnology.co.jp/download/DXLIB_V3.2.zip) | + | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.2.zip) |
内容 | 内容 | ||
--ヘッダファイルを最近のVCで使用するとエラーになるのを修正 | --ヘッダファイルを最近のVCで使用するとエラーになるのを修正 | ||
Line 21: | Line 60: | ||
--GCCがやたらエラーを吐くので、ライブラリソースのエンコードをUTF-8に統一 | --GCCがやたらエラーを吐くので、ライブラリソースのエンコードをUTF-8に統一 | ||
-2015/11/18 Ver.3.1~ | -2015/11/18 Ver.3.1~ | ||
- | #ref(http://www.besttechnology.co.jp/download/DXLIB_V3.1.zip) | + | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.1.zip) |
内容 | 内容 | ||
--TDxAlarmStatus構造体のアライメントがGCCのバージョンによって1バイト境界にならない事があるのを修正 | --TDxAlarmStatus構造体のアライメントがGCCのバージョンによって1バイト境界にならない事があるのを修正 | ||
Line 27: | Line 66: | ||
--DX_SetBaudrateの処理に待ち時間を挿入 | --DX_SetBaudrateの処理に待ち時間を挿入 | ||
-2014/06/11 Ver.3.0~ | -2014/06/11 Ver.3.0~ | ||
- | #ref(http://www.besttechnology.co.jp/download/DXLIB_V3.0.zip) | + | #ref(https://www.besttechnology.co.jp/download/DXLIB_V3.0.zip) |
内容 | 内容 | ||
--各APIのアドレス指定が8bit幅だったものを16bitに拡張(後継のDYNAMIXEL2に合わせた) | --各APIのアドレス指定が8bit幅だったものを16bitに拡張(後継のDYNAMIXEL2に合わせた) | ||
Line 103: | Line 142: | ||
--初期リリース~ | --初期リリース~ | ||
- | アーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。(※最新版のフォルダ構成を記載しています) | + | 最新版のアーカイブファイルには以下のファイルが同梱されます。必要に応じて解凍してください。 |
|DXLIB|dxlib_x32.dll|<|ライブラリ本体 | | |DXLIB|dxlib_x32.dll|<|ライブラリ本体 | | ||
|~|dxlib_x64.dll|<|~| | |~|dxlib_x64.dll|<|~| | ||
Line 113: | Line 152: | ||
|~|dxlib.h|<|ライブラリヘッダ | | |~|dxlib.h|<|ライブラリヘッダ | | ||
|~|dxlib_matlab.h|<|matlab用ヘッダ | | |~|dxlib_matlab.h|<|matlab用ヘッダ | | ||
+ | |~|dxlib.py|<|python用API定義 | | ||
|~|dxmemmap.h|<|DX/AX/RX/EX/MXシリーズ用コントロールテーブル定義ヘッダ | | |~|dxmemmap.h|<|DX/AX/RX/EX/MXシリーズ用コントロールテーブル定義ヘッダ | | ||
- | |~|makelib.bat|<|ライブラリ再構築用バッチ | | + | |~|makelib.cmd|<|ライブラリ再構築用バッチ | |
- | |~|83.bat|<|~| | + | |~|build_dxlib.sh|<|Linux向けライブラリ再構築用スクリプト | |
- | |SampleCode|GCCDeveloperLite|smpl1(template).c |サンプル | | + | |SampleCode|C|smpl??.c |サンプル | |
- | |~|~|smpl2(ping).c |~| | + | |~|~|dxmisc.h |サンプル共通設定 | |
- | |~|~|smpl3(byte_rw).c |~| | + | |~|~|kbhit.h |kbhitエミュレーション | |
- | |~|~|smpl4(word_rw).c |~| | + | |~|~|makefile |サンプルコンパイル用makefile | |
- | |~|~|smpl5(multithread).c |~| | + | |~|~|makeexe.cmd|Windows向け再構築用バッチ | |
- | |~|~|smpl6(sync).c |~| | + | |
- | |~|~|smpl7(rawpacket).c |~| | + | |
- | |~|~|smpl8(dualport).c |~| | + | |
- | |~|~|smpl9(DynamicLoad).c |~| | + | |
- | |~|~|smpl10(USS3).c |~| | + | |
|~|~|dxlib.h |DXLIBフォルダに収録されるものと同一 | | |~|~|dxlib.h |DXLIBフォルダに収録されるものと同一 | | ||
|~|~|dxmemmap.h |~| | |~|~|dxmemmap.h |~| | ||
Line 136: | Line 171: | ||
|~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | | ||
|~|~|dxlib_x64.dll |~| | |~|~|dxlib_x64.dll |~| | ||
- | |~|LabVIEW2011|sample1.vi |サンプル | | + | |~|Python|smpl??.py |サンプル | |
- | |~|~|sample2.vi |~| | + | |~|~|kbhit.py |kbhitエミュレーション | |
- | |~|~|sample3.vi |~| | + | |~|~|dxlib.py |DXLIBフォルダに収録されるものと同一| |
- | |~|~|sample4.vi |~| | + | |~|~|dxlib_x32.dll |~| |
- | |~|~|sample5.vi |~| | + | |~|~|dxlib_x64.dll |~| |
- | |~|~|sample6.vi |~| | + | |~|LabVIEW2011|sample??.vi |サンプル | |
- | |~|~|WaveForm.vi |サブvi | | + | |
|~|~|DXLIB.llb |dllの呼び出しをvi化 | | |~|~|DXLIB.llb |dllの呼び出しをvi化 | | ||
+ | |~|~|DXLIB_DXL.llb |dllの呼び出しをvi化 | | ||
|~|~|DXLIB_Wrapper.llb |アクチュエータに特化したvi | | |~|~|DXLIB_Wrapper.llb |アクチュエータに特化したvi | | ||
|~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | | ||
Line 149: | Line 184: | ||
|~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | | ||
|~|~|dxlib_x64.dll |~| | |~|~|dxlib_x64.dll |~| | ||
- | |~|Linux|smpl2.c |サンプル | | + | |~|Ruby|smpl??.rb |サンプル | |
- | |~|~|smpl4.c |~| | + | |~|~|dxlib_x32.dll |DXLIBフォルダに収録されるものと同一 | |
- | |~|Ruby|SMPL1.c |サンプル | | + | |~|~|dxlib_x64.dll |~| |
- | |~|~|SMPL3.c |~| | + | |
- | |~|Python|SMPL1.py |サンプル | | + | |
- | |~|~|SMPL3.py |~| | + | |
**開発環境毎の設定 [#u3ff03d9] | **開発環境毎の設定 [#u3ff03d9] | ||
Line 161: | Line 193: | ||
***GCC Developer Lite [#e1d4017c] | ***GCC Developer Lite [#e1d4017c] | ||
GCC Developer Liteの詳細については[[こちら>GCC Developer Lite]]。~ | GCC Developer Liteの詳細については[[こちら>GCC Developer Lite]]。~ | ||
- | 'SampleCode\GCCDeveloperLite'フォルダにはAPIの基本的な使い方を紹介したサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。 | + | 「基本パック」と「WINパック」を[[ダウンロード>GCC Developer Lite#DOWNLOAD]]してインストールしてください。 |
+ | |||
+ | 'SampleCode\C'フォルダにはAPIの基本的な使い方を紹介したサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。 | ||
****DLLの静的リンク [#la562acf] | ****DLLの静的リンク [#la562acf] | ||
Line 183: | Line 217: | ||
****DLLの動的リンク [#y15bf22f] | ****DLLの動的リンク [#y15bf22f] | ||
動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりにソース中でdxlib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。 | 動的にDLLを使用する場合はDLL自体をコンパイラオプションへ追記する必要はありません。その代わりにソース中でdxlib.hをインクルードする前に_DYNAMICLOADマクロを定義しておきます。 | ||
- | #define _DYNAMICLOAD | + | #html{{ |
- | #include "dxlib.h" | + | <pre class="brush: c;"> |
+ | #define _DYNAMICLOAD | ||
+ | #include "dxlib.h" | ||
+ | </pre> | ||
+ | }} | ||
これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。 | これによりヘッダファイル内の諸定義が切り替わり、DLLのロード及びアンロードを行うLoadDLLとUnloadDLLが利用できるようになります。 | ||
- | TDeviceID dev; | + | #html{{ |
- | // DLLをロード | + | <pre class="brush: c;"> |
- | if (LoadDLL ()) { | + | TDeviceID dev; |
- | if ((dev = DX_OpenPort (COMPORT, BAUDRATE))) { | + | // DLLを読み込み |
- | ... | + | if (LoadDLL ()) { |
- | DX_ClosePort (dev); | + | if ((dev = DX_OpenPort (COMPORT, BAUDRATE))) { |
- | } | + | ... |
- | // DLLをアンロード | + | DX_ClosePort (dev); |
- | UnloadDLL (); | + | } |
- | } | + | // DLLを破棄 |
+ | UnloadDLL (); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | LoadDLLが成功していない状態で各APIを呼び出してはいけません。またDLL自体は実行プログラムと同じフォルダかOSがDLLを検索できる場所に配置しておく必要があります。 | ||
+ | |||
+ | ****サンプルフォルダ内のmakefileを使用 [#h09786e4] | ||
+ | サンプルをコンパイルするだけならばGCC Developer Liteを起動する必要は無く、サンプルフォルダ内に同梱される「makeexe.cmd」を実行すればmakefileを読み込んでGCC Developer Liteに同梱されるmakeを使用してコンパイルします。~ | ||
+ | 引数にソース名をしていするとそのソースだけコンパイル、何も付けなければフォルダ内の拡張子がCのソースファイル全てがコンパイル対象となります。 | ||
+ | #html{{ | ||
+ | <pre class="brush: bash;"> | ||
+ | makeexe smpl4_byte_rw (特定のソースのみコンパイル) | ||
+ | makeexe (カレントの全ソースをコンパイル) | ||
+ | </pre> | ||
+ | }} | ||
+ | なおI/Fのポート名やボーレート等はサンプル共通として「dxmisc.h」に記述してありますので、環境に応じて修正した上でコンパイルして下さい。また64bit環境を優先します。 | ||
***Microsoft Visual C++ [#j5a74d33] | ***Microsoft Visual C++ [#j5a74d33] | ||
Line 247: | Line 301: | ||
***Ruby [#r63b1e3e] | ***Ruby [#r63b1e3e] | ||
- | 'SampleCode\Ruby'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ | + | 'SampleCode\Ruby'フォルダにサンプルが同梱されます。ライブラリ名・ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ |
- | [[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ | + | [[Ruby:http://www.ruby-lang.org/ja]]はオープンソースの動的なプログラミング言語で、外部のライブラリはfiddleを使用してアクセスします。 |
- | require 'dl/import' | + | #html{{ |
- | molude dxlib | + | <pre class="brush: ruby;"> |
- | extend DL::Importer | + | require "fiddle/import" |
- | dlload "./dxlib_x32.dll" | + | |
- | extern "int DX_OpenPort( char *, long )" | + | module DXLIB |
- | end | + | extend Fiddle::Importer |
- | devid = dxlib.DX_OpenPort( "ポート名", ボーレート ) | + | dlload './dxlib_x32.dll' |
+ | extern 'void * DX_OpenPort( const char *, long )' | ||
+ | extern 'char DX_Active( void * )' | ||
+ | extern 'char DX_Ping( void *, unsigned char, unsigned short * )' | ||
+ | extern 'char DX_ClosePort( void * )' | ||
+ | end | ||
+ | |||
+ | devid = dxlib.DX_OpenPort( 'ポート名', ボーレート ) | ||
+ | </pre> | ||
+ | }} | ||
+ | |||
+ | LinuxやmacOSの場合は予め[[ライブラリを再構築>#w5c096b8]]しておいて下さい。 | ||
***Python [#mc6a5a49] | ***Python [#mc6a5a49] | ||
- | 'SampleCode\Ruby'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ | + | 'SampleCode\Python'フォルダにサンプルが同梱されます。ポート・ボーレート・ID等は使用する環境に合わせて適宜修正して使用します。~ |
- | [[Python:http://www.python.jp/]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスすることが出来ます。~ | + | [[Python:http://www.python.jp]]はオープンソースの動的なプログラミング言語で、外部のDLLへ簡易にアクセスできます。~ |
- | LinuxでLoadLibraryを呼び出す際はcdllインスタンスを使用します。 | + | 各APIのPython用の宣言を定義したdxlib.pyをimportするだけで済みます。 |
- | dxlib = windll.LoadLibrary( "dxlib_x32.dll" ) # for window | + | #html{{ |
- | dxlib = cdll.LoadLibrary( "./dxlib.so" ) # for linux | + | <pre class="brush: python;"> |
+ | from dxlib import * # dxlibをインポート | ||
+ | </pre> | ||
+ | }} | ||
+ | なおdxlib.pyはctypesによるDLLの単純なラッパーに過ぎませんので、Pythonならではの抽象的な定義は何一つ受け付けてくれません。Pythonからプログラミングを始めた方は微妙に扱いづらいかと思いますので、詳細はサンプルコードを参考にしてください。 | ||
+ | |||
+ | LinuxやmacOSの場合は予め[[ライブラリを再構築>#w5c096b8]]しておいて下さい。 | ||
***Java [#ceff395d] | ***Java [#ceff395d] | ||
Line 286: | Line 357: | ||
unloadlibrary('dxlib') | unloadlibrary('dxlib') | ||
- | ***Linux [#w5c096b8] | + | ***Linux & macOS[#w5c096b8] |
- | Linux上でdxlibをコンパイルする方法を紹介します。~ | + | LinuxないしmacOS上でのdx2libのコンパイル方法を紹介します。~ |
- | +コンパイル準備~ | + | +ダウンロードと展開~ |
- | ダウンロードファイルを解凍~ | + | ライブラリのアーカイブファイルをダウンロードし展開~ |
- | +オブジェクトファイルの作成~ | + | #html{{ |
- | gcc dxlib.cpp -o dxlib.o | + | <pre class="brush: bash;"> |
- | +共有ライブラリの作成~ | + | wget https://www.besttechnology.co.jp/download/DXLIB_V4.6.zip |
- | RubyやPython等で使用する場合のみ。~ | + | unzip DXLIB_V4.6.zip |
- | gcc -fPIC -shared dxlib.cpp -o dxlib.so | + | </pre> |
- | +コンパイル~ | + | }} |
- | dxlibのオブジェクトファイルとC言語ソースを合わせてコンパイルする。~ | + | +ライブラリ及び共有ライブラリの生成~ |
+ | DXLIBディレクトリに移動し同梱のスクリプトファイルを実行~ | ||
+ | gccは予めインストールされている必要がある | ||
+ | #html{{ | ||
+ | <pre class="brush: bash;"> | ||
+ | cd DXLIB_v4.6/DXLIB | ||
+ | bash ./build_dxlib.sh | ||
+ | </pre> | ||
+ | }} | ||
+ | コンパイルが成功するとライブラリファイルがサンプルディレクトリにコピーされる | ||
+ | +ユーザプログラムとのリンク~ | ||
+ | 生成したライブラリファイルと自身のソースをリンクする。~ | ||
ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~ | ポート・ボーレート等は使用する環境に合わせて適宜追加・修正する。~ | ||
- | ライブラリは必要に合わせて追加する。~ | + | ライブラリ検索パスは必要に合わせて変更する。~ |
- | gcc sample.c dxlib.o -o sample | + | #html{{ |
+ | <pre class="brush: bash;"> | ||
+ | gcc sample.c -L. -ldxlib -o sample | ||
+ | </pre> | ||
+ | }} | ||
- | なお、コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存するのがLinuxですので、そのまま使用できない場合は適宜ソースを修正下さい。 | + | 'SampleCode\C'のサンプルプログラムはmakeを使ってコンパイルできます。 |
+ | #html{{ | ||
+ | <pre class="brush: bash;"> | ||
+ | make smpl14_DXL_velocity (特定のソースのみコンパイル) | ||
+ | make (カレントの全ソースをコンパイル) | ||
+ | </pre> | ||
+ | }} | ||
+ | コンパイルや実行にあたってI/Fやカーネル・ディストリビューションに依存しますので、そのまま使用できない場合は適宜ソースを修正下さい。またWindowsを前提とした_DYNAMICLOADマクロが宣言されているとコンパイルできません。~ | ||
+ | なおI/Fのポート名やボーレート等はサンプル共通として「dxmisc.h」に記述してありますので、環境に応じて修正した上でコンパイルして下さい。 | ||
**API [#ybae1454] | **API [#ybae1454] | ||
- | 本ライブラリはシリアル通信を行うコードを記述しなくて良いのですが、デバイスIDという番号を用いて使用するシリアルI/Fを一元的に管理します。また、制御対象となるDynamixelのIDを指定し、そのコントロールテーブルへの読み書き行うAPIが用意されています。~ | + | Dynamixel Libraryではシリアル通信を直接意識するコードを記述せずに、対象IDのデバイスのコントロールテーブルへの読み書き行うAPIを用意しています。~ |
- | 自身のC言語で記述されたソースプログラムにdxlib.hをインクルードする事で、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。 | + | C言語のソースにdxlib.hをインクルードすれば、APIを使用するのに必要なプロトタイプとマクロの定義がなされます。 |
''注意事項'':~ | ''注意事項'':~ | ||
Line 325: | Line 419: | ||
~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~ | ~オープンに成功した場合は0以外の値、失敗した場合は0を返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | // COM10を9600bpsでオープン | + | <pre class="brush: c;"> |
- | dev = DX_OpenPort ("\\\\.\\COM10", 9600); | + | TDeviceID dev; |
+ | // COM10を9600bpsでオープン | ||
+ | dev = DX_OpenPort ("\\\\.\\COM10", 9600); | ||
+ | </pre> | ||
+ | }} | ||
***DX_ClosePort [#w1ab7cbb] | ***DX_ClosePort [#w1ab7cbb] | ||
Line 340: | Line 438: | ||
~クローズに成功した場合はtrue、失敗した場合はfalseを返す。 | ~クローズに成功した場合はtrue、失敗した場合はfalseを返す。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | // オープン | + | <pre class="brush: c;"> |
- | dev = DX_OpenPort ("\\\\.\\COM10", 9600); | + | dev = DX_OpenPort ("\\\\.\\COM10", 9600); |
- | if (dev) { | + | if (dev) { |
- | ... (中略) | + | ... (中略) |
- | // クローズ | + | // クローズ |
- | DX_ClosePort (dev); | + | DX_ClosePort (dev); |
- | } | + | } |
+ | </pre> | ||
+ | }} | ||
***DX_SetBaudrate [#ba9f52b8] | ***DX_SetBaudrate [#ba9f52b8] | ||
既にオープンされている[[TDeviceID>#TDeviceID]]の通信速度の変更を行う。~ | 既にオープンされている[[TDeviceID>#TDeviceID]]の通信速度の変更を行う。~ | ||
実行すると強制的に受信バッファがクリアされる。~ | 実行すると強制的に受信バッファがクリアされる。~ | ||
- | なお、Linux環境におけるボーレートの設定は、POSIX.1でサポートする値(50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000, 3000000, 3500000, 4000000)であればtcsetattrを使用して処理するが、これらの値に当てはまらない場合はioctrlを使用する。その際I/Fがこれらのボーレートに対応していなかったり、ioctrlをサポートしない場合、本APIは失敗する。 | ||
bool DX_SetBaudrate (TDeviceID dvid, long baud); | bool DX_SetBaudrate (TDeviceID dvid, long baud); | ||
-パラメータ | -パラメータ | ||
Line 363: | Line 462: | ||
~通信速度の変更が成功するとtrue、失敗するとfalseを返す。~ | ~通信速度の変更が成功するとtrue、失敗するとfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | // オープン | + | <pre class="brush: c;"> |
- | dev = DX_OpenPort ("\\\\.\\COM10", 9600); | + | TDeviceID dev; |
- | if (dev) { | + | // オープン |
- | // 通信速度を1M[bps]に変更 | + | dev = DX_OpenPort ("\\\\.\\COM10", 9600); |
- | DX_SetBaudrate (dev, 1000000); | + | if (dev) { |
- | ... (中略) | + | // 通信速度を1M[bps]に変更 |
- | // クローズ | + | DX_SetBaudrate (dev, 1000000); |
- | DX_ClosePort (dev); | + | ... (中略) |
- | } | + | // クローズ |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_Active [#ie20e4a7] | ***DX_Active [#ie20e4a7] | ||
Line 385: | Line 488: | ||
~指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。 | ~指定されたdvidが使用可能な場合はtrue、使用不可の場合はfalseを返す。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | // オープン | + | <pre class="brush: c;"> |
- | dev = DX_OpenPort ("\\\\.\\COM10", 9600); | + | TDeviceID dev; |
- | if (dev) { | + | // オープン |
- | while (DX_Active (dev)) { | + | dev = DX_OpenPort ("\\\\.\\COM10", 9600); |
- | ... (中略) | + | if (dev) { |
- | } | + | while (DX_Active (dev)) { |
- | // クローズ | + | ... (中略) |
- | DX_ClosePort (dev); | + | } |
- | } | + | // クローズ |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_SetTimeOutOffset [#h4a1b54e] | ***DX_SetTimeOutOffset [#h4a1b54e] | ||
I/FやOSの都合で生じるであろうタイムラグを予め設定する。~ | I/FやOSの都合で生じるであろうタイムラグを予め設定する。~ | ||
- | ライブラリ内で想定した受信時間と指定されたタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理される。~ | + | 内部で算出している受信タイムアウト時間とタイムアウトオフセット時間を加算した時間を超えた場合に、タイムアウトエラーとして処理する。~ |
- | デフォルトは20。 | + | デフォルトは30[ms]。 |
void DX_SetTimeOutOffset (TDeviceID dvid, uint32_t offsettime); | void DX_SetTimeOutOffset (TDeviceID dvid, uint32_t offsettime); | ||
-パラメータ | -パラメータ | ||
Line 424: | Line 531: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | // オープン | + | TDeviceID dev; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 57143); | + | TErrorCode err; |
- | if (dev) { | + | // オープン |
- | // ID=1にPINGを発行 | + | dev = DX_OpenPort ("\\\\.\\COM10", 57143); |
- | if (DX_Ping (dev, 1, &err)) | + | if (dev) { |
- | printf ("Found [%08X]\n", err); | + | // ID=1にPINGを発行 |
- | else | + | if (DX_Ping (dev, 1, &err)) |
- | printf ("Not found [%08X]\n", err); | + | printf ("Found [%08X]\n", err); |
- | // クローズ | + | else |
- | DX_ClosePort (dev); | + | printf ("Not found [%08X]\n", err); |
- | } | + | // クローズ |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_Ping2 [#g16504b3] | ***DX_Ping2 [#g16504b3] | ||
PINGインストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。~ | PINGインストラクションでBROADCASTING IDを指定して不特定の対象の応答を確認する。~ | ||
- | 応答時間がDynamixelの種類によって差があるため、それらが混在している環境では正確な情報を取得できない場合がある。 | + | BROADCASTING IDを指定した場合の応答時間はデバイスによって差があるため、異なるデバイスが混在している環境では正確な情報を取得できない場合がある。 |
bool DX_Ping2 (TDeviceID dvid, uint32_t *num, TDxAlarmStatus *AlarmStatus, TErrorCode *err); | bool DX_Ping2 (TDeviceID dvid, uint32_t *num, TDxAlarmStatus *AlarmStatus, TErrorCode *err); | ||
-パラメータ | -パラメータ | ||
Line 449: | Line 560: | ||
--[[TDxAlarmStatus>#TDxAlarmStatus]] '''*AlarmStatus''' | --[[TDxAlarmStatus>#TDxAlarmStatus]] '''*AlarmStatus''' | ||
~検索で見つかったデバイス情報の保存先。~ | ~検索で見つかったデバイス情報の保存先。~ | ||
- | 少なくともnumで指定したサイズを確保しておく必要がある。 | + | 少なくともnumで指定したサイズ分の領域を確保しておく必要がある。 |
--[[TErrorCode>#TErrorCode]] '''*err''' | --[[TErrorCode>#TErrorCode]] '''*err''' | ||
~エラーコード。 | ~エラーコード。 | ||
Line 456: | Line 567: | ||
~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~1台以上のデバイスからの応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t id; | + | TDeviceID dev; |
- | TDxAlarmStatus stat[254]; | + | TErrorCode err; |
- | int i; | + | uint8_t id; |
- | uint32_t num = 254; | + | TDxAlarmStatus stat[254]; |
- | // オープン | + | int i; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 57143); | + | uint32_t num = 252; |
- | if (dev) { | + | // オープン |
- | // 不明な対象に対してPINGを発行 | + | dev = DX_OpenPort ("\\\\.\\COM10", 57143); |
- | // numには予め254の値を指定したので、最大254台まで見つけようとする | + | if (dev) { |
- | if (DX_Ping2 (dev, &num, stat, &err)) { | + | // 不明な対象に対してPINGを発行 |
- | // 1台以上見つかるとnumには見つかった数が返ってくる | + | if (DX_Ping2 (dev, &num, stat, &err)) { |
- | for (i = 0; i < num; i++) | + | for (i = 0; i < num; i++) |
- | printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); | + | printf ("Found ID=%d %02X\n", stat[i].id, stat[i].Status); |
- | } | + | } |
- | // クローズ | + | // クローズ |
- | DX_ClosePort (dev); | + | DX_ClosePort (dev); |
- | } | + | } |
+ | </pre> | ||
+ | }} | ||
***DX_ReadByteData [#u7d86432] | ***DX_ReadByteData [#u7d86432] | ||
Line 494: | Line 607: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t dat; | + | TDeviceID dev; |
- | // オープン | + | TErrorCode err; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | uint8_t dat; |
- | if (dev) { | + | // オープン |
- | // ID=1のAX-12からLEDの状態を取得 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX_ReadByteData (dev, 1, 25, &dat, &err)) { | + | if (dev) { |
- | printf ("LED STAT=%d\n", dat); | + | // ID=1のAX-12からLEDの状態を取得 |
- | } | + | if (DX_ReadByteData (dev, 1, 25, &dat, &err)) { |
- | DX_ClosePort (dev); | + | printf ("LED STAT=%d\n", dat); |
- | } | + | } |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_WriteByteData [#ma2205f0] | ***DX_WriteByteData [#ma2205f0] | ||
Line 526: | Line 643: | ||
BROADCASTING IDを指定した場合は応答待ちを行わない。 | BROADCASTING IDを指定した場合は応答待ちを行わない。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t dat; | + | TDeviceID dev; |
- | // オープン | + | TErrorCode err; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | uint8_t dat; |
- | if (dev) { | + | // オープン |
- | // ID=1のAX-12からLEDの状態を取得 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX_ReadByteData (dev, 1, 25, &dat, &err)) { | + | if (dev) { |
- | dat ^= 1; // ビット反転 | + | // ID=1のAX-12からLEDの状態を取得 |
- | // ID=1のAX-12へLEDの状態を設定 | + | if (DX_ReadByteData (dev, 1, 25, &dat, &err)) { |
- | DX_WriteByteData (dev, 1, 25, dat, &err); | + | dat ^= 1; // ビット反転 |
- | } | + | // ID=1のAX-12へLEDの状態を設定 |
- | DX_ClosePort (dev); | + | DX_WriteByteData (dev, 1, 25, dat, &err); |
- | } | + | } |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_ReadWordData [#x202d573] | ***DX_ReadWordData [#x202d573] | ||
Line 559: | Line 680: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint16_t dat; | + | TDeviceID dev; |
- | // オープン | + | TErrorCode err; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | uint16_t dat; |
- | if (dev) { | + | // オープン |
- | // ID=1のAX-12から現在位置を取得 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX_ReadWordData (dev, 1, 36, &dat, &err)) { | + | if (dev) { |
- | printf ("PRESENT POS=%d\n", dat); | + | // ID=1のAX-12から現在位置を取得 |
- | } | + | if (DX_ReadWordData (dev, 1, 36, &dat, &err)) { |
- | DX_ClosePort (dev); | + | printf ("PRESENT POS=%d\n", dat); |
- | } | + | } |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_WriteWordData [#pcc1b3ce] | ***DX_WriteWordData [#pcc1b3ce] | ||
Line 591: | Line 716: | ||
BROADCASTING IDを指定した場合は応答待ちを行わない。 | BROADCASTING IDを指定した場合は応答待ちを行わない。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | // オープン | + | TDeviceID dev; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | TErrorCode err; |
- | if (dev) { | + | // オープン |
- | // ID=1のAX-12へ位置(511)を指令 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | DX_WriteWordData (dev, 1, 30, 511, &err); | + | if (dev) { |
- | DX_ClosePort (dev); | + | // ID=1のAX-12へ位置(511)を指令 |
- | } | + | DX_WriteWordData (dev, 1, 30, 511, &err); |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_ReadLongData [#w341e7a5] | ***DX_ReadLongData [#w341e7a5] | ||
Line 619: | Line 748: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint32_t dat; | + | TDeviceID dev; |
- | // オープン | + | TErrorCode err; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | uint32_t dat; |
- | if (dev) { | + | // オープン |
- | // ID=1のXM430から現在位置を取得 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX_ReadLongData (dev, 1, 132, &dat, &err)) { | + | if (dev) { |
- | printf ("PRESENT POS=%d\n", dat); | + | // ID=1のXM430から現在位置を取得 |
- | } | + | if (DX_ReadLongData (dev, 1, 132, &dat, &err)) { |
- | DX_ClosePort (dev); | + | printf ("PRESENT POS=%d\n", dat); |
- | } | + | } |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_WriteLongData [#k42e5e5f] | ***DX_WriteLongData [#k42e5e5f] | ||
Line 651: | Line 784: | ||
BROADCASTING IDを指定した場合は応答待ちを行わない。 | BROADCASTING IDを指定した場合は応答待ちを行わない。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | // オープン | + | TDeviceID dev; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | TErrorCode err; |
- | if (dev) { | + | // オープン |
- | // ID=1のXM430へ位置(1024)を指令 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | DX_WriteLongData (dev, 1, 30, 1024, &err); | + | if (dev) { |
- | DX_ClosePort (dev); | + | // ID=1のXM430へ位置(1024)を指令 |
- | } | + | DX_WriteLongData (dev, 1, 30, 1024, &err); |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_ReadBlockData [#b8a1ae1e] | ***DX_ReadBlockData [#b8a1ae1e] | ||
Line 681: | Line 818: | ||
~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ~正常な応答が得られた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t comp[4]; | + | TDeviceID dev; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | TErrorCode err; |
- | if (dev) { | + | uint8_t comp[4]; |
- | // ID=1のAX-12+からコンプライアンスのデータを取得 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (DX_ReadBlockData (dev, 1, 26, comp, 4, &err) { | + | if (dev) { |
- | printf ( | + | // ID=1のAX-12+からコンプライアンスのデータを取得 |
- | "CWM=%d CCWM=%d CWS=%d CCWS=%d\n", | + | if (DX_ReadBlockData (dev, 1, 26, comp, 4, &err) { |
- | comp[0], comp[1], comp[2], comp[3] | + | printf ( |
- | ); | + | "CWM=%d CCWM=%d CWS=%d CCWS=%d\n", |
- | } | + | comp[0], comp[1], comp[2], comp[3] |
- | DX_ClosePort (dev); | + | ); |
- | } | + | } |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_WriteBlockData [#fcf55aa0] | ***DX_WriteBlockData [#fcf55aa0] | ||
Line 717: | Line 858: | ||
BROADCASTING IDを指定した場合は応答待ちを行わない。 | BROADCASTING IDを指定した場合は応答待ちを行わない。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t comp[4] = { 0, 1, 200, 200 }; | + | TDeviceID dev; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | TErrorCode err; |
- | if (dev) { | + | uint8_t comp[4] = { 0, 1, 200, 200 }; |
- | // ID=1のAX-12+のコンプライアンスを変更 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | DX_WriteBlockData (dev, 1, 26, comp, 4, &err); | + | if (dev) { |
- | DX_ClosePort (dev); | + | // ID=1のAX-12+のコンプライアンスを変更 |
- | } | + | DX_WriteBlockData (dev, 1, 26, comp, 4, &err); |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_ReadSyncData [#oc111b2e] | ***DX_ReadSyncData [#oc111b2e] | ||
Line 773: | Line 918: | ||
~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~ | ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。~ | ||
-使用例 | -使用例 | ||
- | #define _POS1 (400) | + | #html{{ |
- | #define _POS2 (511) | + | <pre class="brush: c;"> |
+ | #define _POS1 (400) | ||
+ | #define _POS2 (511) | ||
- | TDeviceID dev; | + | TDeviceID dev; |
- | TErrorCode err; | + | TErrorCode err; |
- | uint8_t param[8] = { | + | uint8_t param[8] = { |
- | 30, // アドレス (Goal Position) | + | 30, // アドレス (Goal Position) |
- | 2, // データ長 (2 byte) | + | 2, // データ長 (2 byte) |
- | // ID=1用データ | + | // ID=1用データ |
- | 1, | + | 1, |
- | _POS1 & 0xff, | + | _POS1 & 0xff, |
- | _POS1 >> 8, | + | _POS1 >> 8, |
- | // ID=2用データ | + | // ID=2用データ |
- | 2, | + | 2, |
- | _POS2 & 0xff, | + | _POS2 & 0xff, |
- | _POS2 >> 8 | + | _POS2 >> 8 |
- | }; | + | }; |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (dev) { | + | if (dev) { |
- | // 2つのAX-12へ同時に位置を指令 | + | // 2つのAX-12へ同時に位置を指令 |
- | DX_WriteSyncData (dev, param, 8, &err); | + | DX_WriteSyncData (dev, param, 8, &err); |
- | DX_ClosePort (dev); | + | DX_ClosePort (dev); |
- | }; | + | } |
+ | </pre> | ||
+ | }} | ||
***DX_TxPacket [#r051327a] | ***DX_TxPacket [#r051327a] | ||
Line 817: | Line 966: | ||
~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。 | ~インターフェースより送信が行われた場合はtrue、それ以外はfalseを返す。 | ||
-使用例 | -使用例 | ||
- | TDeviceID dev; | + | #html{{ |
- | TErrorCode err; | + | <pre class="brush: c;"> |
- | uint8_t param[2] = { | + | TDeviceID dev; |
- | 25, // アドレス (LED) | + | TErrorCode err; |
- | 0, // データ | + | uint8_t param[2] = { |
- | }; | + | 25, // アドレス (LED) |
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | 0, // データ |
- | if (dev) { | + | }; |
- | // ID=1のAX-12+のLEDを消灯 | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | DX_TxPacket (dev, 1, INST_WRITE, param, 2, &err); | + | if (dev) { |
- | DX_ClosePort (dev); | + | // ID=1のAX-12+のLEDを消灯 |
- | }; | + | DX_TxPacket (dev, 1, INST_WRITE, param, 2, &err); |
+ | DX_ClosePort (dev); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
***DX_RxPacket [#r280cda8] | ***DX_RxPacket [#r280cda8] | ||
Line 852: | Line 1005: | ||
~受信成功時はtrue、それ以外はfalseを返す。 | ~受信成功時はtrue、それ以外はfalseを返す。 | ||
-使用例 | -使用例 | ||
- | int i; | + | #html{{ |
- | uint32_t len; | + | <pre class="brush: c;"> |
- | TDeviceID dev; | + | int i; |
- | TErrorCode err; | + | uint32_t len; |
- | uint8_t param[2] = { | + | TDeviceID dev; |
- | 25, // アドレス (LED) | + | TErrorCode err; |
- | 1, // サイズ | + | uint8_t param[2] = { |
- | }; | + | 25, // アドレス (LED) |
+ | 1, // サイズ | ||
+ | }; | ||
- | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); | + | dev = DX_OpenPort ("\\\\.\\COM10", 1000000); |
- | if (dev) { | + | if (dev) { |
- | // ID=1のAX-12+からLEDの状態を読み出す要求 | + | // ID=1のAX-12+からLEDの状態を読み出す要求 |
- | if (DX_TxPacket (dev, 1, INST_READ, param, 2, &err)) { | + | if (DX_TxPacket (dev, 1, INST_READ, param, 2, &err)) { |
- | // ステータスパケットを受信 | + | // ステータスパケットを受信 |
- | DX_RxPacket (dev, dat, sizeof (dat), &len, 100, &err); | + | DX_RxPacket (dev, dat, sizeof (dat), &len, 100, &err); |
- | for (i = 0; i < len; i++) { | + | for (i = 0; i < len; i++) { |
- | printf ("[%02X]", dat[i]); | + | printf ("[%02X]", dat[i]); |
- | } | + | } |
- | } | + | } |
- | DX_ClosePort (dev); | + | DX_ClosePort (dev); |
- | }; | + | } |
+ | </pre> | ||
+ | }} | ||
***DXLIBのオリジナルな定義 [#af9ca340] | ***DXLIBのオリジナルな定義 [#af9ca340] |