
お世話になります。RS232機器で同じ仕様の計測機器を
つなげて、同時に測定をしたいと考えています。
WindowsXPでVC++で作成します。
CreateFile,ReadFileで実現するかと思うのですが、
プログラミング上、まったく同一時刻に二つのCOMを
開くことは現実不可能でしょうか?
正確にいうと、同一時刻に一定量蓄積された2つのCOMバッファ
から同時にPCのメモリに展開するという処理です。
計測機器同士は、シンクロケーブルがありますので
ハードウェア的にタイミングを合わせて、データ出力してきます。
ということは、パソコン側では理論的にCOM1、COM2に接続された
機器からは、データが一定量蓄積される時間はともに一定時間
であるといえます。
逆にいうと、COM1、COM2からデータを同時にぬきとって
やらなければ、のちのちCOM1のバッファとCOM2のバッファ
でずれが生じてくるはずです。
たとえばDSPなんかですと、パイプ命令てのがあり
CreateFile("COM1"...) | CreateFile("COM2"...)
とすることで、2つの命令を同じ時刻にスタート可能だと
思います。(DSPにCreateFileのような命令はないですが)
また、スレッドを使うという考えもありましたが、自分自身、
スレッドに対する知識がとぼしくて・・・
こうした処理をする際、ソフトウェアでの処理というのは
事実上不可能に見えてきますが、実際はなにか回避策というか
解決策があるのでしょうか?
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
方法1)
専用ケーブルを作成する。
●参考サイト
シリアルはWINで行こう(T接続の方法)
http://kencreate.ld.infoseek.co.jp/ita/debugc.htm
方法2)
スレッドを使って、WaitCommEvent()で受信を待つ。そして、PostMessageでイベントを発生させる。
●参考サイト
WindowsでRS232Cを使う(イベント駆動を使った通信の例)
http://members.jcom.home.ne.jp/0434383301/vc10.htm
ソース一式ダウンロードが可能です。
下記のようにすると、ReadFile、WriteFileで時間待ちせずに抜けてきます。
CreateFile(PortName[CommPort] ,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
ReadFile(h_CommHandle,RecBuf.GetBuffer(Comstat.cbInQue),Comstat.cbInQue,&NoOfByte,&recop);
WriteFile(h_CommHandle,Msg,Msg.GetLength(),&NoOfByte,&sendop);
::PostMessage(vhWnd,WM_READ_END,0,0);
No.1
- 回答日時:
回答1)
すくなくともINTELのCPUであれば、同時に別のI/Oにアクセスすることは出来ません。アドレスバスの信号でアドレス指定をして、データバス経由でデータを書き込んでRS-232Cのポートを使えるようにするのですが、アドレスバスもデータバスも、一組しか有りません。
(これはDSPでも同じだと思うのですがねぇ・・・(^^;))
回答2)
RS-232Cの転送速度は、9600bit/秒から、せいぜい115200bit/秒です。
CPUそのものの1命令の実行時間は、さて、どのくらいでしょう?
さて、両方の時間を比べてみましょう。
ある程度、判りそうな方なので、こんな回答をしてみました(^o^)。
この回答への補足
早速ご回答頂き、ありがとうございました。
回答1で拝見させていただくに当たり、もともとのハードウェア構造的に無理なのだなと感じさせられました。DSPの例は、単に命令を2つ同時に実行できると言う点を強調したかっただけです。
回答2のほうですが、確かにCPU速度のことはわかるのですが、COMバッファからメインのメモリに転送する際、CPU的にはバッファの開始アドレスから終了アドレスまで指定して、それこそマシン語レベルで一つ一つコピーしていくように感じるのです(私自身、詳しくIntelCPUの仕様を知らないのですが・・・)。私は、PICを良く使うのですが、PICはシリアルで1バイトの受信バッファしかなく、受信したらメインのメモリにコピーして使います。バッファが大量(数千バイト)であると、ReadFile命令が完了するのに非常に時間がかかるのではと考えました。1GHzのCPUで単純に1クロック1命令として、マシン語ひとつの完了時間が1nsでしょうか?バッファが5000バイトあればメインメモリにコピーする時間は5000nsで5μs。COMの速度を便宜的に100000bpsとすると、1bitの速度は10μs。
従って、ひとつの命令でバッファ5000バイトをメインメモリに転送するのであれば、次のCOMバッファを見に行くまでに5μsあり、1ビットのズレもなく取込が可能である。と言う見解でいいのでしょうか?しかしながら、CPUのクロックはCPU内部での話で、バス周りはベースクロックを参考にしないと駄目ですよね?
いずれにしても、現状でデータをとっている限りうまくCOM1とCOM2のデータ量が一致するときもあれば、ずれる時もあるので結論としては難しいのだなと感じましたが、またなにか参考意見ございましたら、よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
WaitForMultipleObjects関数の...
-
Macターミナルで実行中のプログ...
-
VB6.0 SHELLで起動...
-
スロットゲームのプログラミング
-
フレームワークとプロセスの違...
-
STATUSのZフラグについて
-
CImage::ReleaseDC()のエラーで...
-
あるプログラム実行中に別のプ...
-
「単体テスト」に関する深刻な...
-
このレジの並び方は間違ってま...
-
CreateCompatibleDCを初期化時...
-
プロセスの停止
-
Linuxでのスレッド間メッセージ...
-
ACCESS側からEXCELの書式を設定...
-
VBA kernel32 の意味
-
コンソールアプリケーションの...
-
php
-
エクセルVBAの自動変換機能?
-
プロセスが実行中かどうか調べ...
-
他の実行ファイルを実行するプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
「スイッチングハブのバッファ...
-
WriteFile()でのデータ送信がで...
-
socket: recvはいつ,どれだけ...
-
winsockでソケット通信の開発を...
-
RS-232Cでバイナリデータを受信...
-
SerialPortのDataReceivedイベ...
-
シリアル通信エラー
-
C#で通信処理。応答がない場合...
-
Linuxでのシリアル通信について...
-
シリアル通信の出力バッファと...
-
バイナリデータ受信時のデータ順
-
ReadFileについて
-
トラックバック機能を作りたい
-
ソケット通信内 read関数について
-
recv関数の受信結果について
-
ReadFile(GPSとの通信)Win7で...
-
visual c# 2010 シリアル通信ア...
-
WinsockAPIのrecvfromの受信デ...
-
popen実行時にバッファが空の場合
おすすめ情報