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

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

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

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

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Q&A

解決済

2回答

788閲覧

シリアル通信で受信したデータが正しく保存されない

shimakon

総合スコア3

C#

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

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

0グッド

0クリップ

投稿2022/10/31 11:22

前提

RS232C経由のシリアル通信でPLCからデータを受信するC#プログラムを作っています。
受信したデータをcsvに保存しているのですが、下記例のようにデータに"?"が紛れてしまう問題が発生しています。原因は何でしょうか?

*何かの文字が"?"に置き換わっている訳ではないです。
*"?"が入る箇所の規則性も今の所見つかっていません。

(データ例)
?aaaaaaa ? ,bbbbbbb ? , ? ,0 ? ,0? ?,0,0,1,1,1?,2,0 ? 2
?aaaaaaa ? ,bbbbbbb? , ? ,0 ? ,?0 ? ,0,0,1,1,?1,2,0 ? 2
?aaaaaaa ? ,bbbbbbb ? , ? ,0 ? ,0? ?,0,0,1,1,1?,2,0 ? 2
?aaaaaaa? ,bbbb?bbb , ? ,0? ? ,0 ? ,0,0,1,?1,1,2,0 ? 2

実現したいこと

"?"を紛れさせずに、正しいデータをcsvに保存したい。

該当のソースコード

受信、csvへの保存はC#の以下のようなプログラムで行っています。

C#

1private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 2{ 3 ReceivedData = serialPort1.ReadLine(); 4 data_csv = ReceivedData.Split(','); 5 6 StreamWriter writer = new StreamWriter(file_name , true); 7 writer.Write(String.Join(",", data_csv)); 8 writer.Close(); 9}

試したこと

TeraTermでは"?"が紛れていないデータをコンソール上で表示、.logに保存できることは確認しております。

最悪、読み取ったデータから"?"の文字列を削除して保存すれば目的は達せられそうですが、本質の問題を解決したく、どうぞよろしくお願いいたします。

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

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

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

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

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

KOZ6.0

2022/10/31 14:48

Split して Join する意味が無いような・・・
thkana

2022/10/31 22:19

> "?"が入る箇所の規則性も今の所見つかっていません。 とりあえず提示されたデータでは、行頭は必ず'?' で、'?'が9個/行、なんてのは相当強い規則性に思えますけれど。 > TeraTermでは バイナリで受信/保存してそのデータ列を見てみるとどうなっていますか? オシロがあれば232の生の波形も見たいところですが。
tmp

2022/10/31 23:16 編集

SerialPortのParityReplaceの63(?)を変更してかわるようでしたらパリティエラーが発生しているかもしれません。
KOZ6.0

2022/11/01 00:29

どこのメーカーの何というシーケンサなんでしょうか?
shimakon

2022/11/01 11:58

>thkana様 ありがとうございます。確かに"?"が入りやすい箇所はありそうですね。 他の方からもバイナリでの受信が怪しいとのことなので確認してみたいと思います。 >tmp様 ありがとうございます。ParityReplaceを使ってでパリティエラーが原因か確認してみます。 >KOZ6.0 キーエンスのKV-8000を使用しています。
KOZ6.0

2022/11/01 15:21

これですか? プログラマブルコントローラ KV-8000 シリーズ シリアルコミュニケーションユニット 2ポート(RS-232C×2) https://www.keyence.co.jp/products/controls/plc-building/kv-8000/models/kv-xl202/ 伝送仕様のところを見ると固定ではなく、設定可能のようです。 この情報に加え、デリミタがどうなっているか確認してください。
guest

回答2

0

ベストアンサー

Tera Term 端末の設定から文字コードを確認してください。
(変更していなければ UTF-8 になっていると思います。)
https://hrroct.hatenablog.com/entry/2019/04/07/230802

その上で、適したエンコーディングを SerialPort.Encoding プロパティ に設定してください。

SerialPort.Encoding プロパティ
https://learn.microsoft.com/ja-jp/dotnet/api/system.io.ports.serialport.encoding?view=netframework-4.8

追記

エラーが発生すると ? に置き換わるようです。
PLC の通信設定(通信速度、データビット長、ストップビット長、パリティ)を確認してください。

投稿2022/10/31 14:28

編集2022/10/31 22:20
KOZ6.0

総合スコア2622

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

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

shimakon

2022/11/04 00:16

こちらの問題解決いたしました。 原因はパリティエラーでした。(パリティビットをOdd⇒Noneに変えると"?"が消えました) 送信側のプログラムは当方とは別の方が作成されたので、設定の認識ミスでした。 (1点気になるのは、TeraTermではパリティビットをOdd、Even、Noneのどれにしてもコンソール上には正しく表示されるのはどうしてなのでしょうか) KOZ6.0様をはじめ、ご回答、コメントを頂いた皆様ありがとうございました。
guest

0

そのPLCの応答データはバイナリデータじゃないですか
テキストで読み込んでも意味のあるデータにはなりません

投稿2022/10/31 12:27

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問