HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0911
Oppcomgetで可変長の5解決


Opp

リンク

2013/9/11(Wed) 00:11:04|NO.57073

シリアルポートで、加速度センサーからの信号を受け、
X,Y,Z,3つの変数に入れようと思うのですが、

センサーからの信号が可変長で、comgetで受信する文字数指定があり
うまく代入できないのですが、どのように処理したら良いのでしょう?
各値は、最小-180.00〜最大180.00までです。

[センサーからの信号例]
x: -31.11 y: 23.25 z: -67.97
x: -31.53 y: 18.28 z: -59.43
x: -31.58 y: 13.88 z: -50.99
x: -31.77 y: 8.04 z: -59.47
x: -31.37 y: 2.35 z: -68.14
x: -30.43 y: -2.35 z: -82.12
x: -29.22 y: -6.21 z: -92.97
x: -27.83 y: -0.22 z: -114.11
x: -28.06 y: 28.26 z: -112.21
x: -26.20 y: 52.90 z: -105.45
x: -27.95 y: 59.63 z: -98.00
x: -28.88 y: 54.73 z: -91.46
x: -24.68 y: 32.73 z: -88.55
x: -20.53 y: 8.47 z: -88.54
x: -19.28 y: -2.37 z: -91.78
x: -20.30 y: -5.37 z: -98.48
x: -20.11 y: 3.59 z: -110.10
x: -18.78 y: 10.63 z: -103.26
x: -8.28 y: -7.42 z: -84.47
x: -2.24 y: -3.52 z: -75.18



この記事に返信する


暇人

リンク

2013/9/11(Wed) 01:05:32|NO.57076

comget dat,50
とかやれば
>x: -31.11 y: 23.25 z: -67.97
この形で受信されるって事?

comget dat,50 split dat," ",tempx,datx,tempy,daty,tempz,datz
これでdatx、daty、datzに、ばらせるから
double(datx)で実数型にして配列に入れたり出来る



Opp

リンク

2013/9/11(Wed) 02:19:23|NO.57077

暇人さん
>x: -31.11 y: 23.25 z: -67.97
この形で受信されるって事?

その通りです。
モジュール試しました。

問題は、
値が増えると、受信文字数が異なってくるため
comgetのバッファーが変なところで切れ、途中で改行されたりし、
datx,daty,datzに途中で改行が入ったりしてオカシクなってしまうことなのです。

\nで、1回の周期を判別できれば良いのですが、
なにか良い方法はないでしょうか?



暇人

リンク

2013/9/11(Wed) 07:13:33|NO.57078

>値が増えると、受信文字数が異なってくるため
一回で複数行や半端な受信もあるなら

a={" x: -31.11 y: 23.25 z: -67.97 x: -31.53 y: 18.28 z: -59.43 x: -31.58 y: 13.88 z: -50.99 x: -31.77 y: 8.04 z: -59.47 x: -31.37 y: 2.35 z: -68.14 x: -30.43 y: -2.35 z: -82.12 x: -29.22 y: -6.21 z: -92.97 "} sdim notedat notesel notedat //note使用準備 *受信 //comget dat,50 の代わり------------------------------------------------ dat=strmid(a,index,rnd(50)) //aの変数からランダムに文字列を取得 index+strlen(dat) //取り出せたバイト数分次の取り出し位置を進ませる //--------------------------------------------------------------------- notedat+dat //前回の残りに今回の文字列を追加 repeat //改行が無くなるまでループ if instr(notedat,0,"\n")>0 {//改行があれば次の処理 noteget dat,0//notedatの一番上の行を取り出し(改行コード無し) notedel 0//notedatの一番上の行を削除 split dat," ",tempx,datx,tempy,daty,tempz,datz mes datx+" "+daty+" "+datz }else{//改行が無いので一旦抜ける break } loop await 10 goto *受信



Opp

リンク

2013/9/11(Wed) 22:24:54|NO.57092

おおっ。なるほどnoteに一度入れてしまうのですね!
なんとか解決しそうです。
ありがとうございました。



Opp

リンク

2013/9/11(Wed) 22:25:24|NO.57093

解決チェック入れ忘れました。



ONION software Copyright 1997-2023(c) All rights reserved.