あなたの映画力を試せる!POPLETA映画検定(無料) >>

PCにあるCOM1(RS23C)とUSB仮想COM(CNV-USB-A や EZ-USBなど)と比較した場合、
速度的には、どちらの方が早いのでしょうか?
通信速度は、それぞれの機器に依存するとして、PCからの命令に対する応答速度など…
また、データの量によっても、どちらが有利不利などあるのでしょうか?
最近、USB仮想COMの機器をよく見るのですが、単純にPCに標準でCOM(RS232C)ポート
が無いからなのか、それともUSB仮想COMの方が、速度的に有利なのか疑問に思ったのです。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ANo.2です。



"私の勝手なイメージなのですが、PC直接のRS232Cに比べUSBは、PCからの命令に対する反応速度? が遅いようなイメージがあったのですが、そういった事は無いのでしょうか?"
→ それは、USBの処理の仕方次第です。通常のキーボードやマウスは、ユーザーインタフェースなので優先度が低い処理として扱われますので、ラウンドロビンといって順繰りに処理を割り当てられています。それでも、人間の入力する速度からしたら高速でサーチするため、十分間に合います。それに対して、通信処理は優先度が高いので、割り込み処理を使ったりします。こちらは、通信処理が発生するたびに処理をするので、取りこぼしがない訳です。

質問者さんのイメージでは、この前者を持っておられるような感じがしますが、USB仮想COMは、Widowsでの扱いとは違うような気がします。通信処理として扱われているのであれば、後者ではないかと思います。

"USBは、接続をしてからデータの転送は、早いが接続までと接続が終わってから切断までの手順など、いろいろと手順が必要で、遅くなるとか聞いたことがありました。"
→ これもWindowsでの扱いのイメージですね。Windowsでは、通信プロトコルでネゴシエーションなどがあり、確立するまでの手順があり、その手順もプラグ&プレイが可能なようになっていて複雑です。USB仮想COMにおいて、どの程度実装されているかはわかりませんが、Windowsのような冗長な処理が必要とも思えません。

用途は、何でしょうか。WindowsのUSBポートの扱いとは、かなり違うように思うのですが、どうでしょう? 一括りにUSBと言っても、処理内容によって、制御が変わると思います。
    • good
    • 0
この回答へのお礼

非常に詳しいご回答ありがとうございます。
用途としては、いま何かを考えているわけではないのです。
以前、趣味の工作で、秋月のAKI-H8/3052F USB開発キット
(http://akizukidenshi.com/catalog/g/gK-00182/)というのを購入して付属のサンプルプログラムで遊んだのでが、
PCからの命令に対して反応が10ms位後に、出てきていたようなイメージあったのです。
今回質問させていたたいだEZ-USBやCNV-USB-Aとは、物が全然違いますし、
同じイメージを持つこと自体間違いでしたね。

お礼日時:2015/12/10 13:15

USB/RS232C変換アダプタを使った場合と言うことだろうか。



実際に使って試したことがあるが、
「変換アダプタに依存する」
と言う結果になった。
データの取り出しや送り出しの仕組みが悪いのだろうか…。

ハズレなアダプタは、使用するアプリケーションにもよるが、2割から9割程度の速度に感じた。
(2割はひどいだろ?でもマジなんだ)

今はそんな製品はないと思うが、そんな経験があるので、
「実際に比較しないと分からない」
(分からないと言うより安心できない…)
というのが、自分の回答です。


・・・
会社は目的に応じてレガシーI/Fを残したパソコンを採用しろよ!
と密かに思っていた。
    • good
    • 1
この回答へのお礼

貴重なご経験談ありがとうございます。
速度は、機器に依存するとなると、予測は難しいのですね。

お礼日時:2015/12/10 09:17

RS-232Cは、実際のCOM1であっても、通常のUSB変換アダプタであっても、通信プロトコルは同一です。

低速から高速までのビット転送速度(ボーレート)がありますが、これに準拠すれば、速度的に早い遅いの違いはありません。
ビット転送速度:75/110/300/1200/2400/4800/9600/19200/38400/57600/115200 bit/s

RS-232Cとは、シリアルポートの一種です。
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%AA …

今のパソコンの動作周波数にすれば、上記のビット転送速度(最高で115Kbit/sec)からすると遥かに高速ですので、転送するデータ量がいくら多くても、処理には全く問題ありません。

二つのUSB仮想COMの基板を調べてみると、
CNV-USB-A http://www.y2c.co.jp/cnv/cnv_usb.html ----- 高速なRS-232Cのイメージでしょうか。
取扱説明書よりビットレート:300/600/1200/1800/2400/4000/4800/7200/9600/14400/16000/19200/28800/38400/51200/56000/57600/64000/76800/115200/128000/153600/230400/250000/256000/460800/500000/576000/921600 bit/s
※上限が高くなっています。
EZ-USB http://japan.cypress.com/products/ez-usb-fx3-sup … ----- これも、RS-232CというよりUSBをCOMポートとして扱うためのもののようです。

以上から、RS-232CではなくUSBをシリアルポートとして接続するもので、ビット転送速度もRS-232Cより更に高速で通信できるようです。RS-232Cの置き換えもできるでしょうが、もっと高速に周辺機器と通信するためのもののようです。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
USB仮想ポートの方が高速になる可能性があるのですね。
私の勝手なイメージなのですが、PC直接のRS232Cに比べUSBは、PCからの命令に対する反応速度?
が遅いようなイメージがあったのですが、そういった事は無いのでしょうか?
USBは、接続をしてからデータの転送は、早いが接続までと接続が終わってから切断までの手順など、
いろいろと手順が必要で、遅くなるとか聞いたことがありました。

お礼日時:2015/12/10 09:15

通信速度は変わりませんが、昔、USBの方が、希に途切れ途切れに送られて来る事がある(対した影響は無い程度)と先輩に、あくまで昔なので、今もそうかは知りません


単純にPCに無いからだと思います
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCOMポートの通信速度

COMポートはどのぐらいの速度が出るのでしょうか?

また、「COMポート」=「RS-232C」なのでしょうか?
もしそうだとしたら、最大20kbpsしかでないはずだと思うのですが実際にはもっと出てますよねぇ?

Aベストアンサー

COMポートはデジタルのシリアルインタフェースですから、それ単
独で変調ということはありませんので、baud (ボー)という概念
はなじみません。モデムを介した電話線の上では、変調速度の数倍
(あるいは数十倍)の bps となります。というか、逆に bps の数
分の一で変調しないと電話線を通らない。(以上、hyde-laさんへ
のコメント)

で、COMポートは基本的にはRS-232Cです。RS-232CはEIAの規格上は
20kbpsまでしか存在しません。が、各メーカーともそれ以上のもの
を独自に出していて、事実上の標準になってしまっているというそ
れだけのことです。

QC# シリアル通信でデータ受信時の欠損について

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

--------------------------------------------------------------------------------------
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
bytesRead = 0;
// Initialize a buffer to hold the received data
byte[] buffer = new byte[this.serialPort.ReadBufferSize];

try
{
bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
if (true == serialPort.IsOpen)
{
serialPort.DiscardInBuffer();//受信バッファをクリアする
}

}
catch (Exception ex)
{
DataLog.Exception(ex);
}

//派生クラス用の処理
DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
DeviceClassEvent(this, _DeviceClassEventArgs);
}
--------------------------------------------------------------------------------------

ネットの情報を参考に、
ReceivedBytesThreshold の値を期待するデータ量に逐一変えることで
とりあえず正常に取ることが出来たのですが、これでいいのでしょうか?
期待するデータ量がわからなかった場合は使えないのかなとも思います。

データが欠損してしまう理由、
上記の対処法以外の一般的な対処法など有りましたら教えて下さい。

その他参考になるページ等ありましたら教えていただけると大変助かります。

Visualstudio 2013 を使用して C# で開発を行っています。

SerialPort Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際にどうしてもうまくデータを取得出来ません。

5Byteのデータは正常に取得できるのですが、
その直後にくる40Byteのデータは、真ん中あたりの10数Byteや最後の10数Byteしか取れません。


serialPort.DataReceived に登録したイベント関数の中身です。

-------------------------------------------------------------------------------...続きを読む

Aベストアンサー

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Length);
    //if (true == serialPort.IsOpen)
    //{
    // serialPort.DiscardInBuffer();//受信バッファをクリアする
    //}

    // 受信バッファにデータがなくなるまで繰り返し読込む
    while (true)
    {
      if (0 == serialPort.BytesToRead)
      {
        break;
      }
      buffer[bytesRead] = (byte)serialPort.ReadByte();
      bytesRead++;
      System.Threading.Thread.Sleep(0);

      // シリアルポートの受信バッファには、
      // ・必要なブロックの途中から受信している。
      // ・次のブロックの先頭部分も受信されている。
      // 可能性があるので、ここで必要なブロックだけRead()できたことを確認する。
      if (必要なブロックが正常に読めたか確認する関数())
      {
        break;
      }
    }
  }
  catch (Exception ex)
  {
    DataLog.Exception(ex);
  }

  //派生クラス用の処理
  DeviceClassEventArgs _DeviceClassEventArgs = new DeviceClassEventArgs(buffer, bytesRead);
  DeviceClassEvent(this, _DeviceClassEventArgs);
}

DataReceivedイベントが発生したときでも、
シリアルポートへの受信はまだ継続している可能性があるので
不用意にバッファクリアしてはいけない。
非同期の受信処理は、何かと難しいのです。

private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  bytesRead = 0;
  // Initialize a buffer to hold the received data
  byte[] buffer = new byte[this.serialPort.ReadBufferSize];

  try
  {
    //bytesRead = this.serialPort.Read(buffer, 0, buffer.Le...続きを読む

QWindows:RS232Cの設定可能なボーレート

USBシリアル変換ケーブルを使った場合の最高ボーレートは、
ケーブルの仕様または実力に依存するのでしょうか?(921Kbpsなど)

そういったケーブルを使用した場合、
Windowsデバイスマネージャに無い設定値(200Kbpsなど)といった
特殊なボーレート設定も可能でしょうか?

TeraTermを使って手打ちでボーレートを入れて通信したいと思っています。

Aベストアンサー

一般的なUSBシリアル変換ケーブルは、Windowsから、あたかもCOMポートに出力したかの様にドライバーが仲介しますので、WindowsのCOMポートのデバイスマネージャにない設定は出来ないと思います。

従って、最高ボーレートの制限も、ボーレートの設定も、COMポートのデバイスマネージャの範囲内ということになるかと思います。

仮に直接I/Oを制御したとしても、基本的には元のクロックを分周するだけなので、基本的には倍々での設定で、半端なレートには出来ないのと思います。


Windowsになると、だんだん中身に手が出せなくなりますよね。
どうしても任意のボーレートで通信ということになると、いっそ間にマイコンボードを介在させる方が良いのではないでしょうか…(秋月とかで売ってるH8とかの)


ご参考に。

Q仮想COMポートの仕組みについて

仮想COMポートの仕組みについて調査しています。

具体的には、仮想COMポートの仕組みを理解し、実際に実装ができるように調査しています。仮想COMポートの仕組みについて教えていただけないでしょうか。

また、仮想COMポートをC言語で実装する場合、参考となる文献や、Webサイトなどあれば教えていただけないでしょうか。

よろしくお願いします。

Aベストアンサー

仮想プリンタでも仮想ドライブでも何でもそうですが、実際のものとは別のものに置き換えるというのが大前提です。

>仮想COMポートの仕組みについて教えていただけないでしょうか。

というのでしたら、仮想COMポートに送られた信号を、別のものにする、別のものから渡されたデータを仮想COMポートから出力する。といったところでしょうか。

ここでいう「別のもの」というのが、仮想プリンタですとpdfなどの印刷イメージファイル、仮想CDROMドライブですとisoイメージ、仮想プライベートネットワーク(VPN)ですと、特殊なパケットといったところでしょうか。

つまり、いきなり仮想うんたらとかいきなり言われても、これぐらいしか説明できません。


>また、仮想COMポートをC言語で実装する場合、参考となる文献や、Webサイトなどあれば教えていただけないでしょうか。

普通のアプリか何かと勘違いされていませんか?
COMポートはハードウェアなんで、それを仮想化するとなると作らなければいけないのはドライバなんですけど(^^;;;

プラットフォームも何も書かないで、いきなりサンプルとか言われてもねぇ。

WindowsでしたらDDKにCOMポートのドライバのサンプル、あると思いますが。

仮想化なんてのは、入出力先を本物のデバイスではなく別のものにするだけなんですから。apple-orangeさんが何に置き換えるかはわかりませんが。

仮想プリンタでも仮想ドライブでも何でもそうですが、実際のものとは別のものに置き換えるというのが大前提です。

>仮想COMポートの仕組みについて教えていただけないでしょうか。

というのでしたら、仮想COMポートに送られた信号を、別のものにする、別のものから渡されたデータを仮想COMポートから出力する。といったところでしょうか。

ここでいう「別のもの」というのが、仮想プリンタですとpdfなどの印刷イメージファイル、仮想CDROMドライブですとisoイメージ、仮想プライベートネットワーク(VPN)...続きを読む

QCOMポート通信をモニターしたい

現在、PCと組み込み系の端末との間でRS-232C通信をさせています。このRS-232C通信のTXとRXのデータのタイミングなどをモニターできるソフトはありませんでしょうか?

現在RS-232C通信をさせているのですが、組み込み系の端末側にはTCP-RS232C通信変換のモジュールを取り付けていて、PC側もTCP-RS232C変換させるソフトを使用しています。


TCP-RS232C通信変換のモジュールはWIZNET社製のWIZ110SRというのを使用しています。

PC側ではTCP-RS232C通信変換ソフトでWIZNET社製のWIZ VSPというソフトを使用して、TCPで受けたデータをRS-232Cに変換して受信プログラムソフトに転送しています。


このPC側の受信ソフトとTCPへ変換する間のCOMポートの通信をモニターできるようなソフトというものはありませんでしょうか?

どうぞ、ご教授頂きますようお願い致します。

Aベストアンサー

PC自体のCOMポート(USB-Serial変換でも)なら、ソフトでどうにかできる場合もあるでしょうが……

ご使用の機器の場合、PCからはネットワーク端末に見える…のではないでしょうか?
ドライバでCOMポートとして見えるのですか?
# 後者ならソフトで何とかできる…かも知れません。

こちらの組み込み系開発ではラインアイ社の機器を使用しています。
http://www.lineeye.co.jp/html/product_le2500.html
http://www.lineeye.co.jp/html/product_le3500.html
などですね。
http://www.lineeye.co.jp/html/product_LE-200PS.html
http://www.lineeye.co.jp/html/product_LE-150PS.html
でも用途によっては十分かも知れません。
# 組み込み開発に使うのであれば1台あった方が何かと便利です。
# それなりに高機能なので…値段も結構しますけどね。

Qエクセル VBA でのCOMポート認識

エクセルのVBAを使用してあるアプリを作成しています。そのアプリはシリアルポートを使用してある機器と接続する事で実現できます。
そこで質問ですが、当該PCが認識しているCOMポートをVBAのSELECT BOXに表示したいのですがどうやれば(どのような関数?)を使用して実装COMポートを認識するのでしょうか?
もちろん、USB<--->シリアルケーブルを使用した場合もCOMポートだと認識しなければなりません。
よろしくお願いいたします。

Aベストアンサー

こんにちは。

Windowsのプログラム(VBA含む)から、COMポートを扱う場合は、WindowsAPI を使用すれば可能
だと思います。

COMポートの実装チェックには、WindowsAPI の「CreateFile」関数でCOMポートのオープンを実行
して、その関数の戻り値がエラーかどうかを見れば判断できると思います。
ただし、COMポートが実装されていてもエラーになるケース(既に使用中、使用不可に設定されて
いるなど)がありますので、その場合はエラーコードを取得してその値で「実装/非実装」を判断しな
いといけないと思います。

以下に、VBA から WindowsAPI (COMポート制御関連を含む)を利用するに当たって、参考になり
そうなサイトを上げてみました。宜しければ覗いてみて下さい。

■参考サイト
注)リンク切れの際は御容赦下さい。

1)VBAでWindowsAPIを使用してシリアル通信を行う方法

◎WindowsAPI講座
http://www.serpress.co.jp/winapi/
・このページよりリンクされている下記項目「シリアル通信(1)~(4)」のページでVBAから通信関連の
 APIを使用する方法が書かれています。
 NO.12 シリアル通信(1) ←必要なWindowAPI定義の説明
 NO.13 シリアル通信(2) ←シリアルポートのオープンとクローズを説明
 NO.14 シリアル通信(3) ←シリアルポートの通信プロトコル、送受信バッファ、タイムアウトの設定
 NO.15 シリアル通信(4) ←シリアルポートの送受信方法を説明
・今回の場合は、
   シリアルポートのオープン → 存在有無チェック → シリアルポートのクローズ
 までを行えば良いようなので、シリアル通信(1)~(2) までを参照すれば良いと思います。

2)CreateFile関数でCOM10以上のCOMポートを使用する際の注意点

◎CreateFile関数(Win32API)でCOM10以上を使う場合の注意点
http://www.aofactory.net/log/eid328.html
・ここで、API関数「CreateFile」で指定するCOMポート名(COM1、COM2など)に「COM10」以上を使用
 する場合の問題点および対策が書かれています。
・指定するCOMポートのデバイス名の頭に "\\.\" を付ければ良いようです。
   VBAでの指定例: "COM10" の場合は、 "\\.\COM10" とする。

3)WindowsAPI利用でCOMポートの存在有無をチェックする方法

◎COMポートが存在するかどうかを調べるには? - OKWaveの過去ログより
http://okwave.jp/qa4033242.html
・ここで、API関数「CreateFile」が失敗した際に、同じくAPI関数「GetLastError」でエラーコードを見て
 COMポートの存在有無を調べる旨が書かれています。
注)ただし、VBAでは「GetLastError」を呼んでもエラーコードが得られない可能性があるので、下記4)
 の方法を採った方が良いようです。

4)VBA から Windows API を利用する方法など

◎Office VBA と Windows API - Microsoft MSDN より
http://msdn.microsoft.com/ja-jp/library/cc326057.aspx
・このページの「エラー情報の取得」の説明で、VBAからWindowsAPIを呼出した際のエラーコードの取得
 方法が書かれています。
・VBAからWindowsAPIのDLLを呼び出した際のエラー情報は、「GetLastError関数」では取得できない
 可能性があるので、VBAの場合は「Errオブジェクト」の「LastDLLErrorプロパティ」でエラーコードを取得
 すれば良いようです。
・今回の場合は、COMポートオープン時のエラーコード取得に、この方法が利用できると思います。

こんにちは。

Windowsのプログラム(VBA含む)から、COMポートを扱う場合は、WindowsAPI を使用すれば可能
だと思います。

COMポートの実装チェックには、WindowsAPI の「CreateFile」関数でCOMポートのオープンを実行
して、その関数の戻り値がエラーかどうかを見れば判断できると思います。
ただし、COMポートが実装されていてもエラーになるケース(既に使用中、使用不可に設定されて
いるなど)がありますので、その場合はエラーコードを取得してその値で「実装/非実装」を判断しな
いといけないと...続きを読む

QUSBホスト機能とは何ですか?

よくMP3プレーヤーの仕様に「USBホスト機能」と書かれていますが、これはどんな機能なのですか?
(「USBストレージクラス」とは違うのでしょうか?)

Aベストアンサー

USBホスト機能とは、USBの周辺機器を接続するための「親」になる機能です。USBは、その対応機器が「ホスト」「デバイス」に別れており、「ホスト」は「デバイス」に対し接続制御を行える端末、「デバイス」は「ホスト」から制御信号を与えられて初めてデータ伝送が行える端末、という区別が為されます。

通常は、「ホスト」になるのはPCであって、「デバイス」はPCの周辺機器ということになります。例えばPCとマウスをUSBで繋ぐとき、PCがホスト、マウスがデバイスになります。この時、PCのUSBインターフェースはホスト専用ですし、マウスはデバイス専用ということになります。間違ってもこの関係が逆転することはあり得ません。
デジカメをPCに繋ぐときも同じことが言え、PCが「ホスト」、デジカメが「デバイス」です。同じようにプリンタをPCに繋ぐときはPCが「ホスト」、プリンタが「デバイス」になります。

ところが最近は、PC抜きでデジカメとプリンタを繋いでデジカメの写真をプリントしようという機能が付けられるようになりました。この時、デジカメとプリンタは両方とも「デバイス」ですから、そのままでは接続しても動作しません(制御信号を与える役目の装置がない)。よって、例えばデジカメにUSBホスト/デバイスの両方になれる機能を持たせることで、他にUSBホストがいる場合(PCとデジカメを繋いだ場合)はデジカメはUSBデバイスに、他にUSBホストがいない場合(デジカメとプリンタを繋いだ場合)はデジカメがUSBホストに、というように、ケースバイケースで様々な組み合わせを可能にするような周辺機器が登場しています。

MP3プレイヤーのUSBホスト機能がどういった役に立つのかはそのMP3プレイヤーによって異なりますが、USBホスト機能がある場合は他のUSB周辺機器を繋げることで、PC抜きで様々な動作が可能になっている、と思えば良いでしょう。
当然ですが、USBストレージクラスとは別の用語となります。

USBホスト機能とは、USBの周辺機器を接続するための「親」になる機能です。USBは、その対応機器が「ホスト」「デバイス」に別れており、「ホスト」は「デバイス」に対し接続制御を行える端末、「デバイス」は「ホスト」から制御信号を与えられて初めてデータ伝送が行える端末、という区別が為されます。

通常は、「ホスト」になるのはPCであって、「デバイス」はPCの周辺機器ということになります。例えばPCとマウスをUSBで繋ぐとき、PCがホスト、マウスがデバイスになります。この時、PCのUSBインターフェース...続きを読む

Qシリアル通信の出力バッファと送信完了イベントについて

こんにちわ。よろしくお願いします。

どの言語として扱うか迷ったのですが、恐らくはC/C++が一番だろうと思ってここで質問させていただきます。

質問の内容ですが、現在、シリアル通信のアプリケーションを作っていまして、CreateFileの引数にFILE_FLAG_OVERLAPPEDを与えて非同期で読み書きを行うようにしています。
非同期ですので、OVERLAPPED構造体をstaticで宣言し、
WriteFile時に引数で与えています。
---
m_hComm = CreateFile( (const char*)pCom, GENERIC_READ|GENERIC_WRITE,0, NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ) ;
WriteFile(m_hComm, pwData,dwLen, &dwWrite, &osWriter);
---

問題はここからで、OVERLAPPED構造体のイベントが、シグナル状態になり、GetOverlappedResult(m_hComm, &osWriter, &dwWrite, TRUE)を抜けるのはいいのですが、実際には送信は完了しておらず、GetCommStateで通信速度を変更すると送信途中のデータが化けて通信エラーになってしまいます。

どうやら、今使用しているPCのUARTの出力バッファが大きいのか、Windows側のバッファからUARTバッファに書き込みが完了した時点でWindowsはOVERLAPPED構造体のイベントをシグナルにしているようです。
(もちろんFIFOは切ってあります)

他のPCで確認したところ、問題ありませんでした。
もしどなたか、シリアルの出力バッファを監視するいい方法があったら教えていただけないでしょうか。

こんにちわ。よろしくお願いします。

どの言語として扱うか迷ったのですが、恐らくはC/C++が一番だろうと思ってここで質問させていただきます。

質問の内容ですが、現在、シリアル通信のアプリケーションを作っていまして、CreateFileの引数にFILE_FLAG_OVERLAPPEDを与えて非同期で読み書きを行うようにしています。
非同期ですので、OVERLAPPED構造体をstaticで宣言し、
WriteFile時に引数で与えています。
---
m_hComm = CreateFile( (const char*)pCom, GENERIC_READ|GENERIC_WRITE,0, NULL,OPEN_EXI...続きを読む

Aベストアンサー

2400bpsで9文字の文字列を送出してからビットレートを57600bpsに変更する、という処理を5回繰り返すテストプログラムです。

ちょっと乱雑なソースですがご勘弁を。(インデントは全角スペースです。ご注意ください。)

int main(int argc, char** argv)
{
  for (int i = 0; i < 5; ++i) {
    HANDLE hFile;
    DWORD dw;

    hFile = CreateFile(
      "com1",
      GENERIC_WRITE,
      0,
      NULL,
      OPEN_EXISTING,
      0,
      NULL
    );

    DCB dcb = { sizeof(DCB) };
    GetCommState(hFile, &dcb);
    dcb.BaudRate = CBR_2400;
    SetCommState(hFile, &dcb);

    char buf[100];
    sprintf(buf, "%d ABCDE\r\n", i);
    WriteFile(hFile, buf, lstrlen(buf), &dw, NULL);
    // "# ABCDE\r\n" totals 9 bytes, or 90 bits.
    // At 2400bps, 90 bits need 37.5ms to be transmitted.

#if 0
    CloseHandle(hFile);
    hFile = CreateFile(
      "com1",
      GENERIC_WRITE,
      0,
      NULL,
      OPEN_EXISTING,
      0,
      NULL
    );
#endif

    Sleep(15); // 37 makes mess, 38 ok.
    dcb.BaudRate = CBR_57600;
    SetCommState(hFile, &dcb);

    Sleep(100);
    CloseHandle(hFile);
  }

  return 0;
}

同期処理にしていますが、同じ現象が発生しています。

9文字(90ビット)を2400bpsで送出すると37.5msかかる計算になるのですが、このプログラム中にあるSleep(15)の15を37にすると文字化けが発生し、38にすると文字化けが発生しないので、おおよそ計算どおりと言えるかと思います。

ここで#if 0の行を#if 1に変更すると、Sleep(15)がSleep(0)でも文字化けは発生しなくなります。つまり、デバイスのハンドルをcloseするときにはバッファがflushされるということです。

close時は必ずflushする、という記述に行き当たったわけではないので、closeさえすれば万事OKという保証はできませんが、ドライバの動作としては妥当だと思います。

#実は、「試したいこと」とはこれではなくてDevice Power Stateの変更だったのですが、そのテストをする前になんだかいい感じの結果になってしまったので(^^;

2400bpsで9文字の文字列を送出してからビットレートを57600bpsに変更する、という処理を5回繰り返すテストプログラムです。

ちょっと乱雑なソースですがご勘弁を。(インデントは全角スペースです。ご注意ください。)

int main(int argc, char** argv)
{
  for (int i = 0; i < 5; ++i) {
    HANDLE hFile;
    DWORD dw;

    hFile = CreateFile(
      "com1",
      GENERIC_WRITE,
      0,
      NULL,
      OPEN_EXISTING,
      ...続きを読む

Qteratrermを使ったデータの送信について

teratermで
16進数で下記の5バイトを送信したいのですが、どうすればいいでしょうか。

\x85\x02\x00\x01\x86

VTウィンドウにキーボードで直接打ち込むと、一文字ごとに送信されているようで、うまく行きませんでした。

Aベストアンサー

送信したい文字列を書いたファイルを作成してください。

teratrerm メニューの「ファイル(F)」-「ファイル送信(S)」を選び、作成したファイルを選択してください。
このとき作成したファイルの内容がバイナリーの場合送信ファイル選択画面のオプションで「バイナリー(B)」にチェック入れてください。

>16進数で下記の5バイトを送信したいのですが、どうすればいいでしょうか。
たぶんバイナリーだとおもいますのでファイルはバイナリーエディターで作成してください。

注)これは日本語化したteratermでの説明です

QUSB-RS232C変換ケーブルが動作しない

USB- RS232C変換ケーブルで”USB-CVRS9”というサンワサプライのケーブルをTOSHIBAの32bit版のノートPCでWindows Vista Home Premiumのものを接続しましたが、デバイスマネジャにCOMポートが出てくるのですが、実際にケーブルにRS-232Cの端末を接続しても9600bpsでのテキストデータが受信できません。


このUSB- RS232C変換ケーブルのドライバはこちらのサイトからダウンロードしています。
http://www.sanwa.co.jp/support/download/dl_driver_ichiran.asp?code=USB-CVRS9


Windows Vista(32bit版) のドライバファイルをインストールしています。
ダウンロード時に、このノートPCにインストールされているウイルスセキュリティが、このファイルをウイルス検知してしまい隔離してしまっていたので、ドライバインスト-ル時にウイルスセキュリティの”すべての機能を無効”を行ってからダンロードしてからは隔離はなくなったのですが、COMポートが表示されてもデータの受信ができていません。

ノートPCでRS-232C通信をするソフトを起動した際に端末に対してデータを送る動作があるのですが、その際にはこの変換ケーブルに付いているLEDが点滅動作するので、データはノートPCから端末に対して送信している感じがしますが、このソフトに端末からのでデータが受信しないようです。


どなたか他に解決方法などご存じの方いらっしゃいませんでしょうか?

どうぞ、よろしくお願い致します。

USB- RS232C変換ケーブルで”USB-CVRS9”というサンワサプライのケーブルをTOSHIBAの32bit版のノートPCでWindows Vista Home Premiumのものを接続しましたが、デバイスマネジャにCOMポートが出てくるのですが、実際にケーブルにRS-232Cの端末を接続しても9600bpsでのテキストデータが受信できません。


このUSB- RS232C変換ケーブルのドライバはこちらのサイトからダウンロードしています。
http://www.sanwa.co.jp/support/download/dl_driver_ichiran.asp?code=USB-CVRS9


Windows Vista(32bit版) のドライバフ...続きを読む

Aベストアンサー

相手先の機器への接続は、ストレート・クロスの誤りは無いでしょうか?
http://oshiete.goo.ne.jp/qa/1714269.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング