プロが教える店舗&オフィスのセキュリティ対策術

GPS受信機(geko201)をマイコン(pic18f452)の基板にrs23-2cで接続して、
GPS受信機からのデータを取り、その数値を計算するプログラムをC言語で組んでいます。

処理手順としては
マイコン側のボタンを押すと、
GPS受信機からのデータ(@051125004805N3529538E13638632G005+00041E0000N0000D0000)
を受信してその値の計算をはじめます。

そこで問題があり、

仮想GPSとしてプログラムで任意のタイミングで一件だけマイコンにGPSデータを送った場合
ちゃんと計算してくれるんですが、

本物のGPS受信機は1秒毎にデータを垂れ流し状態で
そこで受信したら、受信待ちで止まってしまいます

改善策がわからないので、どなたか教えてください

受信部分のソース↓
while(1)
{

if(input(PIN_A0)){

gets(mes);
    
    以下略
}


}//roop end

A 回答 (3件)

No.2 です。


気づきませんで遅れました。

まず、スタートビットがうまく検出できないという現象が、

・信号が(マイコンレベルでは)Low となることが検出できていない(スタートビットは、通常、マイコンレベルでは Low になりますから)
・Low は検出できているが、スタートビットの位置がわからない

の2つの場合があります。
パソコンが相手だと、つながるということであれば、Low 自体は検出できていると思われますので、最初の回答で書いたように、Low 信号が検出できたら、信号が終わるくらいの充分長い時間を待ってから、再度 Low を探すことになります。
1回/秒であれば、無信号の時間が充分長いので、この時点まで移動して、次に来る Low をとらえることで、スタートビットは検出できます。

パソコンからならOKということを考えると、
ターミネータは同じか?(パソコンからは、 CR 込みで送ってくるが、GPSはデータだけとか)というのを疑ってみる必要があります。


そして、単純に、VB から、1秒間隔でデータを送ってみると、挙動がよくわかるのではないかと思います。

さらには、get() の中で、「データの終わり」をどう判断しているか、それが正しいかをチェックしてみてください。データを表示する方法があるのであれば、get()を、
「1文字受信したら帰ってくる」
ようにしてデータを表示してみます。
1文字なら受信できるであれば、ターミネータの問題だという可能性が高いですし、1文字も受信できないのであれば、通信条件の間違いの可能性が高くなります。
    • good
    • 0
この回答へのお礼

ありがとうございます、参考にさせていただきます。

お礼日時:2006/02/10 09:06

状況がわからなくなってきました。



受信待ちで止まったら、次の(1秒後の)データが来たときに、そのデータを受信して動くのではないかと思いますが。「止まる」のですか?

1回は正しく表示されるのですか?

スイッチの ON/OFF が正しく認識されているとしたら、


if(input(PIN_A0)){

gets(mes);
    
    以下略
while (! input(PIN_A0));
}

で、スイッチが離されたことを確認してから処理を抜けるというのがあります。

この回答への補足

GPS受信機は電源を入れて衛星を補足してからは
座標データを一秒毎に更新して垂れ流すのです。
マイコンを使うタイミングは
既に両方の電源が入っていて
両方を既にシリアルで接続していて
GPSからは1秒毎にデータが流れてきます

その状態でスイッチを押してPINA0がhighになった

gets(BUFF);で垂れ流し中のデータを拾ってそれを計算する予定なんですが、そのif文に入ったところで処理がとまります。


1回は表示されるという件にかんしては
PCとマイコンを接続した場合なんですが
マイコンが何も受信してない状態で
VBから同じフォーマットのデータを一回だけ送信するとちゃんと
計算してくれるようです。当たり前のはなしですが。

自分の考えでは多分
垂れ流しの状態なので
スタートビットを検出できてなくて
同期が取れなくて、ずっと受信待ちになるのではないかと思うのですが。

もしこの仮説が正しければ
垂れ流しのデータで、上手く同期を取る方法などあれば
アドヴァイスください。

補足日時:2006/01/26 23:06
    • good
    • 0

if (input(PIN_A0)) は、スタートビットを捕まえようとしているのですよね。



安直な方法
  スタートビット(に限らず、信号の部分)を見つけたら、それから、500ms 待ちます。(1回/秒なら、その間に、通信のない部分に到達するから)その後、改めてスタートビットを探します。
この場合、

while(! input(PIN_A0)); // セミコロンはここ
次の処理

としたほうが良いです。スタートビットを確実に補足できますから。

while(! input(PIN_A0));
// 何か信号を見つけた
wait(500ms); // 500ms 末

while(! input(PIN_A0));
// 何か信号を見つけた
// これは、信号無しの部分から見て最初の信号なので、
// スタートビットだと判断できる。

この回答への補足

すいません
説明が不十分でした
if (input(PIN_A0)) は、
picのピンA0にスイッチがつながっていまして
スイッチが押されたら、受信待ちになるような
プログラムになっています。

アドヴァイスおねがいします

補足日時:2006/01/26 12:42
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!