GPS受信機(geko201)をマイコン(pic18f452)の基板にrs23-2cで接続して、
GPS受信機からのデータを取り、その数値を計算するプログラムをC言語で組んでいます。
処理手順としては
マイコン側のボタンを押すと、
GPS受信機からのデータ(@051125004805N3529538E13638632G005+00041E0000N0000D0000)
を受信してその値の計算をはじめます。
そこで問題があり、
仮想GPSとしてプログラムで任意のタイミングで一件だけマイコンにGPSデータを送った場合
ちゃんと計算してくれるんですが、
本物のGPS受信機は1秒毎にデータを垂れ流し状態で
そこで受信したら、受信待ちで止まってしまいます
改善策がわからないので、どなたか教えてください
受信部分のソース↓
while(1)
{
if(input(PIN_A0)){
gets(mes);
以下略
}
}//roop end
No.3ベストアンサー
- 回答日時:
No.2 です。
気づきませんで遅れました。
まず、スタートビットがうまく検出できないという現象が、
・信号が(マイコンレベルでは)Low となることが検出できていない(スタートビットは、通常、マイコンレベルでは Low になりますから)
・Low は検出できているが、スタートビットの位置がわからない
の2つの場合があります。
パソコンが相手だと、つながるということであれば、Low 自体は検出できていると思われますので、最初の回答で書いたように、Low 信号が検出できたら、信号が終わるくらいの充分長い時間を待ってから、再度 Low を探すことになります。
1回/秒であれば、無信号の時間が充分長いので、この時点まで移動して、次に来る Low をとらえることで、スタートビットは検出できます。
パソコンからならOKということを考えると、
ターミネータは同じか?(パソコンからは、 CR 込みで送ってくるが、GPSはデータだけとか)というのを疑ってみる必要があります。
そして、単純に、VB から、1秒間隔でデータを送ってみると、挙動がよくわかるのではないかと思います。
さらには、get() の中で、「データの終わり」をどう判断しているか、それが正しいかをチェックしてみてください。データを表示する方法があるのであれば、get()を、
「1文字受信したら帰ってくる」
ようにしてデータを表示してみます。
1文字なら受信できるであれば、ターミネータの問題だという可能性が高いですし、1文字も受信できないのであれば、通信条件の間違いの可能性が高くなります。
No.2
- 回答日時:
状況がわからなくなってきました。
受信待ちで止まったら、次の(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から同じフォーマットのデータを一回だけ送信するとちゃんと
計算してくれるようです。当たり前のはなしですが。
自分の考えでは多分
垂れ流しの状態なので
スタートビットを検出できてなくて
同期が取れなくて、ずっと受信待ちになるのではないかと思うのですが。
もしこの仮説が正しければ
垂れ流しのデータで、上手く同期を取る方法などあれば
アドヴァイスください。
No.1
- 回答日時:
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にスイッチがつながっていまして
スイッチが押されたら、受信待ちになるような
プログラムになっています。
アドヴァイスおねがいします
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- iPad IPAD mini6 GPSモデルは通信契約がないと機能しないもの? 5 2022/06/26 17:53
- iPhone(アイフォーン) 皆さんiPhoneは、機能が少な過ぎますか?? iPhoneには、なぜ僕がAndroid合計3台持ち 2 2022/07/12 19:59
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- その他(自然科学) この2つはどこが間違いでしょうか? 2. 植物の葉に含まれるクロロフィルは可視赤色域の波長帯を強く吸 2 2022/05/17 16:55
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- Android(アンドロイド) iPhoneには、なぜ僕が合計3台持ちしているGalaxy A22やXperiaXZ1、arrows 4 2022/07/12 18:42
- その他(スマートフォン・携帯電話・VR) Applewatchについて質問です。 自分はiPhone+AirPodsproを使用していますが、 4 2022/09/25 00:24
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- 扇風機・冷風機・サーキュレーター 扇風機の回路について、AC100Vをトランスを使わず、マイコンを駆動させることはよくありますか? 4 2022/08/11 04:25
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PLCとPCの通信
-
マイクロ秒で精度が出るタイマー
-
レジスタマップって何ですか?
-
フラッシュメモリへの書き込み
-
マイコンのことで質問がありま...
-
Macターミナルで実行中のプログ...
-
バックグラウンドのプロセスの...
-
プログラミング ソースコード
-
C言語で、メモリを解放しないで...
-
緯度、経度の 10進法と 60進法...
-
TCP/IP通信時のサーバーからの受信
-
Excelでのセル内容の高速消去方法
-
C# シリアル通信でデータ受信...
-
explorer.exeが異様にメモリを食う
-
VBSの処理中一旦処理を止めて再...
-
Process.Startの戻り値を後で取得
-
メッセージボックスのボタン名変更
-
VBAの配列サイズとメモリに関して
-
VB6 コマンドボタン クリック...
-
Winsockで接続待ちタイムアウト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PLCとPCの通信
-
レジスタマップって何ですか?
-
シリアル通信でのデータ取りこぼし
-
マイコンからSDカード内のテキ...
-
フラッシュメモリへの書き込み
-
組み込みマイコンでのソフトウ...
-
TCNTとTIFRの意味
-
PICマイコンのCLRWDT動作について
-
SH7144でパルス幅を測定したい。
-
Octal D-type transparent latc...
-
マイクロ秒で精度が出るタイマー
-
2つのアナログ信号が一致して...
-
マイコンのCプログラミングで未...
-
PIC12F683でLEDをスイッチで点...
-
機械語のレジスタペアについて
-
ArduinoとXBeeを用いたRSSIの取...
-
PCからシリアル通信で外部ハー...
-
A/D変換について
-
アセンブラプログラム
-
ビット演算を学びたい
おすすめ情報