0

私は 0.5 秒ごとに 1 行の GPS データをシリアル ラインに吐き出す arduino を持っています。これは、arduino IDE でシリアル モニターを見ることができ、0.5 秒ごとに新しい 1 行のデータが表示されるため、動作することがわかっています。

私は現在、Swift を使用して、シリアル ポート経由で入ってくる各座標をマップに配置し、ORSSerialPort ライブラリを使用して arduino に接続し、そのデータを受信する Mac プログラムを作成中です。これは正常に機能し、以前は基本的なバージョンが機能していましたが、GPS データにギャップがあることに気付きました (それらはマップ上に小さなグループで表示され、一定の線であるはずなのにその間に顕著なスペースがありました)。 .

マップを作成する前に、各 GPS データ行が追加されるテキスト フィールドがあり、arduino IDE シリアル モニターとまったく同じ出力が生成されたので、すべて正常に動作していると思いました。

マップの問題を修正するために、マップ コードを削除しprint()、シリアル ポート経由で入力された XCode IDE に各行を単純に編集しました。驚いたことに、データにランダムな改行があり、その理由がわかりません。これが私が抱えている問題を引き起こしている可能性があると感じているので(個々の値を抽出できるようにコンマごとに文字列を分割することで)、arduino IDEとテキストフィールドでなぜそれが1行として出力されるのか知りたい.しかし、XCode IDE ではなく、おそらく文字列を操作している場合はいつでもそうです。

編集: XCode IDE への印刷とテキスト フィールドへの出力の前に 5 つのプラス記号を付け、それらの末尾に 5 つのダッシュを付けてから、1 つのレポート (1 行のデータである必要があります) を送信した後にシリアル ポートを閉じるように設定しました。私が得た両方の出力は、最終的に 3 行になり、それぞれにプラスとダッシュが接頭辞と接尾辞として付けられました。以下の写真を参照してください。これは、1 行であるべきことを示しています。

データの 1 行が複数の行にまたがり、個々の変数のように動作するのはなぜですか (行の最後の文字を取得すると、セミコロンではなく、3 つの行の最初の行の最後の文字が返されるように)。

4

1 に答える 1

0

この問題は、余分な改行が挿入されている可能性は低いです。むしろ、ORSSerialPort (それが使用する基礎となる POSIX API のように) は、データが入ってくると、そのデリゲートにデータを報告するだけです。特定のユース ケースで完全な行のみが必要であることを知る方法はありません。

着信データをバッファリングし、完全な「ライン」/パケットを受信したときにのみ処理する必要があります。ORSSerialPort には、ORSSerialPacketDescriptorこれを簡単にする API が含まれています。その API の詳細なドキュメントがここにあります: https://github.com/armadsen/ORSSerialPort/wiki/Packet-Parsing-API

この API は (まだ) 終了区切り文字のみの使用をサポートしていないことに注意してください。解析ルーチンは「遅延」であるため、パケット全体を最初から最後まで検証する必要があります。つまり、パケットの末尾から開始して、可能な限り最小の一致を見つけようとします。

于 2016-10-24T20:21:36.350 に答える