5

マルチドロップバスを介して通信する組み込みソリューションを開発しました。次に、バス上のトラフィックを監視するPCベースのアプリケーションを開発したいと思います。

MDB supports true 9 data bits (plus start/stop/parity - and *no fudging* by using the parity bit as a 9th data bit)一方、標準のWindowsおよびLinuxライブラリは、最大8データビットを提供します。

私は9データビットをサポートするStarTechPCI2S950PCシリアルポートカードを持っていますが、監視アプリをコーディングする方法がわからず、グーグルで大したことはありません。

私はC(またはDelphi、またはC ++)でコーディングしたいと思います。私はCygwnを少し好みますが、単純なWindowsまたはLinuxを使用したいと思っています。

そのPCシリアルポートカードを介して9データビットを読み書きするためのあらゆるもの。

誰か助けてもらえますか?

4

4 に答える 4

5

http://www.semiconductorstore.com/pdf/newsite/oxford/ox16c950b.pdfのドキュメントでは、さまざまな UART の違いについて説明しています。StarTech ボードには、RS-485 (および 9 ビット) 対応の 16C950 が含まれていますが、IBM-PC 時代の 16550/8250 と同様に、RS-232 互換 (550) モードで使用され、最大 8 ビットをサポートします。データ。

同じチップ (16C950) を搭載したボードが必要ですが、仕様に従って 9 ビット データをサポートする RS-485 互換の 950 モードを公開します。また、Microsoft のドライバは 8 ビットのみであるため、そのようなサポートを主張するボードには、Windows 用のカスタム ドライバが付属している必要があります。

ここで言及されている 9 ビット RS-485 を実行できるチップは他にもいくつかありますが、ここでもWindows ドライバーのサポートを見つけるのは難しいでしょう。もちろん、多くのボードは 16C950 を使用していますが、8 ビットおよび/または RS-232 専用モードでのみ、適切なドライバを使用していません。

Superuserに関するあなたの関連する質問への回答として、sawdustはSealevel 7205eを提案しました。これは、Windows ドライバーをサポートする良い選択のようです。高価ですが、特に 9 ビット、RS-485 サポート、および Windows ドライバーについて言及しています。それはあなたの最良の選択肢かもしれません。

于 2013-01-17T03:15:50.197 に答える
5

選択したカードは、このアプリケーションには適していません。プレーンな RS-232 ポートしかなく、マルチドロップ バスには適していません。EIA-485 スタイルのバス インターフェイスを購入するには、他の場所で購入する必要があります。これらは、産業用電子機器のサプライヤでしか見つけることができません。断然最良の方法は、MDB 仕様を所有する業界団体である National Automatic Merchandising Association に問い合わせることです。

9 ビットのデータ形式は単なるトリックであり、MDB プロトコルでアドレス バイトとデータ バイト間のモード切り替えに使用されます。バス上のすべてのポートはアドレス バイトをリッスンし、アドレス指定されたポートだけがデータ バイトをリッスンします。

9 番目のビットは、任意の UART が生成できる単純なパリティ ビットです。基本的なデータ サイズは 8 ビットのままです。UART は、初期化された方法からパリティ ビットを自動生成します。マーク、スペース、奇数、偶数パリティから選択できます。

これは、このようなバスで使用される種類のプロセッサである UART を備えたマイクロコントローラで簡単に実行できます。オンザフライで UART を再プログラムし、アドレス バイトを送信するときにマーク パリティを生成するように指示するだけです。そして、データ バイトを送信するときにスペース パリティに再プログラムします。実際の UART チップにもよりますが、通常は FIFO が空になるのを待つ必要があります。

これは、通常の Windows または Linux マシンで行うのがはるかに難しく、ユーザー モード プログラムと UART の間にドライバーがあります。ドライバは、Windows の EV_TXEMPTY の WaitCommmEvent() のように、「送信バッファが空」ステータス ビットを生成しますが、これには fifo の空のステータスは含まれず、バッファが空であることを示すだけです。回避策は、バッファが空の状態になるのを待ってから、FIFO が確実に空になるまで十分な時間 sleep() を実行することです。通常、FIFO の深さは 16 バイトなので、ビット時間の 16 倍の時間スリープします。これらの詳細を確実に知るには、選択したカードの UART のデータシートが必要です。

于 2013-01-13T20:42:00.790 に答える
3

Win32 シリアル ポートでは単なるファイルであるため、CreateFile でハンドルを作成し、DCB 構造体を使用して構成オプションを設定します (メンバーはここに記載されており、データ ビット数が として含まれていますByteSize)。

ここに良いウォークスルーがあります: http://www.codeproject.com/Articles/3061/Creating-a-Serial-communication-on-Win32

于 2013-01-08T10:32:47.973 に答える
0

提供されたリンクは、カードが 9 データ ビットと Windows 8 をサポートしていることを示しているため、標準の Windows API を介してすべてのカード機能をアプリケーションで利用できると思います。

DCB で正しいデータ形式を設定してポートを開くことは別として、標準の ReadFile が機能すると思っていたでしょう。読み込まれたデータは、ストリーミングされた連続した 9 ビット (後でデコードする必要があります) ではなく、実際には 9 データ ビットを表す 2*8 ビット バイトになるのでしょうか。

9 ビット目はデータ以外に使用されていますか?

于 2013-01-11T08:56:27.130 に答える