tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルChr関数 VB2010でおかしい?
記事No11856
投稿日: 2017/08/02(Wed) 15:59
投稿者MSAKA
初めてです レベルの低い質問かもしれませんがChr関数の戻り値が
おかしく原因が判らないのでよろしくお願いします

例えば Excel2003(古い)のVBAでは
Chr(&H66) → "f"(実際は表示できないらしのでこのような表示をします)
Chr(&H0)  → "・"
Chr(&H1)  → "・"
この値を使ってVBAでは正常に動きます

VB2010 では
Chr(&H66) → "f"  (&H66は同じのようです)
Chr(&H0)  → " " (Nll?)
Chr(&H1)  →  "  (ダブルコーテションが1個)

などと異なった値が示されます  何故でしょう 
VB2010 でシリアル通信に使おうとしているのですが受付ません
尚 当然ですが2003 2010どちらもコードは同じ値です(&HFE → 254  &H66 → 253 等)

OSは Windows 7 です

[ツリー表示へ]
タイトルRe: Chr関数 VB2010でおかしい?
記事No11857
投稿日: 2017/08/02(Wed) 16:20
投稿者魔界の仮面弁士
&H66 は可読文字ですが、
&H00 や &H01 は非可読文字なので、
文字として目視確認できるものではないですよ。


> Chr(&H0)  → " " (Nll?)
> Chr(&H1)  →  "  (ダブルコーテションが1個)

NULL は文字列の終端として扱われるデータなので、
&H0 と &H1 の結果が逆になりそうなものですが、
それはさておき。

上記の結果は、どのようにして確認したものなのでしょうか。

ひとまず下記のコードで実行してみましたが、どちらも正常に
&H0 や &H1 が格納されているように見えます。


[VB2010]
Dim a As Char = Chr(&H66)
Dim b As Char = Chr(&H0)
Dim c As Char = Chr(&H1)

Dim x As String = Hex(Asc(a))
Dim y As String = Hex(Asc(b))
Dim z As String = Hex(Asc(c))


[VBA]
Dim a As String: a = Chr(&H66)
Dim b As String: b = Chr(&H0)
Dim c As String: c = Chr(&H1)

Dim x As String: x = Hex(Asc(a))
Dim y As String: y = Hex(Asc(b))
Dim z As String: z = Hex(Asc(c))



> VB2010 でシリアル通信に使おうとしているのですが受付ません

シリアル通信ということは、System.IO.Ports.SerialPort クラスですかね。
今回問題となっている処理は、どのようなコードなのでしょうか?


> 尚 当然ですが2003 2010どちらもコードは同じ値です(&HFE → 254  &H66 → 253 等)

253 なら &HFD のはずですが…。
&HFE は 254 ですが、&H66 は 102 ですよね。

[ツリー表示へ]
タイトルRe^2: Chr関数 VB2010でおかしい?
記事No11858
投稿日: 2017/08/02(Wed) 18:30
投稿者MSAKA
魔界の仮面弁士さん

早々の調査ありがとうございます

> &H66 は可読文字ですが、
> &H00 や &H01 は非可読文字なので、
> 文字として目視確認できるものではないですよ。 >>> 仰せのとおりです
>
>
> > Chr(&H0)  → " " (Nll?)
> > Chr(&H1)  →  "  (ダブルコーテションが1個)
>
> NULL は文字列の終端として扱われるデータなので、
> &H0 と &H1 の結果が逆になりそうなものですが、
> それはさておき。  >>> そのとおりです すみません
>
> 上記の結果は、どのようにして確認したものなのでしょうか。
  >>>  デッバッグの途中でStopさせて変数を確認したものです
>
> ひとまず下記のコードで実行してみましたが、どちらも正常に
> &H0 や &H1 が格納されているように見えます。
>
>
> [VB2010]
> Dim a As Char = Chr(&H66)
> Dim b As Char = Chr(&H0)
> Dim c As Char = Chr(&H1)
>
> Dim x As String = Hex(Asc(a))
> Dim y As String = Hex(Asc(b))
> Dim z As String = Hex(Asc(c))
>
>
> [VBA]
> Dim a As String: a = Chr(&H66)
> Dim b As String: b = Chr(&H0)
> Dim c As String: c = Chr(&H1)
>
> Dim x As String: x = Hex(Asc(a))
> Dim y As String: y = Hex(Asc(b))
> Dim z As String: z = Hex(Asc(c))
>
>
>
> > VB2010 でシリアル通信に使おうとしているのですが受付ません
>
> シリアル通信ということは、System.IO.Ports.SerialPort クラスですかね。
> 今回問題となっている処理は、どのようなコードなのでしょうか?
>  >>> sample_0008 と言うものをWebからダウンロード 2010用に変換したものです
      
>
> > 尚 当然ですが2003 2010どちらもコードは同じ値です(&HFE → 254  &H66 → 253 等)
>
> 253 なら &HFD のはずですが…。
> &HFE は 254 ですが、&H66 は 102 ですよね。 >>> 私のミスです 仰せのとおりです 

早々の調査 ご指導ありがとうございます
疑問については上記それぞれに記載いたしました よく確認したつもりですがミスが多くすみません
提供されたコードでもう一度確認してみます

[ツリー表示へ]
タイトルRe^3: Chr関数 VB2010でおかしい?
記事No11860
投稿日: 2017/08/02(Wed) 19:07
投稿者魔界の仮面弁士
> > シリアル通信ということは、System.IO.Ports.SerialPort クラスですかね。
> > 今回問題となっている処理は、どのようなコードなのでしょうか?
> >>> sample_0008 と言うものをWebからダウンロード 2010用に変換したものです

「それ」を何処から拾ってきたのかを書いてくださいな。(^_^;)

検索したら下記がヒットしましたが、これですかね?
http://kana-soft.com/tech/sample_0008_4.htm

だとしたら、System.IO.Ports.SerialPort クラスのことですね。

※注:上記 URL には "SerialPortコントロール" という表記がありましたが、
 実際にはコントロール(Control 継承クラス)ではなく、
 コンポーネント(Component 継承クラス)に属します。

[ツリー表示へ]
タイトルRe^4: Chr関数 VB2010でおかしい?
記事No11861
投稿日: 2017/08/02(Wed) 20:31
投稿者MSAKA
> > > シリアル通信ということは、System.IO.Ports.SerialPort クラスですかね。
> > > 今回問題となっている処理は、どのようなコードなのでしょうか?
> > >>> sample_0008 と言うものをWebからダウンロード 2010用に変換したものです
>
> 「それ」を何処から拾ってきたのかを書いてくださいな。(^_^;)
>
> 検索したら下記がヒットしましたが、これですかね?
> http://kana-soft.com/tech/sample_0008_4.htm
>
> だとしたら、System.IO.Ports.SerialPort クラスのことですね。
>
> ※注:上記 URL には "SerialPortコントロール" という表記がありましたが、
>  実際にはコントロール(Control 継承クラス)ではなく、
>  コンポーネント(Component 継承クラス)に属します。

> 「それ」を何処から拾ってきたのかを書いてくださいな。(^_^;)
>
> 検索したら下記がヒットしましたが、これですかね?
> http://kana-soft.com/tech/sample_0008_4.htm >>> ハイ そうです
>
> だとしたら、System.IO.Ports.SerialPort クラスのことですね。
>
> ※注:上記 URL には "SerialPortコントロール" という表記がありましたが、
>  実際にはコントロール(Control 継承クラス)ではなく、
>  コンポーネント(Component 継承クラス)に属します。>>> この辺は頭が痛くなります

*何故拾ってきたのか >>> EasyComm(多分ご存知でしょう)を使いVBAでシリアル通信を
 行うように進めてきたのですが機器側から信号を送ってきたときの受信イベントができない
(何か方法があるとは思いますが私の知識では思い浮かばず) 色々調べていたらそれが可能な
 サンプルがあったのでコレコレと思ったのです・・・しかし VB2010等を勉強しなければ
 ならない・・・という作業が増えてしまいました

早々やってみました 仰せのとおりの結果ですが
  a AS Char = Chr(&H6)  は "-" ですが 
VBAでの  TX$ = Chr(&H6)  は "・" で明らかに違います これは何故でしょう
で Charで試みましたが相手機器には届きませんでした

機器へのコード例(無線機を送信状態にする)を示してみます(変数はグローバル変数で定義)

Private Sub CommandButton6_Click()
'送信

PR$ = Chr(&HFE) + Chr(&HFE) ’先頭に付ける同期用コード
RE$ = Chr(&H66)       ’無線機のアドレス
TX$ = Chr(&H0)        ’PCのアドレス
FI$ = Chr(&HFD)       ’メッセージ終了コード

CMA$ = Chr(&H1C)       ’無線機に対するコマンドコード
CMAS1$ = Chr(&H0)      ’  サブコマンド
CMAS2$ = Chr(&H1)      ’  サブコマンド

TxString = PR$ + RE$ + TX$ + CMA$ + CMAS1$ + CMAS2$ + FI$

ec.Ascii = TxString         ’Portへの書き込み

End Sub
無線機に「送信状態にしろ」そうすると「したよ」と返してくる

無線機から返ってくるのも基本的には同じ (REとTXの順序が逆になりますが)

良く判っていない おじいさんにつき合わせてすみません

[ツリー表示へ]
タイトルRe^5: Chr関数 VB2010でおかしい?
記事No11862
投稿日: 2017/08/03(Thu) 11:04
投稿者魔界の仮面弁士
> で Charで試みましたが相手機器には届きませんでした
どこをどう変えたのか分からないので、これだと状況が伝わらないです…。

現状の「正しく動作しないコード」を提示してもらえますか?

少なくとも、Chr 自体は問題なく動作しているようなので、別の部分に
問題がある可能性を疑っています。少なくとも、送信時に問題が起きているのか
結果の受信時に問題があったのかの切り分けは必要でしょう。


ちなみに、Option Strict On は有効にしていますか?


> VB2010等を勉強しなければならない
一応、延長サポート期限内ではありますが、その後、2012、2013、2015 が登場していますね。


> *何故拾ってきたのか >>> EasyComm(多分ご存知でしょう)を使いVBAでシリアル通信を
すみません、まったく知らないです。そもそも、今まで一度も COM ポート接続な機器を扱った事が無いものでして。

一応、SerialPort クラスの基本的な使い方は分かりますが、設定ミスによる障害などといった
ノウハウ的な話になると疎いので、そのあたりの回答は、普段他の人にお任せしています。


それはさておき、VBA は シリアルポート通信のための機能を備えていないため、
API を使って通信するか、ActiveX コンポーネントに頼る必要があるというのは分かります。

そして EasyComm とやらは、Win32 API ベースのモジュールのようですね。
モジュールを書き換えれば VB.NET でも動かせはましますが、
.NET なら SerialPort クラスを使うのが妥当でしょう。



>   a AS Char = Chr(&H6)  は "-" ですが 
それは「どのフォント」を使って、VB2010 のどこに表示した場合の話でしょうか。

> VBAでの  TX$ = Chr(&H6)  は "・" で明らかに違います これは何故でしょう
これは「どのフォント」を使って、Excel 2003 のどこに表示した場合の話でしょうか。


――以下、以前の回答と被る部分もありますが:

&H20 より前のコードに割り当てられた文字は、可読文字ではなく非可読文字です。
処理系によって見え方が異なりますし、そもそも表示できないことすらありますので、
画面上の見た目だけで比較することは、今回のケースではまったく意味がありません。


ちなみに &H6 は、ASCII コード上では 肯定応答 (ACK:Acknowledge) のことであり、
無理に文字として表すなら『』となります。

この文字は、
「MS Pゴシック」では『-』っぽい文字に見え
「MS ゴシック」では『 』っぽい文字に見え
「メイリオ」では『・』っぽい文字に見えます。

フォントバージョンによっては、縦長な『□』に見える場合もありますが、
同じ文字だからと言って、他の環境でも同じ形状に映るという保証はありません。
中には、ChrW(&H2406) の ACK シンボル文字で代替表示される環境さえあるでしょう。

さらに、Visual Studio 2010 のコードエディタ上に貼った場合は、
キーワード着色や、Unicode 複合文字対応などの処理を媒介することになるので
見た目上は、ゼロ幅文字のような扱いとなってしまいます。


いずれにせよ可読文字ではない以上、
文字としての見た目だけにとらわれるのではなく、コード値で比較しないことには、
それが本当に正しくセットされているのかを確認することはできないということです。



> PR$ = Chr(&HFE) + Chr(&HFE) ’先頭に付ける同期用コード
> TxString = PR$ + RE$ + TX$ + CMA$ + CMAS1$ + CMAS2$ + FI$
本来は + 演算子ではなく & 演算子で結合するのが望ましいです。
(今回の場合、それで結果が変わるわけでは無いですが)


> ec.Ascii = TxString         ’Portへの書き込み
文字列ではなく、バイナリ送受信に切り替えてみては如何でしょうか。

EasyComm の場合、Ascii プロパティに文字列を渡す方法の他に、
Binary プロパティにバイナリを渡す方法がありましたよね。

SerialPort で String や Char を扱う場合、実際のバイナリは
Encoding プロパティで指定された符号化方式でエンコード/デコードされます。
(既定値は ASCIIEncoding です)

この変換規則に頼らず送出する場合には、Write メソッドに対して
String を渡すのではなく、Byte配列とその位置を渡すようにします。

[ツリー表示へ]
タイトルRe^6: Chr関数 VB2010でおかしい?
記事No11863
投稿日: 2017/08/03(Thu) 15:36
投稿者MSAKA
>少なくとも、Chr 自体は問題なく動作しているようなので、別の部分に
>問題がある可能性を疑っています。少なくとも、送信時に問題が起きているのか
>結果の受信時に問題があったのかの切り分けは必要でしょう。
>>> 
送信に成功すると無線機側でコマンドのとおり作動するはずなので
それが作動しないのはPortへの書き込みコマンドといいますか
文字列が正しくないと理解しています


> いずれにせよ可読文字ではない以上、
> 文字としての見た目だけにとらわれるのではなく、コード値で比較しないことには、
> それが本当に正しくセットされているのかを確認することはできないということです。
>
> >>>> 上記の件 可読文字では何を使って表示しているかで同じではなくなる
      やっと理解しました (私は何を考えていたのでしょう・・と反省)
>
> > PR$ = Chr(&HFE) + Chr(&HFE) ’先頭に付ける同期用コード
> > TxString = PR$ + RE$ + TX$ + CMA$ + CMAS1$ + CMAS2$ + FI$
> 本来は + 演算子ではなく & 演算子で結合するのが望ましいです。
 
>>> そうですね ついつい + を安易に使ってしまいます

> (今回の場合、それで結果が変わるわけでは無いですが)
>
>
> > ec.Ascii = TxString         ’Portへの書き込み
> 文字列ではなく、バイナリ送受信に切り替えてみては如何でしょうか。
>
> EasyComm の場合、Ascii プロパティに文字列を渡す方法の他に、
> Binary プロパティにバイナリを渡す方法がありましたよね。
>
> SerialPort で String や Char を扱う場合、実際のバイナリは
> Encoding プロパティで指定された符号化方式でエンコード/デコードされます。
> (既定値は ASCIIEncoding です)
>
> この変換規則に頼らず送出する場合には、Write メソッドに対して
> String を渡すのではなく、Byte配列とその位置を渡すようにします。


大変良い提案ありがとうございます  
この方法を使ったことはありませんが早々勉強をして試みて見ます 
2010、2015 今は2017が出ていますが私のレベルではとても追いつけません 

たびたび 適切なアドバイス ご指導ありがとうございます 

[ツリー表示へ]
タイトルRe^7: Chr関数 VB2010でおかしい?
記事No11865
投稿日: 2017/08/03(Thu) 19:24
投稿者MSAKA
> >
> > > ec.Ascii = TxString         ’Portへの書き込み
> > 文字列ではなく、バイナリ送受信に切り替えてみては如何でしょうか。
> >
> > EasyComm の場合、Ascii プロパティに文字列を渡す方法の他に、
> > Binary プロパティにバイナリを渡す方法がありましたよね。
> >
> > SerialPort で String や Char を扱う場合、実際のバイナリは
> > Encoding プロパティで指定された符号化方式でエンコード/デコードされます。
> > (既定値は ASCIIEncoding です)
> >
> > この変換規則に頼らず送出する場合には、Write メソッドに対して
> > String を渡すのではなく、Byte配列とその位置を渡すようにします。
>

sample_0008 の送信部を使って試験を行ってみました
無線機へのコマンドは無事届くことを確認しました

おかげで 山ノ神がご機嫌斜めです(家庭内問題)
後は返って来た信号の変換処理です 戦ってみます

壁にぶつかったら相談させていただきます

魔界の仮面弁士さま  本当にありがとうございました

[ツリー表示へ]