お世話になります。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で質問しましょう!
似たような質問が見つかりました
- Windows 10 windows11のUSB接続の機器がcomポートに表示されない。 3 2023/04/13 07:51
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- 格安スマホ・SIMフリースマホ J-COMモバイル新規申込みについて質問です 先日J-COMモバイル新規申込みしました 数日後に発送 0 2023/07/13 16:15
- その他(開発・運用・管理) おんどとりWebStorage APIから温度情報を取得し表示したい 2 2023/08/03 09:53
- Wi-Fi・無線LAN テレワークで会社からPCは借りれるのですが、今回は前回と違いネット回線は自分で用意しないといけなくな 5 2022/04/28 21:54
- FTTH・光回線 ソフトバンク光2年縛り IP電話番号 同番移行出来ない? 光回線変更は面倒で難しいですか? 1 2023/01/08 21:54
- ビデオカード・サウンドカード 6ピン 8ピン 変換 2 2022/08/20 22:06
- 宇宙科学・天文学・天気 AIが答えた方程式 1 2023/02/20 00:12
- 発達障害・ダウン症・自閉症 中学の時にIQ82の境界知能と診断されました。 今の私も、やはり境界知能でしょうか? そしてこれは、 3 2023/02/19 00:37
- カスタマイズ(車) クルマのリアシート交換でこの場合は取り付け可能でしょうか? 4 2023/02/04 08:36
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
write関数でEAGAINのエラー発生...
-
mp3再生中のISampleGrabberにつ...
-
WinsockAPIのrecvfromの受信デ...
-
誤り制御方式の誤り検出再送要...
-
Macターミナルで実行中のプログ...
-
VBAの配列サイズとメモリに関して
-
なんかC言語でプログラム書いて...
-
VBSの処理中一旦処理を止めて再...
-
プログラミング ソースコード
-
DoEvents関数って何?
-
MACで動く実行ファイルをWindow...
-
Webプログラムってネイティブア...
-
COMBOBOXで日付入力
-
VBA
-
スーパーのレジで並んでいたら...
-
TCP/IP通信時のサーバーからの受信
-
GetDlgItemInt( ) c++
-
Excel-VBAのmsgBox()の不思議
-
指定したフォルダーを最前面表...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# シリアル通信でデータ受信...
-
WriteFile()でのデータ送信がで...
-
winsockでソケット通信の開発を...
-
「スイッチングハブのバッファ...
-
socket: recvはいつ,どれだけ...
-
シリアル通信の出力バッファと...
-
Connection reset by peer
-
RS232C通信(PC⇔PLC)
-
RS-232Cでバイナリデータを受信...
-
WaitForMultipleObjects関数の...
-
Linuxでのシリアル通信について...
-
rs232cでの受信データ(mscomm)...
-
UDP処理のエラーについて
-
SocketのSend関数でのCLOSEの検...
-
ソケット通信内 read関数について
-
recv関数の受信結果について
-
シリアルポート通信
-
MSCommでoutputできない
-
SerialPortのDataReceivedイベ...
-
VB2005でWin32APIを用いてRS-23...
おすすめ情報