お世話になります。
VB初心者でシリアル通信(RS232C)を作っております。
送受信は出来るようになったのですが、全角文字が送信・受信共に文字化けします。
英数字が正常に通信できることからエンコードが「UTF-8」になっていると思われますが、これを「S-JIS」に変更する方法がわかりません。インターネットでも色々調べているのですがVB2008は内部コードがUTF-8になっているみたいです。
送信する文字と受信する文字をS-JISでエンコードしたいのですが定義方法とかご存知の方がいましら教えていただければと思います。
今までC言語(PCM)を使っておりましたのでVBはまったくの素人です。
意味不明な質問になっているかもしれませんがご理解の上宜しくお願いいたします。
No.3ベストアンサー
- 回答日時:
#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 参照の例外が実行時に発生する可能性があります。
受信に関しては上記のような注意がでましたが
正常に全角文字を受信してくれました。
ありがとうございます。
早々の皆様のご協力に感謝です。
SerialPort1.Write( b, 0, b.Length )
このように配列を出力するのですね。助かります。
確かにコンパイルは通りました。
しかし結果はやはり文字化けです。
受け側のPCはハイパーターミナルで受信していますが
今までは「あいうえお」→「?????」のように
全角文字数分?を表示していましたが、上記Byte配列出力に変えたら
, ,?,?|,・(?部分は意味部名なギリシャ文字みたいなもの)
となり、やはり文字化けです。
私のやり方に問題があるのでしょうか?
ちなみに英数字のほかにも*l;`p*?><|\なども記号も正常に通信します。
宜しくお願いいたします。
No.4
- 回答日時:
>警告 1 変数 'buf1' は、値が割り当てられる前に参照によって渡されています。
Null 参照の例外が実行時に発生する可能性があります。警告メッセージそのままですね。
値を設定する前に使用される可能性があるからです。
dim buf1() AS Byte = Nothing(No3さんのソースだとbufだけど名前が違うのかそれとも別の変数なのかな・・・)
↑のように初期化すれば警告は消えると思われます。
C#やJavaでも同様の記述をするとやはり似たような警告が出ます。
ご返事を頂、有難うございます。
buf1は名前を変えただけです。
ディメンジョンのバイト定義に=Nothingを付ければ良いのですね。
やってみます。
・・・・しかし、PCが立ち上がらない・・・
朝電源を入れたら、OSにアクセスすらしてくれません。
もう1台のPCにはVB入ってないし・・
今、バッテリーを外して放電をしています。治るとは?思えないけど・・
No4さんのご指摘でワーニングが消えるか試してみたい!
早くPCが生き返って欲しいです。
No.2
- 回答日時:
以下のコードで、Shift-JISのバイト配列に置換できますが、答えになっていますでしょうか。
Dim s As String = "ABCDEあいうえお"
Dim b As Byte() = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes(s)
この回答への補足
バイト配列の置き換えですが下記のようなコンパイルエラーになります。
エラー1型 'Byte の 1 次元配列' の値を 'String' に変換できません。
ご回答ありがとうございます。
私は、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に変えられた?って感じです。
宜しくお願いいたします。
No.1
- 回答日時:
シリアルポートは「8ビット」になっていますか?
もし「7ビット」になっているなら、UTF-8だろうが、S-JISだろうが、EUCだろうが、8ビットのデータは送受信出来ず、どの文字コードでも文字化けします。
7ビットで唯一送受信可能なのは「JISコード」のみです。JISコードであれば、使用するキャラクタはすべて7ビットなので、シリアルポートが7ビットでも問題は起きません。
逆に言うと「シリアルポートを8ビットにしておけば、どんなキャラクタも通るので、文字コードは何であってもOK」なので、コード変換する必要はなくなります。
結論:送受信とも、シリアルポートを7ビットから8ビットに変更しましょう
早々のご返事を頂感謝いたします。
シリアルポートは
通信速度9800bps
データービット 「8bit」
パリティー なし
ストップビット 1bit
ケーブルは単純な送受信クロスとGRDのみの3本配線です。
送受信データーの長さは「8bit」にしております。
宜しくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(メールソフト・メールサービス) outlookからの送信された件名が文字化けします 2 2023/04/18 14:29
- その他(プログラミング・Web制作) Sikulix2.0.5(Jython2.7.3)でcsvを読込WEB検索条件にpasteで文字化け 1 2023/03/31 11:02
- C言語・C++・C# S-JIS → JIS コード変換するには 3 2023/02/09 23:55
- Gmail gmail から docomo メールに送信できません 4 2022/06/25 00:41
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- Java VScodeのターミナルの文字化けについて 1 2022/09/27 22:19
- その他(メールソフト・メールサービス) 「Thunderbirdメール」の送信文字のフォントや色の変更 3 2023/03/17 16:43
- iPhone(アイフォーン) ショートメールの文字数制限について。 3 2023/01/24 11:37
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
2次元配列のソート
-
グラフの「項目軸ラベルに使用...
-
Redim とEraseの違いは?
-
VB.NETの配列にExcelから読み込...
-
配列の中の最大値とそのインデ...
-
DBから取得した値を配列へ代入する
-
デバイスマネージャーの一覧取得
-
VB6からの移行したいけど、VB.N...
-
Excel2010のinputboxで複数デー...
-
複数のtextboxの処理を一括で行...
-
VBA 桁数が混在するソート
-
大量の変数を定義するにはどう...
-
VB.NETにて、構造体へデータを...
-
COBOLの基本的な事なので...
-
画像ファイルを配列に格納する方法
-
レコードセットの中身を配列に...
-
VB2008EE でS-JISでエンコード...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
配列の中の最大値とそのインデ...
-
VB.NETの配列にExcelから読み込...
-
定数配列の書き方
-
Excel2010のinputboxで複数デー...
-
大量の変数を定義するにはどう...
-
構造体配列の特定のメンバーをF...
-
構造体配列内の文字列検索のよ...
-
Redim とEraseの違いは?
-
Segmentation Fault (メモリ制限?)
-
OutOfMemoryExceptionの回避策...
-
VBAでMODE関数をつくる
-
COBOLの基本的な事なので...
-
Excelのメモリ(配列)の上限は2G...
-
コンボボックスのインデックス...
-
VB6のメモリ解放に関して
おすすめ情報