dポイントプレゼントキャンペーン実施中!

お世話になります。
VB初心者でシリアル通信(RS232C)を作っております。
送受信は出来るようになったのですが、全角文字が送信・受信共に文字化けします。
英数字が正常に通信できることからエンコードが「UTF-8」になっていると思われますが、これを「S-JIS」に変更する方法がわかりません。インターネットでも色々調べているのですがVB2008は内部コードがUTF-8になっているみたいです。
送信する文字と受信する文字をS-JISでエンコードしたいのですが定義方法とかご存知の方がいましら教えていただければと思います。

今までC言語(PCM)を使っておりましたのでVBはまったくの素人です。
意味不明な質問になっているかもしれませんがご理解の上宜しくお願いいたします。

A 回答 (4件)

#2氏の回答のように


Writeメソッドを Byte配列で出力してみましょう

dim s as String = "ABCDEあいうえお"
Dim b As Byte() = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes(s)
SerialPort1.Write( b, 0, b.Length )
といった具合です

受信については SerialPort1.ReadLineを
dim buf() AS Byte
Array.Resize( buf, SerialPort1.BytestoRead )
SerialPort1.Read( buf, 0, SerialPort1.BytestoRead )

strDataReceived = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString( buf )
といった具合にして見ましょう

この回答への補足

警告1変数 'buf1' は、値が割り当てられる前に参照によって渡されています。Null 参照の例外が実行時に発生する可能性があります。

受信に関しては上記のような注意がでましたが
正常に全角文字を受信してくれました。
ありがとうございます。

補足日時:2008/10/27 15:57
    • good
    • 0
この回答へのお礼

早々の皆様のご協力に感謝です。
SerialPort1.Write( b, 0, b.Length )
このように配列を出力するのですね。助かります。
確かにコンパイルは通りました。

しかし結果はやはり文字化けです。
受け側のPCはハイパーターミナルで受信していますが
今までは「あいうえお」→「?????」のように
全角文字数分?を表示していましたが、上記Byte配列出力に変えたら

, ,?,?|,・(?部分は意味部名なギリシャ文字みたいなもの)
となり、やはり文字化けです。

私のやり方に問題があるのでしょうか?
ちなみに英数字のほかにも*l;`p*?><|\なども記号も正常に通信します。

宜しくお願いいたします。

お礼日時:2008/10/27 15:49

>警告 1 変数 'buf1' は、値が割り当てられる前に参照によって渡されています。

Null 参照の例外が実行時に発生する可能性があります。

警告メッセージそのままですね。
値を設定する前に使用される可能性があるからです。

dim buf1() AS Byte = Nothing(No3さんのソースだとbufだけど名前が違うのかそれとも別の変数なのかな・・・)

↑のように初期化すれば警告は消えると思われます。
C#やJavaでも同様の記述をするとやはり似たような警告が出ます。
    • good
    • 0
この回答へのお礼

ご返事を頂、有難うございます。
buf1は名前を変えただけです。
ディメンジョンのバイト定義に=Nothingを付ければ良いのですね。
やってみます。

・・・・しかし、PCが立ち上がらない・・・
朝電源を入れたら、OSにアクセスすらしてくれません。
もう1台のPCにはVB入ってないし・・

今、バッテリーを外して放電をしています。治るとは?思えないけど・・

No4さんのご指摘でワーニングが消えるか試してみたい!

早くPCが生き返って欲しいです。

お礼日時:2008/10/28 09:37

以下のコードで、Shift-JISのバイト配列に置換できますが、答えになっていますでしょうか。



Dim s As String = "ABCDEあいうえお"
Dim b As Byte() = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes(s)

この回答への補足

バイト配列の置き換えですが下記のようなコンパイルエラーになります。

エラー1型 'Byte の 1 次元配列' の値を 'String' に変換できません。

補足日時:2008/10/27 15:02
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
私は、VBは本当に素人(VB歴3日)(^^;ですので自信が無いのですが・・

下記は通信の送信部分です。
DIMでString定義をすれば良いのか?と思いやってみました。

Dim s As String = "ABCDEあいうえお"
'SerialPort1.Write("ABCDEあいうえお")←現在はこんな感じ
SerialPort1.Write(s)   →ご指摘の変数宣言してみました。
SerialPort1.Write(Chr(13) & Chr(10)) 'CRLF

結果は同じでした。
ABCDE????
この?はハイパーターミナルでの表示で例外はすべて?表示のようです。
実際は意味不明な文字化けになると思います。

受信は
Delegate Sub AddDataDelegate(ByVal str As String)

Private Sub AddData(ByVal str As String)
TextBox3.Text = TextBox3.Text + str
End Sub

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim strDataReceived As String
Dim add As New AddDataDelegate(AddressOf AddData)
Try
strDataReceived = SerialPort1.ReadLine
Catch ex As Exception
strDataReceived = ex.Message
End Try
TextBox3.Invoke(add, strDataReceived)
End Sub

受信データーを受けると
TextBox3.Text  に表示するようにしています。
やはりこれも文字化けします。(半角英数字は正常)

受信データーはS-JISを受信しているはずなのですが・・・
もしかして、UTF-8に変えられた?って感じです。

宜しくお願いいたします。

お礼日時:2008/10/27 14:55

シリアルポートは「8ビット」になっていますか?



もし「7ビット」になっているなら、UTF-8だろうが、S-JISだろうが、EUCだろうが、8ビットのデータは送受信出来ず、どの文字コードでも文字化けします。

7ビットで唯一送受信可能なのは「JISコード」のみです。JISコードであれば、使用するキャラクタはすべて7ビットなので、シリアルポートが7ビットでも問題は起きません。

逆に言うと「シリアルポートを8ビットにしておけば、どんなキャラクタも通るので、文字コードは何であってもOK」なので、コード変換する必要はなくなります。

結論:送受信とも、シリアルポートを7ビットから8ビットに変更しましょう
    • good
    • 0
この回答へのお礼

早々のご返事を頂感謝いたします。
シリアルポートは
通信速度9800bps
データービット 「8bit」
パリティー なし
ストップビット 1bit

ケーブルは単純な送受信クロスとGRDのみの3本配線です。

送受信データーの長さは「8bit」にしております。

宜しくお願いいたします。

お礼日時:2008/10/27 13:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!