• 締切済み

H8の通信について

H8S/2215(以下H8)の通信について質問があります。 なお開発環境は、下記の通りです。 H8(データ送信側):C(High-performance Embedded Workshop) PC(データ受信側):C#(Visual Stdio) H8は、4種類のデータ(以下測定データ)が各10個分溜まったらデータ送信するというものです。 下記が送信の詳細です。 ・2ms間隔で測定データを取得 ・測定データは、0からインクリメントしたデータ(0~65535) ・シリアル通信 ・送信形式は、EE 80 XX XX XX ・・・EE FF  測定データは上位8bit、下位8bitに分割(例:43690(10進)→AA AA(16進))  (XXは送信データ、EE80,EEFFは固定)  例:EE 80 AA AA AA AA AA AA・・・EE FF PCは、その送られてきたデータの異常判定をしています。受信したデータは全てログに保存しています。 通信の仕様は、57600bps,パリティチェック無し,データビットは8,ストップビットを1にしています。 現在受信したデータは、一部かけて受信しています。データは、約30,40ほどかけています。しかし、一部かけて受信するという事象は、30000~39999にかけて起こっていることが分かりました。(測定データを0~65535で取得している場合) その他の受信時のデータにはそのような事象が起こっていません。 測定データを30000~39999で限定した場合、データ受信するとログデータに受信データの一部かけるという事象が全ての測定で起こっています。 データの一部がかけるという間隔は特に、周期があるとは思われませんでした。 なぜ、測定データが30000~39999の間では受信データが一部かけるということが起こるのでしょうか?それとも、30000台という数字に特に意味がないのでしょうか? もしお分かりになる方がいらしましたら、ご教授願います。

みんなの回答

  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1

 データの送受信に どのようなプロトコルを採用していらっしゃるのか 存じませんが、・・・   測定データが30000~39999の間、つまり 75 30 ~ 9C 3F の 情報を送信すると、何かまったく別の 制御コード(エスケープシーケンス等) に誤判断されてしまう、といったことはあり得ませんか?  

piyopp
質問者

補足

ご回答ありがとうございます。 30000~39999の測定データが別の制御コードに判断されるということは ありませんでした。 (ログ保存ファイルには、受信したデータをそのままファイルへ書込んでおります。) 他に、原因があるとすればどのようなものがあるのでしょうか? ご回答よろしくお願いします。

関連するQ&A

  • H8/36064を使ったシリアル通信について

    今学校のほうでH8/36064をつかってA/D変換したデータをPCに送るためのプログラムを作っているのですが、取り込んだデータをシリアル通信を使ってPCに送るとどうしても文字化けしてしまいます。 だめな原因などを教えていただけないでしょうか。 /*プログラム*/ #include "iodefine.h" #include <machine.h> //割り込みマスクビット変更関数set_imask_ccr()を              //使用するためのインクルードファイル #include <stdio.h> void main(void) { while(1){ if(AD.ADCSR.BIT.ADF == 1) Getad(); } } init() //A/D変換およびタイマV初期設定用関数 { set_imask_ccr(1); //割り込み禁止設定 AD.ADCSR.BIT.SCAN = 1; AD.ADCSR.BIT.CH = 101; TV.TCRV1.BIT.ICKS = 0; TV.TCRV0.BIT.CKS = 3; //Φ/128 TV.TCORA = 115-1; //コンペアマッチAの値 TV.TCRV0.BIT.CCLR = 1; //タイマカウンタクリア TV.TCRV0.BIT.CMIEA = 1; //割り込み発生フラグ設定 set_imask_ccr(0); //割り込み禁止解除 } void Sci3() //シリアル通信設定 { unsigned int dmy; IO.PMR1.BIT.TXD = 1; //TXD端子使用設定 SCI3.SCR3.BYTE = 0; //SCR3クリア SCI3.SMR.BYTE = 0; //SMRフォーマット設定 SCI3.BRR = 47; //9600bps for(dmy = 280;dmy > 0;dmy--); SCI3.SCR3.BIT.TE = 1; //送信動作許可 } void sendCharSCI(char data) //データ送信設定 { while(SCI3.SSR.BIT.TDRE==0); //トランスミットデータレジスタエンプティが真になるまで待機 SCI3.TDR = data; //トランスミットデータレジスタに送信データ(8bit)をセット SCI3.SSR.BIT.TDRE = 0; //「送信中」フラグを立てる return; } void print(char *str) { while(*str !='\0') { sendCharSCI(*str); str++; } return; } Getad() { volatile unsigned int *data = (unsigned int *)0xfa00; volatile unsigned int *data2 = (unsigned int *)0xfa10; *data =AD.ADDRA; *data = *data >> 6; //右に6bitシフト *data2 =AD.ADDRB; *data2 = *data2 >> 6; //右に6bitシフト AD.ADCSR.BIT.ADF = 0; AD.ADCSR.BIT.ADST = 0; Sci3(); // SCI3初期化 sendCharSCI(*data); sendCharSCI(*data2); } #pragma interrupt (TimerV(vect=22)) //割り込み処理関数としてTimerVを宣言 void TimerV(void) { static int count; //20000回(0.1秒)ごとにGetad // コンペアマッチフラグを0に戻し、次のコンペアマッチに備える。 TV.TCSRV.BIT.CMFA = 0; if(count<100) count++; else { count = 0; AD.ADCSR.BIT.ADST = 1; //AD変換開始 } }

  • H83052 シリアル通信 A/D変換データ送信 について

    毎回の質問失礼します。 現在H83052マイコンを使用して、センサで得た電圧値を1ms間隔でA/D変換させるプログラムを作成しています。 マイコンのA/D変換機能と、ITUタイマ機能を用いて測定を行うまでのプログラムの作成は何とか完了しました。 ここで、測定終了後データをどのようにして表示したらいいのかというところでとまっています。 データはA/D変換データ(data[]←int型)、A/D変換時の時間データ(time[]←long型)が、測定プログラム実行時に200個ずつ配列に保存されています。 これをそのままシリアル通信機能を用いてPC側に表示させるようにしたいのです。シリアル通信のH8側からPCへの送信の場合TDRにデータを書き込みそれをTxDより送信すると思うのですが、実際にTDRのアドレスは1バイトですので、データとしては入りません。1バイトごと分けて送信するという方法になってくるのではないかと考えていますが・・・ また、送信する時のコードとしては、数字データもアスキーコードとして送信されてしまうことになるのでしょうか? どなたか、わかることやアドバイスがあれば、回答よろしくお願いします。

  • H8/3069 SCIについて

    H8/3069のシリアル通信機能についての質問です。 SCI0を調歩同期式に設定して、パソコン上のハイパーターミナルと通信しています。SCI1とSCI2をクロック同期式に設定して、tx1とrx2,tx2とrx1,sck1とsck2を配線接続した状態です。 このとき、PC(ハイパーターミナル)からの送信データ⇒SCI0で受信⇒SCI1から送信⇒SCI2で受信⇒SCI0からパソコンに対してデータ送信したいと思っています。 ところが、SCI1のクロック同期式でのデータ送信がまずできません。データもクロックも出せていないです。 そこで、SCI0,SCI1,SCI2のすべてを調歩同期式に設定した場合は、上記のデータの送受信は成功しています。 H8/3069において、SCI0,SCI1,SCI2のシリアル通信方式の設定を上記のように、1つのH8に対してクロック同期と調歩同期を混在させた場合、何かうまく動作しない原因は考えられますでしょうか。 プログラムでのSCI0とSCI1,SCI2の初期設定の違いは、SCI1とSCI2は、SMRレジスタC/Aビットを1(SCI0は0)にして、SCI2については、SCRレジスタのCKE1ビットを1(SCI0,SCI1は0)にした状態にしています。 よろしくお願いいたします。

  • 通信速度について

    通信速度は、64kbpsのようにビット/秒で表されていますが、実際に送信するファイルは***KB、つまりバイトですよね。 これは、例えば64kbpsのISDN回線を使用して8KBのデータを送信した場合、同時に他の人がこの回線を使用していなければ1秒(ビットを8で割った数値がバイトでよかったでしたっけ?)で送信完了するということですか? 更に、同時に2人で同じデータのものを受信した場合は、回線の容量から受信速度が2倍になると考えてよいのですか? おおざっぱな考え方としてあってますか?

  • 同期通信と非同期通信の違いについて

    シリアル通信では、ビットを正しいタイミングで送り、受信者も正しいタイミングで受け取るために、送信者と受信者の間で信号の同期が必要です。 信号の同期方法は、データとは別にタイミング信号用のクロックを使用する同期式と、スタートビットやストップビットでタイミングを取る非同期式があります。 と、本に書いてあったのですが、何のことやらさっぱりわかりません。 どなたか、わかりやすく教えていただけませんでしょうか??

  • sheet1(1月)からsheet12(12月)をsheet13(H17年度)に集計したい

    sheet1(1月) A   B  C 1 得意先  銀行  金額 2 aa社 xx 50 3 cc店 yy 30 4 ee社 xx 20 sheet2(2月)   A B C 1 bb zz 50 2 ee xx 30 3 cc yy 50 4 dd ww 30 目的のsheet sheet13(H17年度) A     B    C    D 1 得意先  1月   2月   3月 2 aa社   50   3 bb社 50 4 cc社 30 50 5 dd社 30 6 ee社 20 30

  • charからの型変換

    現在,計測機からUDP通信で送信される計測データをwinsockを用いて受信し解析するプログラムを書いています.受信データは16進数の数値群です. http://www.geekpage.jp/programming/winsock/udp.php こちらのコードを参考に作成し,buf配列内をdatファイルで書き出すことで受信データの確認も出来ました. しかし,解析にあたりいくつか私では解決できない問題に悩んでいるので質問させていただきます. recv関数の第二引数で指定する配列がchar型しか指定できないようで受信データが文字データとなってしまうことに悩んでいます. これをint型などの計算しやすい型に変換したいのですが,strtolやatol関数を用いても失敗してしまいます.(ASCIIに準拠していない為?) printf("%s %x",buf , buf)でbufを表示しようとしてもやはり文字化けが起こってしまいます. int型やdoubleなどの数値の型へ変化する方法をアドバイスいただけないでしょうか? datファイルで保存した受信データはこんな感じです(一部) FF EE 3D 75 62 00 C3 00 00 FF 55 00 D7 00 00 FF 5E 00 D7 00 00 FF 5A 00 C3 00 00 FF 64 00 C3 00 00 FF 62 00 EB 00 00 FF 71 00 FF 00 00 FF 69 00 FF 00 00 FF 6E 00 FF 00 00 FF 65 00 FF 00 00 FF A1 00 EB 00 00 FF A3 00 D7 00 00 FF 8C 00 FF 5C 00 FF B3 00 EB 63 00 FF AA 00 C3 00 00 FF 8F 00

  • PICを用いた赤外線通信

     PICを使って赤外線通信をしたいんですが、 いくつか教えていただきたいことがあります。 (1)赤外線の通信仕様・方式なについてなんですが、 下記の2つのページを参考にしたんですが、 http://www.picfun.com/appframe.html http://www.sendai-ct.ac.jp/~ckuma/micom/3048/ir.html 1つ目のページには、リーダー部(8bit)、データ部(16bit)、データ部連送(16bit)の40bitを送ると載っています。 しかし、2つ目のページには、リーダー部()、カスタム部、カスタム反転、データ部、データ部反転の順番で送っているようです。 これって、どちらの方式で送っても、受信した際のソフトの書き方で対応しろってことなんでしょうか? それとも、自分が使用する受信モジュールによって、どっちの送信方法で送れっていうのが決まっているのでしょうか? (2)そもそも、38KHzで変調するということがピンとこないんですが、 例えば上の1つ目のページでいうと、送信する40bit分を1/38K=26mSec周期にしろってことなんでしょうか? ちなみに、PIC16f873、赤外線受信モジュールはSPS440-1を使用しています。 初歩的な質問で申し訳ありませんが、よろしくお願いしますm(_ _)m

  • 条件に合ったデータを抜き出す

      A   B   C   D 1 あ   AA   VV   FF 2 い   CC   FF   HH 3 あ   SS   FF   DD 4 う   SS   EE   AA 以上のようなデータが有るときに、別シートに A列のデータを条件に以下のように抜き出したいのです。 別シートの各セルに式が入っていて、上記データを 変更しても別シートの抽出結果が自動で変わるようにしたいです。 ”あ”の抽出   あ   AA   VV   FF   あ   SS   FF   DD ”い”の抽出   い   CC   FF   HH ”う”の抽出   う   SS   EE   AA

  • RS-422Aの通信

    三菱電機のQJ71C24N-R4でチラーとの通信をしたのですが 通信できないで困っています、チラーの通信仕様は、 スタートビット 1、データビット 8 パリテイー なし  ストップビット 1 誤り制御 水平パリテイー です、送信は EOT アドレス 職別子  ENQ    受信は STX 職別子 データ ETX BCC です、三菱電機のQJ71C24N-R4は垂直パリティー ですので、通常のOUTPUTで送信しても、。相手から 何もかえってきません、どうしたらいいのか大変こまっています 通信プロトコルは。無手順でしています 経験のある方、ご教授お願いします