- ベストアンサー
パソコンでsony EVI-D100を制御する方法
- C/C++初心者のため、パソコンでsony EVI-D100を制御する方法について調査中です。
- Linux向けのライブラリを使うとエラーが発生してしまい、Windowsで利用する方法がわかりません。
- libviscawinというWindows向けのライブラリについて情報を探しています。初心者ですが、ご教示いただければ幸いです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
if (bSet) { dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ; } else { dcb.fDtrControl = DTR_CONTROL_ENABLE ; } の部分は、最初にbSetが0なら、DTR_CONTROL_ENABLE が設定されるので、 DSRは常時ONとなりフロー制御されません。 bSet = 0; dcb.fInX = dcb.fOutX = bSet ; dcb.XonChar = ASCII_XON ; dcb.XoffChar = ASCII_XOFF ; dcb.XonLim = 100 ; dcb.XoffLim = 100 ; の部分は、100バイト未満の通信で直ぐに読み込みされれば、バッファに 100バイト以上たまることがないので、結果的にフロー制御されません。 片方の動作が遅い場合やバッファが小さい場合にはフロー制御は必須 ですが、今回の場合には該当しないと思いますし、VISCAプロトコルは フロー制御していないので、無くても良いと思います。 #悪影響が無ければ、他への転用も考慮して残しておくのもありですが・・ #ただ、その場合、ソースにコメントは必須です。
その他の回答 (3)
- equinox2
- ベストアンサー率48% (321/660)
以下のソースを見てみました。 http://onishi-lab.jp/programming/rs232c_win.html このソースで動けば、それをベースに必要なコマンドを追加していけば良さそうですね。 動作確認はできないですが、若干気になる部分があります。 dcb.fOutxDsrFlow = bSet ; ← ** ここは左右が逆? if (bSet) { dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ; } else { dcb.fDtrControl = DTR_CONTROL_ENABLE ; } 上記のままだとbSetは BYTE bSet ; で定義しているだけですよね。 GetCommState(hCom, &dcb) ; で読み込んだ状態に対して必要なパラメータを変更して SetCommState(hCom, &dcb); で再設定しているように読めるのですが・・・ いずれにせよ、フロー制御がらみで、VISCAプロトコル は フロー制御していないようなので、このままで動けば良いですが 動かないようであればこの辺を中心に見直してください。 Cの低水準IOを使用してRS-232Cを制御する方法は定石だと思うので、 検索すればいろんな情報が見つかると思います。 http://www.geocities.jp/terukat/_geo_contents_/win/comm.html あたりも参考になるかも・・ >ご指摘どおり、開発は困難に思われますが卒業研究なのでなんとか頑張ってみようと思います。 業務での開発かと思っていましたが、卒業研究であれば完璧に造るよりは、動かすことが優先ですよね。 時間は少ないかも知れませんががんばってください。 #最近、プログラムを書かないので実証はできませんが、 #しばらくはここをチェックしますので、何かありましたら、 #また質問してください。 (元制御系SE、今は金融系SEです)
お礼
equinox2さん 度々有益なアドバイスありがとうございます。教えていただいたサイトも参考にさせていただきます。 bSetに関しては確かにBYTE bSetで定義しているだけみたいなので、適当なのですが dcb.fOutxDsrFlow = bSet ; の前に bset=0; としてみました。 EVI-D100のテクニカルマニュアルにも「XON/XOFFやRTS/CTSなどを使ったフローコントロールは行いません」と記載されていたのですが、なぜか動かすことができました。 いろいろご親切にありがとうございます。 私の所属している研究室はもちろん学科でもプログラミングを専門にやっているわけではないので、質問できる人もおらず困っていました。 本当に感謝しております。 また何か質問するかもしれませんがよろしくお願いします。
補足
フロー制御部分 dcb.fOutxDsrFlow = bSet ; if (bSet) { dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ; } else { dcb.fDtrControl = DTR_CONTROL_ENABLE ; } bSet = 0; dcb.fInX = dcb.fOutX = bSet ; dcb.XonChar = ASCII_XON ; dcb.XoffChar = ASCII_XOFF ; dcb.XonLim = 100 ; dcb.XoffLim = 100 ; をコメントアウトしても動きました。 カメラのテクニカルマニュアルにもフロー制御は行わないと書いてありましたし、このフロー制御部分は書いても、プログラム実行時に反映されていないということでしょうか? 初歩的な質問ですいません。 フロー制御に関して自分でももう少し調べてみます。
- equinox2
- ベストアンサー率48% (321/660)
>webカメラで撮影した画像の情報(座標など)を送り、 撮影した画像の情報を取得する処理は既にCで作成済みなのでしょうか? 画像の取得と画像処理について、既にCで作成済みであれば、libviscaの使用/不使用に拘わらず、そのままCで作成すべきでしょう。 画像の取得と画像処理についてもこれから開発するのであれば、そちらの開発の方が、libviscaをWindowsで使えるようにするか、新たにCでVISCAプロトコルの処理を作成するより難しいのではないでしょうか。 いずれにせよ、CやVBの初心者には開発は困難だと思われます。 私は、RS-232Cの通信については、CでもVBでも何度も開発していますが、画像処理の経験はないのでその部分については残念ながら良くわかりません。
お礼
equinox2さん ご回答ありがとうございます。 画像処理に関してはCで同時並行で作成中です。 EVI-D100の制御に関してですが、 http://onishi-lab.jp/programming/rs232c_win.html などを参考にやってみたところ、なんとか制御できそうです。 シリアル通信の設定でできるのですね。理解していませんでした。 ご指摘どおり、開発は困難に思われますが卒業研究なのでなんとか頑張ってみようと思います。 丁寧なご対応に感謝しております。ありがとうございました。
- equinox2
- ベストアンサー率48% (321/660)
libviscaちょっと探してみましたが、libvisca.hをちょっと見た感じでは #if defined(_WIN32)||defined(WIN32)||defined(__WIN32__) #define WIN #endif #ifdef WIN #include "Windows.h" #else #include <termios.h> #include <unistd.h> #include <sys/ioctl.h> #endif の記述がありましたので、Windows系も考慮されているように思えます。 無責任な発言ではありますが、VISCAプロトコルを以下のリンクで参照した感じでは、RS-232Cでコントロールしているようなので、ライブラリに頼らずコマンド送信を製作するならVBなどが制御し易いかも。 http://www.totsu.co.jp/isp/ispproducts/pdf/D100_tec.pdf # .NET以前のVB6とか・・ ただ、RS-232CでBinariyの送受信の経験がないとかなり大変だとは思います。
お礼
>equinox2さん ご丁寧なアドバイスありがとうございます。 ご指摘どうり、http://freshmeat.net/projects/libvisca/?branch_id=28489&release_id=223895にもlibviscaがwindowsに対応しているようなことが書かれていました。 前回の質問で書けばよかったのですが、私が作りたいシステムの全体像は、 SonyのEVI-D100にwebカメラで撮影した画像の情報(座標など)を送り、それによってEVI-D100を制御するというものです。 >RS-232Cでコントロールしているようなので、ライブラリに頼らずコマンド送信を製作するならVBなどが制御し易いかも。 本当に初心者なのでVBに関して全くわからないのですが、VBでも今回私が考えているようなものは作成可能なのでしょうか? 本当に初歩的な質問ですいません。よろしくお願いします。
お礼
ご回答ありがとうございます。 VISCAプロトコルがフロー制御してないようですし、フロー制御部分は ちゃんとコメントをつけてコメントアウトしておきます。 ご丁寧にありがとうございました。