tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^5: Chr関数 VB2010でおかしい?
投稿日: 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配列とその位置を渡すようにします。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。