ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Visual StudioコミュのC# : SerialPort の StopBits で例外発生

  • mixiチェック
  • このエントリーをはてなブックマークに追加
C#のSerialPortクラスのStopBitsについてなのですが、ストップビットなしと1.5Bitは指定できないのでしょうか?

IO.Ports.StopBits列挙体にはNone(なし)とOnePointFive(1.5 stopbit)が定義されていますが、System.IO.Ports.StopBits.Noneを指定すると、実行時に ArgumentOutOfRangeException 例外が発生します。

同様にSystem.IO.POrts.StopBits.OnePointFiveを指定すると、実行時に IOException (0x80070057 : "パラメータが間違っています")が発生します。

MSDNやネットを色々検索してNoneに関してはMSDN Forumにていくつか見つけられたのですが、OnePointFiveに関しては有効な手がかりが見つけられませんでした。

Noneの方はForumにもあったようにその仕様そのものの是非はともかく業務上でも使用することはまず無い(はず)ので、知識として知っておきたいのですが、OnePointFiveの方は接続する装置がそれしかサポートしていない可能性もある事から、システムの仕様変更を視野に.NETの仕様を把握したいと考えています。

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

環境:
Windows XP Professional SP2
VisualStudio 2005 Professional
.NET Framework 2.0

サンプルコード1:
SerialPort wCommPort = new SerialPort();
wCommPort.PortName = "COM1";
wCommPort.BaudRate = 9600;
wCommPort.DataBits = 8;
wCommPort.StopBits = System.IO.Ports.StopBits.OnePointFive;
wCommPort.Parity  = System.IO.Ports.Parity.None;
wCommPort.Open();

サンプルコード2:
SerialPort wCommPort = new SerialPort("COM1", 9600, Parity.None, 8, opBits.OnePointFive);
wCommPort.Open();

何れのケースでも例外が発生する。

コメント(11)

> おとと さん

それはシリアルのLSI(たぶん16550)のストップ・ビットの設定1.5ビットが有効になるのはワード長が5ビットの時のみだからではないでしょうか。
ワード長が7ビットと8ビットの時はストップ・ビットに1.5ビットは設定できないと思いました。
http://www.asahi-net.or.jp/~WR7S-NKMR/MiddleWare/RS232C/index.htm
私も おととさんと同じ経験がありますけども、キートン増田さんと同意見です。

すっごいハード的な低レベルコントロールなんですけど、
シリアルポートで一般的に使用される16550(NS16450でも)の
ライン・コントロール・レジスタのD6「STB」は、
0 のとき 1ビット
1 のとき 2ビット (ただしデータビット長5の場合は1.5ビットと解釈)
されてます。

なので
New SerialPort("COM1", 9600, Parity.None, 5, StopBits.OnePointFive);
みたいに書けば 動くと思いますよ。
(すくなくとも 私の環境ではエラー出ませんでした)
訂正
誤:D6「STB」
正:D2「STB」

m(__)m
補足です。

今,手元にマニュアルがないので記憶で書いています。間違っていたらごめんなさい。

ストップ・ビットの解釈は送信側と受信側で異なります。
受信側は1ビット以上あれば(1でも1.5でも2ビットでも)正常にストップ・ビットと検出します。
送信側は設定された長さのストップ・ビットを作成します。

ですから1.5ビットが要求されているときに1.5ビットという設定項目がない場合,2ビットを設定すれば正常に動作すると思います。

# しかし5ビット+1.5ビットの機器ってテレタイプですよね。
# 今でも世の中にあるのだろうか。
回答ありがとうございました。
ここの所アプリ側ばかり開発していたので、ハード側の仕様が頭からすっかり無くなっていました(汗)

キートン増田さん・山崎さんが指摘してくれた16550の仕様を確認し、StopBit=1.5bitはデータ長が5bitの時のみ有効である事を確認しました。

山崎さんが提示してくれた
> New SerialPort("COM1", 9600, Parity.None, 5, StopBits.OnePointFive);
このコードが、こちらでも正常にOpenできる事を確認しました。
また、データ長を5/6/7/8bitと全て指定し、5bitの時のみ例外が発生しないのも確認できました。

因みに、ハードの仕様はともかくソフトの仕様上Data=7〜8bit Stop=1〜2bitと言う条件のため、デバック中に例外が発生して焦ってしまいました(^^;


PS1:
Windowsのデバイスドライバ・プロパティでは、データ長=8bit / Stop=1.5bitが指定できるんですよね。
これもやはり内部で2bitになっていると考えるべきなんでしょうね。

PS2:
因みにNoneの方も16550の仕様にあわせて・・・と言う部分はあるんでしょうが、MSDNのForumで私が見た投稿は途中からStopBit=0はありや?と言う仕様の話に変わっていました(つたない英語力ですが(^^;)
>> おととさん

動いたようでなによりですね♪

> StopBit=0はありや?

とても 深い質問だと思います。
一般のシリアルポートを非同期(調歩同期)通信とするなら、
ずいぶん以前 同期通信 というのがありました。

これができるのは インテル8251Aというチップで NEC PC-9801で よく用いられていました。
(今回の NS16550 というチップは、DOS/Vから用いられていたもので、非同期しかできないはずです。)

この関係で、NEC PC-9821には 同期・調歩同期の切り替えソフトスイッチがあったように記憶しています。


StopBit=0 が つまり、この同期通信のことを示しているのでしたら、
NS16550 搭載PC では たぶんムリ
インテル8251A 搭載PC なら おそらくOK
ということになると思います。

キートン増田さんは テレタイプをご存知ですから、なにかご経験があるかもしれません。追記が ございましたら お願いします。m(__)m
>山崎さん

8251。
すっかりチップ型番忘れていましたが、懐かしい〜
PC-98xx時代はその一つ前の8250なんてのもありましたが、DOSライブラリを使わず独自デバドラを作ったりもしてました。
ただ、そんな昔の記憶でもStop=0と言う仕様や機械にあった記憶がないですね。
理論的にStartBitのタイミング幅があればStop=0でも通信できるはずですが、少なくても私はStop=0は経験無いです。

ハード&ソフトの仕様としてStop=0はありや?

と言うのは山崎さん同様興味ありますね。
ハードスペックはともかく、昔から「ストップビットは付けるもの」と言う固定観念があったりします。
訂正。

8250は当時のIBM PC-ATで使われていたチップでした orz
NECのPC-98xxシリーズは最初から8251が使われてたみたいです。

なんか記憶がごっちゃになってる・・・orz
調歩同期の場合,1ワードの開始のタイミングをみつける必要と,フレーミング・エラーの検出のためストップ・ビットが必要です。ですからストップ・ビット0ということはあり得ません。

同期式の場合はHDLCしか経験がないのですみません。

って言うかこういうのはハードウェア(LSI)に依存するのに値が定義されているからという理由だけで作られた仕様書はなんか不安です。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Visual Studio 更新情報

Visual Studioのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング