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

解決


初心者  2012-07-17 21:57:00  No: 147685

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 22:03:33  No: 147686

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

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

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


初心者  2012-07-18 00:54:56  No: 147687

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

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

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

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

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

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

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


魔界の仮面弁士  2012-07-18 01:43:24  No: 147688

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

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

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

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


初心者  2012-07-18 06:28:02  No: 147689

ありがとうございます。

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加