お世話になります。Delphi5を使っています。
A社のバーコードスキャナでバーコードをスキャンした時の
WaitCommEventではイベントマスクの値に"1"(EV_RXCHAR)が設定され
問題ないのですが、
B社のバーコードスキャナでバーコードをスキャンした時は
イベントマスクの値に"1025"が設定されてしまいます。
イベントマスクの値とEV_RXCHARを比較し次の処理へ遷移している為、
実行したい処理を実行することができず困っています。
また"1025"が何を意味するのかも判らない為、
その値を判断文に組み込んでいいものかどうかも判断できず、
どうにもこうにも困っています;;
"1025"が何を意味するのか、
また、バーコードスキャナによって
WaitCommEventのイベントマスクの戻り値がなぜ異なっているのか、
ご存じの方がいらっしゃいましたら教えていただけないでしょうか。
よろしくお願い致します。
※Delphiの話しではないかもしれません…申し訳ありませんm(_ _ )m
10進数で書いた1025と1とはまるで違う値に見えるけど、
16進数で書けば $1001と$0001で、$1000のビットが立っているかいないかの差だけ。
EV_RXCHAR = $0001 // 1文字受信し、入力バッファに入れた
EV_EVENT2 = $1000 // Provider specific event 2
EV_EVENT2はスキャナメーカーが独自に定義する値のようで、
何を意味するかは仕様書に書いてあると思うけど、
無視しても構わないんじゃないの?
1025という値は16進数だと$401ですから、EV_RXCHAR(1)の他に
もう一つ$400のビットが立っていると推測できます。
プラットフォームSDKのヘッダを検索すると、該当するものはおそらくこれ。
> EV_RX80FULL The receive buffer is 80 percent full.
ただこれ、GetCommMaskのために定義されている値で、
MSDNを見てもWaitCommEventのところには出てこないんですね。
さらに、WaitCommEventの説明には「it is one of the following values」
とあるから、設定される値はどれか一つだけのはず。
これを設定する側の間違いと見るかどうかは微妙なところですが、
とりあえずマスクとして定義されているものですから
if (event_flag and EV_RXCHAR) then ...
のように、欲しいビットだけ取り出して比較するのが無難でしょう。
>ミカタの差さん
$1000を1024と勘違いする事は良くあるウッカリかな?^^;
toです。お世話になります。
>>ミカタの差 様、tor 様
ご返信ありがとうございますm(_ _ )m
ビットが立っている、立っていないの差だけ、というお話し、とてもよく判りました。
ありがとうございます。
> if (event_flag and EV_RXCHAR) then ...
> のように、欲しいビットだけ取り出して比較するのが無難でしょう。
とのことですが『欲しいビットだけ取り出す』という、
具体的な処理を教えていただけないでしょうか。
ご呈示いただいたif文の意味が理解できなくて…。
例えば、イベントマスクの変数を dwEvMask として、
if Copy(IntToStr(dwEvMask),Length(IntToStr(dwEvMask))-1,Length(IntToStr(dwEvMask))) = EV_RXCHAR then ...
なんて判定でも問題ないでしょうか?
よろしくお願い致します。
> なんて判定でも問題ないでしょうか?
残念ながら値が1025だと5(≠1)という結果になるので、それでは駄目です。
(参考までに、10進数の1の位を取り出すだけなら number mod 10 でできます)
私の提示した文がちょっと間違っていて、正しくは
if (event_flag and EV_RXCHAR) <> 0 then ...
ですね。これがそのまま『欲しいビットだけ取り出す』処理なので
event_flagのところを実際の変数(dwEvMask)とかに変えるだけでいいです。
式の意味を知りければ、2進数の演算を理解しておく必要があります。
やっていることは「ビット単位の論理積」なので、それで調べてみてください。
まあ「複数のフラグの組み合わせで表される値から
特定のフラグを取り出す」場合の定型文として覚えておくだけでいいと思います。
toです。お世話になります。
>>tor 様
ご返信、ありがとうございます。
教えていただいた、
> if (event_flag and EV_RXCHAR) <> 0 then ...
で、
戻り値が"1025"でも"1"でも正しく次の処理へ進むようになりました。
event_flag は dwEvMask に変更しました♪
> 式の意味を知りければ、2進数の演算を理解しておく必要があります。
> やっていることは「ビット単位の論理積」なので、それで調べてみてください。
「ビット単位の論理積」、調べて理解するようにします。
本当にありがとうございました。
ツイート | ![]() |