アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。RS232機器で同じ仕様の計測機器を
つなげて、同時に測定をしたいと考えています。
WindowsXPでVC++で作成します。
CreateFile,ReadFileで実現するかと思うのですが、
プログラミング上、まったく同一時刻に二つのCOMを
開くことは現実不可能でしょうか?
正確にいうと、同一時刻に一定量蓄積された2つのCOMバッファ
から同時にPCのメモリに展開するという処理です。

計測機器同士は、シンクロケーブルがありますので
ハードウェア的にタイミングを合わせて、データ出力してきます。
ということは、パソコン側では理論的にCOM1、COM2に接続された
機器からは、データが一定量蓄積される時間はともに一定時間
であるといえます。
逆にいうと、COM1、COM2からデータを同時にぬきとって
やらなければ、のちのちCOM1のバッファとCOM2のバッファ
でずれが生じてくるはずです。

たとえばDSPなんかですと、パイプ命令てのがあり
CreateFile("COM1"...) | CreateFile("COM2"...)
とすることで、2つの命令を同じ時刻にスタート可能だと
思います。(DSPにCreateFileのような命令はないですが)

また、スレッドを使うという考えもありましたが、自分自身、
スレッドに対する知識がとぼしくて・・・

こうした処理をする際、ソフトウェアでの処理というのは
事実上不可能に見えてきますが、実際はなにか回避策というか
解決策があるのでしょうか?

よろしくお願いいたします。

A 回答 (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);
    • good
    • 0

回答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のデータ量が一致するときもあれば、ずれる時もあるので結論としては難しいのだなと感じましたが、またなにか参考意見ございましたら、よろしくお願いいたします。

補足日時:2005/06/07 13:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!