• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:シリアル通信プログラム(受信)について)

シリアル通信プログラム(受信)について

このQ&Aのポイント
  • シリアル通信をする(受信のみ)プログラムを作成しています。接続先から受信したデータが文字化けしており、原因がわかりません。どこが問題なのか教えていただけないでしょうか?
  • 接続先から送信されるデータの中で最初の2バイトが欠けているようです。文字化けしても周期的に固定の値に対応した文字が表示されるはずですが、それも見えていません。シリアル通信初心者のため、コードに間違いがあるかもしれません。配列にデータが格納されるかどうかも疑問です。
  • シリアル通信プログラム(受信のみ)を作成中ですが、接続先から受信したデータが文字化けしています。送信されるデータには最初の2バイトが含まれているはずですが、それも表示されていません。シリアル通信初心者のため、コードに問題がある可能性があります。正しい受信方法とデータの表記方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

>一応、ReadFileをおわったあとにdwReadを確認したのですが、50になっていました。 であれば、ReadFile()が失敗したとかはなさそうですね。 # ReadFile()の戻り値を確認していないのであればdwReadはReadFile()コール前にクリアしておいた方がいいかと思いますが。 >なんらかの失敗といわれるとどういった失敗がありえるのでしょうか? タイムアウトがないのであれば…基本的には失敗はない…でしょうね。 コネクタ類が接触不良でデータが化けるとか、XON/XOFFフロー制御している…とかでなければ。 >(ボーレートの設定がおかしければデータがかわることはあるでしょうが・・・) ボーレート以外の設定が異なっていた場合も化けると思われます。 >接続先がデータを送らなくとも、ReadFileがデータを格納することがあるのでしょうか? 受信バッファに残っていた場合は読み出す…でしょうね。 CreateFile()でシリアルポートを開く処理、シリアルポートの設定を行っている部分も掲示された方がいいかも知れません。 # が、私自身はAPI叩いてシリアルポート操作したことは無かったりします。 WindowsAPIのパターンとして…構造体は0x00でクリアして必要な部分だけ設定する。 という方法を採らないと妙な挙動することもありますので、その辺りは確認された方がいいでしょう。 APIに構造体のアドレスを渡して、情報を取得(上書きされる)から…ということで、未初期化の構造体渡したらエラーで何も設定してくれなかった。 なんて場合もあります。 # 構造体のメンバに「構造体のサイズ」を格納する場合、その構造体のサイズで対応バージョンを判別する。 # なんて挙動をしている場合もありますので。

nayamumono108
質問者

お礼

お返事遅くなり、申し訳ございません。 とりあえず、初期化などをおこなうと周期的に0x2B, 0x22がでるようになりました。 ただ、出力されるはずのないマイナスの値(ffffc3など)がでているのでもう少しなにかがたりなさそうです。 初期化などで改善さているのでおそらくデータ格納のところをもう少し改善すればできそうだと思います。 もう少しいろいろやってみます。 一度ここで回答を打ち切りさせていただきます。 いろいろとありがとうございました。

その他の回答 (4)

回答No.5

No.1 です。 「バイナリデータでは?」と書いたのは間違っていたわけですが、それでも、 printf("%02x\n",pszBuf[i]); で、バイナリデータとして確認してみるのは、無駄ではないと思います。 これで、どういうコードとして渡ってきているかは確認できますので。

nayamumono108
質問者

お礼

お返事おそくなり、申し訳ございません。 上のコメントにも書いておりますが、printf("%02x\n",pszBuf[i])をやると ffffc3みたいなのがでてきました。 もう少しこちらで考えます。 いろいろありがとうございました。

回答No.3

#1 です。 > 0x02, 0x22ではなく0x2B, 0x22のようですので文字列かと。>#1 確かに。0x02 をバイナリデータでよく使うので、思わず見間違えていました。 お恥ずかしい。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>ReadFile(hComm, pszBuf, 50, &dwRead, NULL);  //50バイトまでデータを取得 ReadFile()は50バイト読み込みが完了するまで絶対に戻ってこない。 という認識でよろしいですか? タイムアウトで戻って来るとか、なんらかの失敗はあり得ない。 という前提のコードですけど。 ReadFile()の戻り値の確認をしていなかったり、第4引数で渡した変数の内容は無視して50回のループをまわしたり…というのはそういう意図であると読めますが…。 ReadFile()で1バイトも読み込めずに失敗した場合、第2引数で渡したバッファの中身はどうなりますかね? # ReadFile()に渡す前にmemset()などで意味のある初期化をしておく…というのも手かと思われますよ。 # 後で文字列として扱いたいなら'\0'で埋めておく…とか。 当たり前ですが、送信元が問題ない場合…ですので、TeraTermなどで正常に受信できる。 というのは予め確認しておいた方がいいかと思います。 0x02, 0x22ではなく0x2B, 0x22のようですので文字列かと。>#1

nayamumono108
質問者

補足

asano_nagiさん、Wr5さん お返事遅くなり申し訳ございません。 ご回答ありがとうございました。 >ReadFile()は50バイト読み込みが完了するまで絶対に戻ってこない。 >という認識でよろしいですか? はい、そのとおりです。 まず、タイムアウトは考えずにわざと50バイトのデータがくるまで待つようにしています。これは接続先が1秒ごとに10バイトのデータをおくるので、タイムアウトの設定をしなければ、いつかは必ず50バイトのデータが送られてくると 思ったからです。一応、ReadFileをおわったあとにdwReadを確認したのですが、50になっていました。 >タイムアウトで戻って来るとか、なんらかの失敗はあり得ない。 なんらかの失敗といわれるとどういった失敗がありえるのでしょうか? 私の考えでは、接続先がPCにデータを1秒ごと10バイトおくっているだけなので、その間にデータが変化することはないと思ったんですが・・・ たとえば、接続先が(0x2B, 0x22,0x4B, 0x32,0xB3・・・)というデータをPCに送ったとき、PCがうけとるときに(0x2B, 0x00,0x22,0x40, 0x32,0xB3・・・)のようにデータが増えたり、データ自体がかわってしまうということもありえるのでしょうか?(ボーレートの設定がおかしければデータがかわることはあるでしょうが・・・) 接続先がデータを送らなくとも、ReadFileがデータを格納することがあるのでしょうか? ># ReadFile()に渡す前にmemset()などで意味のある初期化をしておく これは一回やってみます。 >当たり前ですが、送信元が問題ない場合…ですので、TeraTermなどで正受信できる。というのは予め確認しておいた方がいいかと思います。 ハイパーターミナルで確認しております。0x2B, 0x22でてきていました。

回答No.1

とりあえず、 printf("%c\n",pszBuf[i]); を、 printf("%02x\n",pszBuf[i]); に変更すると、何か見えてくると思います。 先頭に、0x02, 0x22 が付加されていることから考えても、そのデータは、「バイナリデータ」である可能性が高いと思うわけです。 これは、文字コードの形で送られてくるデータ(テキストデータ)ではないので、("%c" で)文字として表示しても、意味のある表示はできません。 %02x という書式指定子で、まずは、16進のバイナリデータとして表示できますので、これだと、少なくとも、先頭の0x02, 0x22 は見られると思います。

関連するQ&A