お世話になっております。現在、PCとRX621間でBluetoothを用いたシリアル通信を行っています。
今、PC側に保存された5つのエクセルデータ(~.csv //1秒ごとに値が更新されます。)
をTeraTermを用いてRX621に送信し、callbackでPC側に表示させることができました。(PC側のTeraterm上には -0.0611,0.0109,0.048,0.1388,0.3029と表示されていることから、シリアル通信はできていると思っています。)
次に、RX621が受信した上記のデータをカンマごとに区切り、A,B,C,D,Eのそれぞれに分けて計算をしたいと思っていますが、受信したデータを分割して配列するために、どのようなコードを記述すればよいか分かりません。ご教授お願いいたします。
念のために、以下にシリアル通信のプログラムを貼ります。RX621が受信したデータは "ch"に入れています。
unsigned char sci_recv(void){ unsigned char ch;
#ifdef USE_IR while (IR(SCI1,RXI1) == 0) ;#else while (SCI1.SSR.BIT.RDRF == 0) ;#endif
ch =SCI1.RDR;
#ifdef USE_IR IR(SCI1,RXI1) = 0;#endif return ch;}
void sci_send(unsigned char ch){#ifdef USE_IR while (IR(SCI1,TXI1) == 0) ; IR(SCI1,TXI1) = 0;#else while (SCI1.SSR.BIT.TDRE == 0) ;#endif
SCI1.TDR = ch;}
> 配列のサイズの指定は定数じゃないとダメってことですね。
C89 とそれ以前では配列定義時の要素数は定数式である必要がありましたが C99 では可変長配列が仕様として採用され変数での指定が可能になりました。現在市販されている C 言語入門の書籍の多くは C99 かそれ以降の仕様で書かれていると思います。
RX の純正コンパイラである CC-RX の最新の版 V2.06.00 ではコンパイルオプション `-lang=c' か `-lang=c99' で C89 と C99 を選択できますが、C99 を選んでも可変長配列はなんでか
E0520028:Expression must have a constant value
エラーとなるようです。
自己レス
> C99 を選んでも可変長配列はなんでかエラーとなるようです。
https://www.renesas.com/ja-jp/products/software-tools/tools/compiler-assembler/compiler-package-for-rx-family.html
> 特 長 > ANSI規格準拠 > C89、C99(可変長配列を除く)、C++言語をサポート
仕様の模様。
> C99の可変長配列ってのはAUTO変数限定ですわな
前提としてそういう話をしてますよ。
http://japan.renesasrulz.com/cafe_rene/f/forum5/4361/rx621-csv/22828#22828
const int CsvDataSize = 100; // CSV データの最大文字数を 100と仮定 char csvData[CsvDataSize + 1]; int i; for (i = 0; i < CsvDataSize;) {
MISRA-C のルールに可変長配列の使用禁止があり、言語仕様としてそれを採用している気がします。
https://www.google.co.jp/search?q=MISRA-C+%22variable-length+array+types%22