2016-07-07 26 views
6

私はちょうどシリアルポートに問題が発生しましたが、これまでのところ答えが見つかりませんでした。もし私が間違っていたら、私に知らせるか、私に手がかりを与えてください、ありがとう。私は、状況全体をできるだけ詳細に説明し、最終的に私の質問に挑戦します。ここに行く。C#:シリアルポートデバイスの設定可能なボーレートを確認する方法は?

FTDI FT232RLチップを使ってUSB to TTLコンバータを購入しましたが、シリアルネットワークがどのように機能するのか、ハイパーターミナルを使用する代わりにC#で自分のプログラムを書く方法が不思議でした。私はいくつかのチュートリアルを読んでプログラムを書いて、自分自身をすばやく始めました。チュートリアルを終えた後、私が読んだチュートリアルでは、ボーレート設定に関しては、同様の方法を使用していることに気付きました。彼らはデバイスがそれをサポートするかどうか尋ねるのではなく、典型的なボーレートをコードにハードコードします。私はいつも可能な限り一般的なプログラムを書こうとしています。そのため、私はデバイスから情報を取得する方法を調べ始めました。検索後、私はthis post answered by HiteshPが非常に有用であることを発見しました。そして、投稿に提案された反射方法を使用しました。だからここに私のコードは次のようになります。私はメッセージボックスから取得

private void UpdateBaudRateCollection() 
{ 
    mySerialPort.PortName = cboAllPortNames.SelectedItem.ToString(); 
    mySerialPort.Open(); 
    object p = mySerialPort.BaseStream.GetType().GetField("commProp", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(mySerialPort.BaseStream); 
    int dwSettableBaud = (int)p.GetType().GetField("dwSettableBaud", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).GetValue(p); 
    mySerialPort.Close(); 
    MessageBox.Show(dwSettableBaud.ToString("X")); 
} 

結果は、私はそれがnot shown in Microsoft's COMMPROP structureあるとして、それが何を表すか見当がつかない10066B70です。

10066B70の意味は分かっていますが、AmundGjersøeがBasic serial port listening applicationに出くわすまで答えが見つかりませんでした。多分私は10066B70とMicrosoftのCOMMPROP構造体によって与えられたすべての値とのAND演算を実行しなければならなかったでしょう。だから私はその値をその関数に投げた。

private void SettableBaudRateOfDevice(int settableBaudRate) 
{ 
    const int BAUD_075 = 0x00000001; 
    const int BAUD_110 = 0x00000002; 
    const int BAUD_150 = 0x00000008; 
    const int BAUD_300 = 0x00000010; 
    const int BAUD_600 = 0x00000020; 
    const int BAUD_1200 = 0x00000040; 
    const int BAUD_1800 = 0x00000080; 
    const int BAUD_2400 = 0x00000100; 
    const int BAUD_4800 = 0x00000200; 
    const int BAUD_7200 = 0x00000400; 
    const int BAUD_9600 = 0x00000800; 
    const int BAUD_14400 = 0x00001000; 
    const int BAUD_19200 = 0x00002000; 
    const int BAUD_38400 = 0x00004000; 
    const int BAUD_56K = 0x00008000; 
    const int BAUD_57600 = 0x00040000; 
    const int BAUD_115200 = 0x00020000; 
    const int BAUD_128K = 0x00010000; 
    const int BAUD_USER = 0x10000000; 

    cboBaudRate.Items.Clear(); 

    if ((settableBaudRate & BAUD_075) > 0) 
     cboBaudRate.Items.Add(75); 
    if ((settableBaudRate & BAUD_110) > 0) 
     cboBaudRate.Items.Add(110); 
    if ((settableBaudRate & BAUD_150) > 0) 
     cboBaudRate.Items.Add(150); 
    if ((settableBaudRate & BAUD_300) > 0) 
     cboBaudRate.Items.Add(300); 
    if ((settableBaudRate & BAUD_600) > 0) 
     cboBaudRate.Items.Add(600); 
    if ((settableBaudRate & BAUD_1200) > 0) 
     cboBaudRate.Items.Add(1200); 
    if ((settableBaudRate & BAUD_1800) > 0) 
     cboBaudRate.Items.Add(1800); 
    if ((settableBaudRate & BAUD_2400) > 0) 
     cboBaudRate.Items.Add(2400); 
    if ((settableBaudRate & BAUD_4800) > 0) 
     cboBaudRate.Items.Add(4800); 
    if ((settableBaudRate & BAUD_7200) > 0) 
     cboBaudRate.Items.Add(7200); 
    if ((settableBaudRate & BAUD_9600) > 0) 
     cboBaudRate.Items.Add(9600); 
    if ((settableBaudRate & BAUD_14400) > 0) 
     cboBaudRate.Items.Add(14400); 
    if ((settableBaudRate & BAUD_19200) > 0) 
     cboBaudRate.Items.Add(19200); 
    if ((settableBaudRate & BAUD_38400) > 0) 
     cboBaudRate.Items.Add(38400); 
    if ((settableBaudRate & BAUD_56K) > 0) 
     cboBaudRate.Items.Add(56000); 
    if ((settableBaudRate & BAUD_57600) > 0) 
     cboBaudRate.Items.Add(57600); 
    if ((settableBaudRate & BAUD_115200) > 0) 
     cboBaudRate.Items.Add(115200); 
    if ((settableBaudRate & BAUD_128K) > 0) 
     cboBaudRate.Items.Add(128000); 
    if ((settableBaudRate & BAUD_USER) > 0) 
     cboBaudRate.Items.Add(3000000); 
} 

プログラムを実行した後、私は次のボーレートを取得:

300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 3000000 

は、私は、デバイスのためのWindowsのデバイスマネージャに表示される値とそれを比較するまで、それが働いたことを幸せでした。デバイスマネージャからボーレートだった:

300, 600, 1200, 1800, 2400, 4800, 7200, 9600, 14400, 19200, 38400, 57600, 115200, 230400, 460800, 921600 

私はボーレートを理解することができます:私はそれを自分で定義されたが、残りの値はどこから来たので、3000000が示されていませんか?私はおそらくドライバで定義されているのだろうかと不思議に思った。私は深く掘りはじめ、FTDIの文書 AN232B-05 Configuring FT232R, FT2232 and FT232B Baud Ratesを見つけました。ドキュメントの中には、FTDIのドライバ設定ファイル(ftdiport.inf)について書かれています。私はそれを検索し、Windowsのシステムフォルダの下にそれを見つけた。エントリは次のようになります。

[FtdiPort.NT.HW.AddReg] 
HKR,,"ConfigData",1,11,00,3F,3F,10,27,00,00,88,13,00,00,C4,09,00,00,E2,04,00,00,71,02,00,00,38,41,00,00,9C,80,00,00,4E,C0,00,00,34,00,00,00,1A,00,00,00,0D,00,00,00,06,40,00,00,03,80,00,00,00,00,00,00,D0,80,00,00 

は、それは追加のFT232Bサブ整数除数を使用してエイリアシング、FTDIのドキュメントのセクション2.3に示したものと同じに見えます。セクション2.3での指示に従い、ftdiport.infからCONFIGDATAを翻訳し、私は次のボーレートを得る:

300, 600, 1200, 2400, 4800, 9600, 19230, 38461, 57692, 115384, 230769, 461538, 923076, 14406 

ここでも、デバイスマネージャが表示されているものと同じではありません。デバイスマネージャーのボーレートもハードコード化されているかどうか疑問に思う。述べたように

Required divisor = 3000000/1800 = 1666.666 
Divisor = 1666 
Sub-integer divisors = 0.6666 
Closest Sub-integer divisors = 0.625 
Closest achievable baud rate = 3000000/1666.625 = 1800.045 
Error = (1800.045-1800)/1800*100 = 0.0025% 

エラーはエラーの許可+/- 3%のマージンの範囲内である:1800、デバイスマネージャからftdiport.infファイルに次のようになります。私もどのようにボーレートを数えてみました

ドキュメント内では、ftdiportのデータ入力です。

1666.625 Dec = 00014682 Hex 
Data entry after re-order: 00014682 Hex => 82,46,01,00 

代わりに、[82,46,01,00]はどこにもありませんftdiport.infファイルに存在すること:infが、このようなものを持っている必要があります。私もCOMMPROPからdwMaxBaudを行い、を意味し、結果10000000ました:

BAUD_USER (0x10000000): Programmable baud rate. 

をこれは、ユーザーがいる限り、それは送信機と受信機の両方のボーレートを満たして、彼らが好きなボーレートを使用できることを意味していますエラーの範囲内で、右か?

    :私は私の脳内の3つの異なる結果を持っているように、今では、私は非常に混乱している

    を(私の脳は少しあいまい取得し始めているよう念私はそれが間違っ届かない作ります)
  1. 私のプログラムの10066B70は何を意味しますか?
  2. AND演算を実行する10066B70でのデバイスマネージャのボーレート値と比較して、異なる結果が発生しました。これはそれがどういう意味なのでしょうか?
  3. デバイスマネージャのボーレート値とFTDIのドキュメントの結果が異なっています。私は両方が公式であると信頼する人がいないと思いますか?

もう一度、私が書いたものをすべて読んでいただき、ありがとうございます。うまくいけば、誰かが私の質問に対する答えを私に提供できるはずです。

*注:私は評判が10に達していないため、2つ以上のリンクを投稿できないため、コメントにリンクを入れました。ご理解いただきありがとうございます。

+0

リンク1:(http://stackoverflow.com/questions/1165692/how-to-programatically-find-all [プログラム的HiteshPにより、C#で使用可能なすべてのボーレート(SERIALPORTクラス)を検索する方法] - 利用可能なボーレート - Cシャープ - シリアルポートクラス) – Bou

+0

リンク2:[COMMPROP構造](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363189(v = vs。 85).aspx) – Bou

+0

@stuartdありがとう。 – Bou

答えて

1

Fernhillは、シリアルポート設定の大規模な組み合わせを自動的かつ迅速に試行して、何が意味のある応答をもたらすかを確認するソフトウェアを作成します。

Modbus Serial Autodetect Wizard

関連する問題