質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

10144閲覧

c#で受信データを表示させたいのですが、表示をasciiで表示させる方法を教えてください

suban

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/12/07 04:30

c#で受信データを表示させようと、下記のようなプログラムを
作成しました。実行させると
¥61 ¥62 ¥63
と表示します。
¥61 ¥62 ¥63 => A B C
と表示させるにはどのように修正すればよいでしょうか

参考にしたサイトはこちらです
http://kana-soft.com/tech/sample_0007.htm

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { byte tmp1; byte tmp2; int readbytes = 0; byte[] readBuffer = new byte[10]; String[] args = new String [10]; int num ; int count = 3; //! シリアルポートをオープンしていない場合、処理を行わない. if ( serialPort1.IsOpen == false ){ return; } try { //! 受信データを読み込む. // string data = serialPort1.ReadExisting(); readbytes = serialPort1.Read(readBuffer, 0, count); tmp1 = 0; tmp2 = 0; do { num = readBuffer[tmp2]; args[tmp2] = num.ToString("C"); //! 受信したデータをテキストボックスに書き込む. Invoke(new Delegate_RcvDataToTextBox(RcvDataToTextBox), args[tmp2]); tmp2++; tmp1++; } while (tmp1 < readbytes); } catch ( Exception ex ){ MessageBox.Show( ex.Message ); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

byte[]をstringに変換する方法ということでお答えすると、
例としてbyte[]型のbytesという変数があるとすれば、

csharp

1var text= Encoding.UTF8.GetString(bytes);

でとれます。
(とりあえずUTF8でEncodeしてますが、そこは用途に合わせて変更していただければと)

反対(stringをbyte[]にする)方法なら

csharp

1var bytes = Encoding.UTF8.GetBytes(text);

って感じですね。

投稿2016/12/07 04:55

BEACHSIDE

総合スコア294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suban

2016/12/07 06:22 編集

申し訳けありません。 c言語の経験はあるのですが、c#は勉強中で 記述方法が、まだわかっていません 下記のように、修正しますと AABABC と表示されました。 最初の3文字にごみのような「AAB」という文字が 表示されてしまうのですが ``` tmp1 = 0; tmp2 = 0; do { bytes[tmp2] = readBuffer[tmp2]; // args[tmp2] = num.ToString("C"); var text = Encoding.UTF8.GetString(bytes); //! 受信したデータをテキストボックスに書き込む. Invoke(new Delegate_RcvDataToTextBox(RcvDataToTextBox), text); tmp2++; tmp1++; } while (tmp1 < readbytes); ```
twyujiro15

2016/12/07 05:51

横から失礼しますが、 ASCII コードを文字列に変換する場合は Encoding.ASCII.GetString(bytes); というように ASCII クラスを使わないといけません。 上記のコードでは UTF-8 のコードとして文字列変換しているので、 文字化けしているんじゃないでしょうか。
suban

2016/12/07 06:00

ありがとうございます。皆様に感謝してます。 ご指摘のように、修正したのですが やはり「AABABC」 と表示されてしまいまして 受信データ数:readbytes は3と表示されていたのですが tmp1 = 0; tmp2 = 0; do { bytes[tmp2] = readBuffer[tmp2]; // args[tmp2] = num.ToString("C"); var text = Encoding.ASCII.GetString(bytes); //! 受信したデータをテキストボックスに書き込む. Invoke(new Delegate_RcvDataToTextBox(RcvDataToTextBox), text); tmp2++; tmp1++; } while (tmp1 < readbytes); } catch ( Exception ex ){ MessageBox.Show( ex.Message ); }
BEACHSIDE

2016/12/07 06:01

`var text = Encoding.UTF8.GetString(bytes);`では、受け取ったbyte[]をstirngに変換するだけです。 (https://msdn.microsoft.com/ja-jp/library/744y86tc(v=vs.110).aspx) ということで、必要に応じて必要なところで使っていただければと思うのですが... SerialPort.Read メソッド(https://msdn.microsoft.com/ja-jp/library/ms143549(v=vs.110).aspx)を見ると、1stパラメーターに読み込まれた文字列が入るようなので、読み込んだバイナリを表示したいのであれば、`var text = Encoding.UTF8.GetString(readBuffer);`してとれません? byte[]の中から1つづ取り出して処理する必要あるならループして何かしてもいいとは思いますし、1文字づつに対して何らかの操作をするなら`var chars = Encoding.UTF8.GetChars(readBuffer);`という感じで`char[]`にしてから加工するのも悪くないかと。 (カリッカリにパフォーマンスチューンしたいとかだと話は別ですが...。) (今、動かす環境なくて見ただけで書いてるので動作チェックしてないので認識違いしてたら....ごめんなさい♪)
BEACHSIDE

2016/12/07 06:05

ASCII完全に見落としてましたw! Encodeは必要に応じてしてねとは書きましたが....タイトルを読み落としてました。twyujiro15さん、thanksです♪。
suban

2016/12/07 06:43 編集

BEACHSIDEさん、twyujiro15さん ありがとうございます。 ’var text = Encoding.UTF8.GetString(readBuffer);` とましたが、実行しますと 「型’system.Byte'のオブジェクトを型’system.string'に変換出来ません」 というエラーが発生致します。 すみません。見落としておりました。 GetCharsでした。実行してみます
suban

2016/12/07 07:05

下記のように修正しましたが 「型’system.Byte'のオブジェクトを型’system.string'に変換出来ません」 というエラーが発生致してしまいます。 ``` tmp1 = 0; tmp2 = 0; do { // bytes[tmp2] = readBuffer[tmp2]; // args[tmp2] = num.ToString("C"); chars = Encoding.ASCII.GetChars(readBuffer); //! 受信したデータをテキストボックスに書き込む. Invoke(new Delegate_RcvDataToTextBox(RcvDataToTextBox), chars[tmp2]); tmp2++; tmp1++; } while (tmp1 < readbytes); ```
suban

2016/12/07 07:32

BEACHSIDEさん、twyujiro15さん ありがとうございました。 皆様のご指摘のおかげで、期待どおりの 「ABC」と表示させる事ができました。 誠にありがとうございます。 ``` do { bytes[tmp2] = readBuffer[tmp2]; chars = Encoding.ASCII.GetChars(bytes); args[tmp2] = chars[tmp2].ToString(); //! 受信したデータをテキストボックスに書き込む. Invoke(new Delegate_RcvDataToTextBox(RcvDataToTextBox), args[tmp2]); tmp1++; tmp2++; } while (tmp1 < readbytes); ```
BEACHSIDE

2016/12/07 07:33

環境がないので妄想で名はしますが、エラーの内容は、byte[]型が必要なのに、byte型が渡されたので型違いのエラーって内容です。 で、問題なのは、 Invoke(new Delegate_RcvDataToTextBox(RcvDataToTextBox), chars[tmp2]);で、2つめの引数には、stringを入れる必要があります。 (上記コードは、byte[]の中の1要素、つまりbyte型を入れている) do{}whileの中ではなく、その外で、text= Encoding.ASCII.GetString(readBuffer);をして、textをinvokeしてもらってもいいですか? Delegeteの中では、(私の妄想だと)テキストボックスに文字を+=して表示しているだけなので、3文字表示するのに3回実行してます。(妄想ですよ) do whileの外で、1回でtextをセットしてあげればinvodkeも一回ですんで表示も解決っと思ってます。 (そんな仕様かしらないで話してます)
BEACHSIDE

2016/12/07 07:37

あ、コメントかぶりましたねw。やりたいことがそれだとすると、以下のコードだけでよいかと。 //! 受信データを読み込む. // string data = serialPort1.ReadExisting(); readbytes = serialPort1.Read(readBuffer, 0, count); var text= Encoding.ASCII.GetString(readBuffer); Invoke(new Delegate_RcvDataToTextBox(RcvDataToTextBox),text);
suban

2016/12/07 08:47

失礼致しました。 ご指摘のとおりでした。 ループさせる必要はなかったんですね。 ありがとうございました。 シンプルなプログラムになりました。 正常に動作致しました。 try { //! 受信データを読み込む. readbytes = serialPort1.Read(readBuffer, 0, count); var text = Encoding.ASCII.GetString(readBuffer); Invoke(new Delegate_RcvDataToTextBox(RcvDataToTextBox), text); } catch ( Exception ex ){ MessageBox.Show( ex.Message ); }
BEACHSIDE

2016/12/07 08:52

すっきり解消できてよかったです♪ これからもC#楽しんでくださーい♪
suban

2016/12/07 08:57

ありがとうございます。 C#の便利さを痛感させて頂きます
twyujiro15

2016/12/07 22:38

解決してからのコメントで申し訳ないですが、 SerialPort クラスには ReadExisting というメソッドもあるので こちらも試してみてください。 byte[] 配列が不要で文字列として取得したいだけなら こちらのメソッドのほうが速いと思います。
suban

2016/12/11 02:57

アドバイスを戴き、ありがとうございます。 ご指摘のとおりで、文字列の出力、入力のオリジナル版は string data = serialPort1.ReadExisting(); を使用されておりました。 シリアルの通信の部分はバイナリにしたいという事で 修正しました。 C#には、あまりくわしないのですあが 皆様のアドバイスに感謝しております
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問