VS2010でRS232Cコマンド送信について

解決


初心者  2012-07-17 12:57:00  No: 147685  IP: 192.*.*.*

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で送信するには、どんなコーディングになるのでしょうか?

編集 削除
魔界の仮面弁士  2012-07-17 13:03:33  No: 147686  IP: 192.*.*.*

VB6 だと MSComm コントロール、VB2010 なら
System.IO.Ports.SerialPort クラスでの通信でしょうか。

> VS2010となった場合、Unicodeになってしまうからなのか
現状はどのようなコードになっていますか?

> エンコードするにしてもうまくできません。
文字列として送出するのではなく、バイト配列で送出しては如何でしょう。

編集 削除
初心者  2012-07-17 15:54:56  No: 147687  IP: 192.*.*.*

魔界の仮面弁士さん、
早速の回答ありがとうございます。

文字列として、コマンド送信しておりました。

>文字列として送出するのではなく、バイト配列で送出しては如何でしょう。

おっしゃるようにバイト配列で送信するようにしてみます。


先に記述するのを忘れてましたが、コマンド最終部にチェックサムを付加して送信しているのですが、バイト配列しした場合、チェックサムを算出後にバイト配列にするのでしょうか。。

strWK = "FDC00600" & StrConv("R5.5-8", vbWide)
culCheckSum 'チェックサム計算
Dim SjisByte As Byte() = Encoding.GetEncoding(932).GetBytes(strWK + strCheckSum)
で良いのか・・・まだ未試行ですが・

説明もへたくそで申し訳ありません。。

編集 削除
魔界の仮面弁士  2012-07-17 16:43:24  No: 147688  IP: 192.*.*.*

> strWK = "FDC00600" & StrConv("R5.5-8", vbWide)
これは、
  strWK = "FDC00600R5.5−8"
という文字列を生成したいということですね?


> で良いのか・・・まだ未試行ですが
短いデータなら、Encoding から GetBytes メソッドで良いでしょうし、長いデータなら、
MemoryStream に BinaryWriter/StreamWriter で書き込む形にすれば良いかと。


> チェックサムを算出後にバイト配列にするのでしょうか。。
文字列でチェックサムを求めてからバイナリ化した場合と、
バイナリでチェックサムを求めた場合とで、
異なるバイト配列になってしまうのでしょうか?

私なら、バイナリ化してからチェックサムを求めるかと思いますが、
どちらでも同じ結果になるのなら、作りやすい方を選べば良いと思います。

編集 削除
初心者  2012-07-17 21:28:02  No: 147689  IP: 192.*.*.*

ありがとうございます。

アドバイス頂いた、バイト配列(チェックサム計算後バイナリ化)で送信OKとなりました。。

掲示板に質問することで、冷静にソースコードを見直すこともできました。

本当にありがとうございました。

編集 削除