シリアル通信におけるパリティエラー検出設定 – プログラミング – Home

シリアル通信におけるパリティエラー検出...
 
通知
すべてクリア

シリアル通信におけるパリティエラー検出設定


しで
 しで
(@しで)
ゲスト
結合: 16年前
投稿: 5
Topic starter  

シリアル通信プログラミングにおける
パリティエラー検出設定に関して質問があります。

今、受信バイト毎にパリティエラーチェックを
行う方法を検討しております。

通信ポートオープン時に通信設定を行う際に、
DCB構造体の「fParity」にTRUE (or 1)を設定して、
SetCommStateを行っています。

しかしその直後に、GetCommStateで設定値を確認すると、
fParityの値が0(FALSE)のままとなっています。

これの理由(APIのバグなど)を御存知の方はいらっしゃるでしょうか?

今まで確認した環境は以下になりますが、
全ての環境で「fParity」が0のままでした。

①Windows XP SP3 + 標準ポート
②Windows 2K SP4 + 標準ポート
③Windows 2K SP4 + 拡張ボード(Digi Board社製)
③Windows 2K SP4 + 拡張ボード(CONTEC社製)

以上、よろしくお願いします。


引用解決済
トピックタグ
しで
 しで
(@しで)
ゲスト
結合: 16年前
投稿: 5
Topic starter  

一つ忘れていました。

開発環境は、
Windows XP SP4 + VC++ 6.0 SP5
です。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

ウチでも GetCommState で fParity==0 になるし、こんな事例も発見したわけだが
http://forums.msdn.microsoft.com/en-US/vclanguage/thread/83c2d419-a45b-4404-
994e-39dc93c822ef
http://www.pcreview.co.uk/forums/thread-2979345.php
「理由」を追及してもしょうがないような気がする

とりあえずウチでは fParity=1 で SetCommState してパリティあり通信ができている
のでそれ以上の追求は行っていない(実用上問題ないわけだし)
KB を簡単に検索した範囲では何も見つからなかった。

> Windows XP SP4 + VC++ 6.0 SP5
XP SP4 は聞いたことないわけだが、正確に書かないと質疑応答の信頼性が0に
なっちゃうよ。 VC++6 も SP6 にすべきだろうし。


返信引用
しで
 しで
(@しで)
ゲスト
結合: 16年前
投稿: 5
Topic starter  

回答ありがとうございます。

Windows XP SP4 はあるわけないですね。(^^;
Windows XP SP3 の間違いです。

fParity=0 になるのは私だけではないようですね。

実際こちらの環境でも、fParity=0 でパリティあり通信はできているので、
実運用上問題はありません。
⇒ DCB.Parity = EVEN の設定で。

ちなみに、変な質問かもしれませんが、
パリティエラーバイトを受信した時に、
ReadFileの実行結果をFALSEにする方法とかあるのでしょうか?
⇒ 今回の質問の背景として、
fParity=1の時に、パリティエラーバイト受信で、
ReadFileがFALSEになるか確認しようとしたのですが、
fParityが1にできなかったもので。

以上、よろしくお願いします。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

うーん。このへんどうなんだろう。パリティエラーバイトをどう扱うかは
デバイスドライバーの内部コード次第のような気がする。
1.ReadFile が失敗し FALSE を返す
2.ReadFile は失敗せず TRUE を返し ClearCommError の CE_RXPARITY が立ち、
2-a.ReadFile の受信バイト数が0になり化けデータは取得されない
2-b.ReadFile の受信バイト数が非0になり化けデータが取得される
3.その他の動きをする
のどれであるかは不明(というかドライバー次第)。

とりあえず俺がテストした数種類のドライバーでは1.は無かった。
ウチではそれ以上の詳細は深く追求しなかったのでこれ以上の提案は無理。


返信引用
しで
 しで
(@しで)
ゲスト
結合: 16年前
投稿: 5
Topic starter  

tetrapod 様
色々と対応ありがとうございます。

こちらの全ての環境でも1.はなく、
2-bの結果となっています。

ちなみにClearCommErrorは、
ボード内の受信バッファにパリティエラーバイトがあると、CE_RXPARITY が立つよう
で、
ReadFileで読取ったバイトがパリティエラーバイトかどうかの判別はできないようで
す。

とりあえず、DCB.fErrorChar=1に設定すると、
パリティエラーバイトが、DCB.ErrorCharで指定した文字に置換される方法もあるので、
こちらの方法で検討を進めてみます。
⇒ 置換する文字が悩み所です。

ただ調べると DCB.fParity=1かつDCB.fErrorChar=1のときに置換されると
なっているのですが、DCB.fParity=0でも置換はされるようです。
この辺が少し気持ち悪いですが。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

RS-232Cなんて大昔にやったきりなので良くは
覚えていませんが、

データビット長(1文字のビット数)が8bitの場合は
パリティは設定できなかったような気がします。
パリティを指定する場合は、7bit以下にしていたと
記憶しています。

ストップビットには制限が無かったと
記憶しているので、こっちは多分関係ないと思います。

なにぶん古いことなので、
間違っていたらごめんなさい。


返信引用
しで
 しで
(@しで)
ゲスト
結合: 16年前
投稿: 5
Topic starter  

仲澤 様
情報ありがとうございます。

ただ、データビット・ストップビットや、
通信速度・パリティ種別等色々変えてやってみましたが、
fParityは0となってしまいました。
⇒ 標準ポートのみですが

fParityの扱いがいまいち良く分かりませんね。


返信引用
...
 ...
(@...)
ゲスト
結合: 22年前
投稿: 113
 

通信前に必ず設定しなくてはいけないものですから
自身でメンバー変数を保持していればいいのでは?

「fParity GetCommState」
で検索したら調べる気がなくなりました。

>tetrapod 2008/08/29(金) 14:17:01
>今日、4:35 午前 UTC
>しで 2008/08/29(金) 14:41:37

#英語圏でも困ってる人がいたのでMSのバグではないかと。
#実害はないのですから
#自分で何とかするしかないのでは。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました