VS2010初心者です。。。
RS232C制御している機器に対して、コマンドを送信しているのですが、環境を変えた場合にうまく送信できなくなりました。
<現状>
OS:WIN98
プログラム:VB6
<今後>
OS:WIN7
プログラム:VS2010
送信したいコマンド
@*FDC00600文字列
文字列:全角(シフトJISコード)
VB6では
gstrBuf1="@*" & "FDC" & "006" & "00" & StrConv("R5.5-8", vbWide)
Form1.MSComm1.Output = gstrBuf1
としてます。
WIN98+VB6でのラインモニタ結果(キャラクタ変換)@*FDC00600<82>q<82>T<81>D<82>T<81>|<82>W03<CR>
となっていました。
VB6では、シフトJISコード変換しなくても、問題無く通信できたのですが、
VS2010となった場合、Unicodeになってしまうからなのか、エンコードするにしてもうまくできません。
上記のような、VB6のラインモニタのコマンドをVS2010で送信するには、どんなコーディングになるのでしょうか?
VB6 だと MSComm コントロール、VB2010 なら
System.IO.Ports.SerialPort クラスでの通信でしょうか。
> VS2010となった場合、Unicodeになってしまうからなのか
現状はどのようなコードになっていますか?
> エンコードするにしてもうまくできません。
文字列として送出するのではなく、バイト配列で送出しては如何でしょう。
魔界の仮面弁士さん、
早速の回答ありがとうございます。
文字列として、コマンド送信しておりました。
>文字列として送出するのではなく、バイト配列で送出しては如何でしょう。
おっしゃるようにバイト配列で送信するようにしてみます。
先に記述するのを忘れてましたが、コマンド最終部にチェックサムを付加して送信しているのですが、バイト配列しした場合、チェックサムを算出後にバイト配列にするのでしょうか。。
strWK = "FDC00600" & StrConv("R5.5-8", vbWide)
culCheckSum 'チェックサム計算
Dim SjisByte As Byte() = Encoding.GetEncoding(932).GetBytes(strWK + strCheckSum)
で良いのか・・・まだ未試行ですが・
説明もへたくそで申し訳ありません。。
> strWK = "FDC00600" & StrConv("R5.5-8", vbWide)
これは、
strWK = "FDC00600R5.5−8"
という文字列を生成したいということですね?
> で良いのか・・・まだ未試行ですが
短いデータなら、Encoding から GetBytes メソッドで良いでしょうし、長いデータなら、
MemoryStream に BinaryWriter/StreamWriter で書き込む形にすれば良いかと。
> チェックサムを算出後にバイト配列にするのでしょうか。。
文字列でチェックサムを求めてからバイナリ化した場合と、
バイナリでチェックサムを求めた場合とで、
異なるバイト配列になってしまうのでしょうか?
私なら、バイナリ化してからチェックサムを求めるかと思いますが、
どちらでも同じ結果になるのなら、作りやすい方を選べば良いと思います。
ありがとうございます。
アドバイス頂いた、バイト配列(チェックサム計算後バイナリ化)で送信OKとなりました。。
掲示板に質問することで、冷静にソースコードを見直すこともできました。
本当にありがとうございました。
ツイート | ![]() |