• ベストアンサー

COMポートの同時オープン同時読み込み

お世話になります。RS232機器で同じ仕様の計測機器を つなげて、同時に測定をしたいと考えています。 WindowsXPでVC++で作成します。 CreateFile,ReadFileで実現するかと思うのですが、 プログラミング上、まったく同一時刻に二つのCOMを 開くことは現実不可能でしょうか? 正確にいうと、同一時刻に一定量蓄積された2つのCOMバッファ から同時にPCのメモリに展開するという処理です。 計測機器同士は、シンクロケーブルがありますので ハードウェア的にタイミングを合わせて、データ出力してきます。 ということは、パソコン側では理論的にCOM1、COM2に接続された 機器からは、データが一定量蓄積される時間はともに一定時間 であるといえます。 逆にいうと、COM1、COM2からデータを同時にぬきとって やらなければ、のちのちCOM1のバッファとCOM2のバッファ でずれが生じてくるはずです。 たとえばDSPなんかですと、パイプ命令てのがあり CreateFile("COM1"...) | CreateFile("COM2"...) とすることで、2つの命令を同じ時刻にスタート可能だと 思います。(DSPにCreateFileのような命令はないですが) また、スレッドを使うという考えもありましたが、自分自身、 スレッドに対する知識がとぼしくて・・・ こうした処理をする際、ソフトウェアでの処理というのは 事実上不可能に見えてきますが、実際はなにか回避策というか 解決策があるのでしょうか? よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kaha
  • ベストアンサー率23% (41/177)
回答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);

その他の回答 (1)

  • rot-N
  • ベストアンサー率27% (118/432)
回答No.1

回答1) すくなくともINTELのCPUであれば、同時に別のI/Oにアクセスすることは出来ません。アドレスバスの信号でアドレス指定をして、データバス経由でデータを書き込んでRS-232Cのポートを使えるようにするのですが、アドレスバスもデータバスも、一組しか有りません。 (これはDSPでも同じだと思うのですがねぇ・・・(^^;)) 回答2) RS-232Cの転送速度は、9600bit/秒から、せいぜい115200bit/秒です。 CPUそのものの1命令の実行時間は、さて、どのくらいでしょう? さて、両方の時間を比べてみましょう。 ある程度、判りそうな方なので、こんな回答をしてみました(^o^)。

scheimpflug
質問者

補足

早速ご回答頂き、ありがとうございました。 回答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