• ベストアンサー

PICプログラム:受信データの格納について

こんにちは。 アセンブリ言語でPICをプログラムして試行錯誤している者です。 シリアル通信でデータを受信するなかで、受信データ1バイト毎に変数へ格納したいのですが、データ数があらかじめ規定されていれば変数定義の時点で(例えば)TEMP1,TEMP2...とすれば良いのでしょうが、 受信データの個数が不定の場合、変数をどう定義したら良いか悩んでいます。 予定している受信データ群には、先頭にデータ個数が示されているので、 受信→格納→データ数を格納した変数から1を減じて0になるまでループ といった流れで運用しようと思っています。 アドバイスをよろしくお願いいたします

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

>> 「n番目のデータ」を読み書き > 詳しくお教え頂けないでしょうか。 データ領域の先頭アドレスをx、データ1つのサイズをsとして、x + s*nを計算して (ただしnは0~) そのアドレスをアクセスするだけ… と思ったのですが、PICのアーキテクチャを知らなかったのでちょっと調べてみたら、PICのデータメモリってバンク切り換えとかがあってアクセスが面倒なんですね。 > 出力形式がUnicode(UTF8)である為、S-JISに変換しなければならず UTF-8からShift_JISへの変換は単純な演算では行えず、対応表を参照して変換するのが普通です。メモリの少ないPICだと厳しいかもしれません。

Asterisk_q
質問者

お礼

アドバイスありがとうございます。 >PICのデータメモリ この辺りが未だ完全に理解できていない部分だと痛感しています。 >対応表を参照して変換 その様ですね。 製作例が見当たらない事からも、PICで扱うには荷が重いのかもしれません。 ピン数の多いものを導入するか、H8等のマイコンを使用するか検討しなければならないですね。

その他の回答 (2)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

1番目のデータ、2番目のデータ、…にどうしてもそれぞれ独立した変数なりIDなりを定義したいのですか? 高級言語における配列のように、「n番目のデータ」を読み書きできれば通常の用途では充分だと思うのですが (アセンブラの場合は自分でアドレス計算をする必要がありますけど)。 個々のデータに変数 (またはID) が必要な場合が思いつかなかったので、その使い方をもう少し説明してもらえないでしょうか。

Asterisk_q
質問者

お礼

salsberryさん> いささか自分で理解している範囲に固執して凝り固まっていた事を反省しています。 まずは「そもそも何をしたいか」ですよね。 PICからある機器にコマンドを送信すると、前述の様なフォーマットで戻り値が帰ってきます。 最終的にその戻り値を液晶に表示させたいのですが、出力形式がUnicode(UTF8)である為、 S-JISに変換しなければならず、質問に至った次第です。 文字コード変換については未だ未知数で、どう考えていけば良いか情報収集中なのですが、 とりあえず格納先をはっきりさせておけば、元データを引き出して加工・整形できるかなと考えました。 >「n番目のデータ」を読み書き 仰るとおりで、これが出来れば解決できますね。 詳しくお教え頂けないでしょうか。 よろしくお願いいたします。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

想定されている最大のデータ数、またはPICのメモリ容量が許す範囲で、できるだけ大きな (たとえば1000個分) 領域を予め確保します。1000個の変数を定義する必要はありません。 データを受信して、先頭のデータ個数が1000を超えていたらエラーにする、逆に1000より少ないときは使わないデータ領域は単純に無視、という考えでいいのではないでしょうか?

Asterisk_q
質問者

お礼

salsberryさん> アドバイスありがとうございました。 データ数が多くなりすぎた時の処理について、仰るような処理が良いと思いました。 ですが、今回の質問の本旨は、予め数が分からない=予め予定変数を何個分定義していいか分からないデータに、順にID付け(例えばdata1,data2,...)する方法を知りたい、というものなので、 重ねてアドバイスをお願いいたします。

関連するQ&A

  • picからpicへのデータ送信方法について

    pic16f690間でUSARTを使用して、データのやり取りを行おうとしています。 送信側から1~25の10進数を送信し、受信側で受けとった数値の回数の処理を行おうとしています。 コンパイラはCCS社のものを使用しています。 データ送信側は printf("%2x",送りたいデータ) 受信側は usart受信割り込みで  getc(受信したデータを入れる変数) 上記のようにコードを書いています。 しかし、受信側で正しい数値を受信できていないようです。 ただ単に1又は2桁の数値を受信する場合はどのようにすればいいでしょうか? よろしくお願い致します。

  • pic32mxのデータ幅

    初めてPIC32MXでプログラムを走らせようとしています。 MPLAB X IDEとXC32を使っています。 PIC18F等の8ビットCPUの経験はあります。 PIC32MXはアドレス幅32ビットデータ幅32ビットだと思ってプログラムを作り始めました。 デバックするところになって分からないことが出てきました。 XC32におけるint型のデータ幅は32ビット、unsigned char型は8ビットです。 プログラムで変数を定義するとunsigned char型は偶数アドレス、奇数アドレスそれぞで定義されます。 int型の配列を定義すると、偶数番地アドレスを先頭として4バイト単位で割り当てられます。 これは、PIC32MXがバイトアドレッシングCPUで4バイトアライメントということだと思います。(違ったらご指摘下さい。) 実際MPLAB X IDEでデータメモリを参照すると1アドレス1バイトデータで表示されます。 質問は、 PIC32MXは32ビットアドレス空間(実際に持っているROM、RMAサイズは別として) のCPUではあるが、メモリ幅は、8ビットというのではないだろうか? というものです。PIC32MXの内部レジスタ関連は32ビットなので32ビットCPUだとは思いますが、データシートにある「 32 ビットのネイティブデータ幅」という意味がわかりません。 実際のメモリ空間は、アドレス範囲 x 8ビットということでいいのでしょうか。 御教授いただけましたら幸いです。

  • PICで内部タイマーを使わずカウントダウンする方法

    こんにちは。 今回、PICのプログラムをアセンブラで組むことになりました。 その中で「100ミリ秒間、あるポートからの入力を監視する」という部分があり、 これを内部タイマーなどは使わずに実装するとします。 自分なりには、 PICのクロック数とループ内のサイクル数で 何回ループを回せばよいのかを予め計算しておいて その回数だけループを回せばよいのかな? と考えました。。。 しかしループ内のサイクルがせいぜい数μSですので、 100mSecとなると10万回単位でループを回さなければなりません。 しかしPICでは変数が8Bitしか無いので255までしかカウントできないと思うのですが、 こういう大きい数字のカウントをしたい場合、どうしたら良いのでしょうか? 宜しくお願いします。

  • 次のプログラムの作り方が分かりません…

    整数変数(データ変数)a,b,cを定義し、それぞれ10,20,30を代入しなさい。 次にその変数の格納されているアドレスを表示するプログラム ---------------------------------------------------------- 【ヒント】16進数で打ち出すためには、%xを利用する。課題のように頭に0xを付けるときには、0x%xとすればよい 宜しくお願いします。

  • Mscomm を使用してバイナリでデータを受信したい

    Mscommを使用して、垂れ流しデーターをバイナリで受信(受信データ長さは変化する)するとき、このデーターをどうやって、配列に格納していけば良いのでしょうか? (垂れ流しデータ ⇒ < STX >nnn-nnn・・・・< ETX >< CHK >) また、配列に格納したデーターを文字に置き換えるにはどうすれば良いでしょうか? まず考え方として以下の流れでよいでしょうか? バイナリデータをバリアント型の変数に入れる。(受信する)      ↓ このデータを1バイトごとにバイト型変数の配列に入れていく。      ↓ 格納した配列の中の制御文字を取り除く。( ST、EX )      ↓ 配列に入っているデータを文字に変換する。      ↓ 変換した文字をつなぐ。 受信するデーターが制御文字を含んでいる為、テキストで受信するとおかしな動作をすることがあるので(150バイト程度のデーターを、バッファから変数に移すときに、0.5~2.5秒もかかってしまうし、文字化けも時々起こす。)バイナリで受信してその後文字に変換したいのですが・・・。 宜しくお願い致します。

  • vb.net 2010からPICへのデータ送信

    vb.net2010のシリアルポートコントロールを使用してPICへデータを送り、受信した文字によって,制御を変えようとしています。 先日、こちらで質問させていただき,文字の送信はできるようになり、受信した文字によって制御を変えることができるようになりました。 しかし、文字列(例えば01やABなど)を送信した場合がうまくいきません。 文字列がきちんと受信できていないのかと思い、PCからデータ受信後、PICからPC文字列をそのままリターンすると問題なく受信できているようです。 このような場合、どういったことが原因と考えられるでしょうか? PIC側は受信割り込み内で、以下のようなコードです。      char buf[10]; buf[i]=getc(); if(buf[i] == '\r')//改行を受信するまで、配列に文字を格納 { buf[i]= '\0'; printf(buf);//PCに受信文字列をリターン if (i == 'ABC') { //受信文字列がABCの場合の処理 } else{           //受信文字列がABC以外の場合の処理 } }

  • PIC C Liteを使い加速度センサの値を読む

    始めまして。 最近PICの勉強を始めました。 ADWINのキットを買い、後閑さんの本を読んでいる最中ですが、質門があります。 【Kionix社の加速度センサ「KXP84-2050」を使い、その値を取り込むにはどうすればいいのでしょうか。】 学生時代にC言語を少し触っており簡単な気持ちで始めたら、大変なことになりました。 PC内部だけでプログラムするのとは分けが違い、途方に暮れています。 どうか、皆様のお力をお借りしたいです。 以下、質問の詳細です。 1.X軸の信号値を8個のLEDで8bitデータに見立てて表示しようと考えています。   センサを傾けると、 秋月電子でセンサーのモジュールを買いました。   私の理解では   ・あるポートのレジスタ(ここではRB0とします)をまずは入力ポートにする   ・センサーからの値を代入する   ・その値をLEDに出力する  です。 ここで、センサーの仕様書にはレジスタネーム「XOUT_H」のアドレスは0x00であり、これはMSBで送られてくる。(8bitデータ)I2Cでのデータ送受信時 センサ側のデータをどう受信して、値を格納すればいいのでしょうか? センサ側のアドレスを指定する? などがADWINの入門書ではまったく無いので・・・ PIC側とセンサー側のやり取りが分からず困っています。 シリアルでデータがくるので、8bitデータをもらうのには8回ループをまわして、別に定義した変数にセンサデータを入れればいいのでしょうか? センサーとPICを繋ぐ線は1つですので、シリアルデータの扱い方がわかりません。 PIC側で、 char X_data[8]のような配列を定義し を定義し、 そこに X_data[i]=XOUT_H[i]そして出力でしょうか? 私なりに、ネットも調べたのですが分からずじまいでした。 よろしくお願いします。 乱文申し訳ございません。   

  • このプログラムの作り方を教えてください。

    データを入力し、平均を求めて、更に平均以上と平均未満の個数を求める。ただし0未満の数が入力されると、読み込みは停止し、答えを出力するというプログラムです。 基本的な流れは (1)0未満の数により停止、データの格納 (2)平均値を求める (3)平均以上、未満の個数の計算 (4)結果出力 と思っているのですが、、、

  • インクリメントデータについて

    お世話になります。 for()ループ回数の値をCString へ格納したいです。 以下に検討しましたが、エラーになります。 CString Data; CString pp; for( int i=0; i<100; i++ ){ pp.Format(_T("%s"),i); Data += pp; } 求めたいのは、CString Data変数に for()のint iの回数分を インクリメントデータとして格納したいです。 Data = 0,1,2,3,4,5,・・・・99 のようなデータです。 どうぞよろしくお願い致します。

  • 3つほどプログラムをおしえてください。

    (1)100までの整数をいくつか入力し、10刻みでの個数を表示し、負の数が入力されると整数の入力を終わるプログラムです。各範囲の個数は配列に格納する。 実行結果 65 30 21 95 5 -1 0--- 9 : 1 10--- 19 : 0 20--- 29 : 1 30--- 39 : 1 40--- 49 : 0 50--- 59 : 0 60--- 69 : 1 70--- 79 : 0 80--- 89 : 0 90---100 : 1 (2)数字の文字列を入力し、その文字列に含まれる各数字(文字)'0','1',~'9'の個数を表示するプログラムの作成。 実行結果 1231234567 0: 0 1: 2 2: 2 3: 2 4: 1 5: 1 6: 1 7: 1 8: 0 9: 0 (3) 変数xは、0~1までの0.01刻みの値(101個)を取るとする。このとき、2次関数 f(x)=3x^2+2x+1の値が2.0<f(x)<3.0となるxの値をの個数を求めるプログラムの作成。ただし、xを引数としf(x)の値を返す関数を作成して、それを使用する。 実行結果 number=21 やってるうちにわけがわからなくなってしまいます。どなたかよろしくおねがいします。

専門家に質問してみよう