de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 Electroguard
Electroguard
質問

2つのステートマシンを組み合わせる?

私は、このフォーラムの最近のアドバイスから、無駄なプロセッサ時間と変数の使用を減らすために、可能であれば「ステートマシン」ロジックを使用してプロジェクトを再開することで得たいと考えています。

私はNick Gammonsのステートマシンからシリアルポートからの入力を処理するようになっています 'example http://www.gammon.com.au/statemachine を参照してください。これは、可能なすべてのマシン状態(本質的に2次元グリッド)に対して、すべての特殊制御文字 'イベント'の可能な組み合わせをすべて示しています。

私はDOSコマンドラインフォーマットに似た command [parameters] [options] "の形式でシリアル入力を処理するという目標を洗練しました。たとえば、 DIR" c :\ program files "/ w/s ]をクリックします。これは私に大きなBuffer []とHeader []の文字列を必要としないようにし、

したがって、私のイベント制御文字はスペース、カンマ、一重引用符、二重引用符、スラッシュ、カラジーグリターン、そして私の '状態'は NULL、COMMAND、PARAMETER、OPTIONS

OPTIONS状態は、カンマまたはスペースデリミタまたはCarraige Returnがそのオプションを適切に処理し、おそらく認識された変数にその値を保存するまで、テンポラリオプション[]文字列に文字を追加します。

COMMANDとPARAMETERの '状態'は、特殊文字が一重引用符または二重引用符の中に含まれている場合は、対応するコマンド[]とパラメータ[]文字列に文字を追加します(ペア内で使用する場合は引用符を文字列の一部として使用できます)他のタイプのもの)。

したがって、 NoQuotes、SingleQuotesおよびDoubleQuotes にCOMMAND、PARAMETERおよびOPTIONS状態の操作を変更するために必要な第2の状態マシンがあるようです。

これは、私がニューロンを使い果たした場所です。なぜなら、私が見るのは、非常に多くの可能な順列を持つ不可能な複雑な2つの機械状態の3次元グリッドだからです。

しかし、プロセッサーの能力とメモリの可用性が鶏の歯よりも乏しい時代にまでさかのぼるほとんどすべてのコマンドラインユーティリティの中心に位置しているため、これを実装する方法は非常に実用的でなければならないと考えられます。コマンドラインの解析を含め、可能な限り最善のものでなければなりませんでした。

だから誰でも入力からコマンドライン型のフォーマットを得るための実現可能なモデル(機械状態かそうでないか)を提案することができますか?

更新

ああ、私はちょうど私が前に見つけていなかった別の複雑さを見てきました。これは、オプションが必ずしも必ずしも最後ではないということです。オプションがcarraige-return、options状態区切り文字による変更は、オプション状態の変更前の状態に戻らなければなりません(phew、私はそれが意味をなさないことを望みます)。とにかく、2つの答えが既に示唆しているように、このアプローチは複雑すぎるように思われるので、それは描画ボードに戻っていると思います。

1 2016-03-10T10:33:45+00:00 2
 Electroguard
Electroguard
編集された質問 10日 3月 2016 в 2:52
Arduino
serial
programming
jantje
10日 3月 2016 в 2:02
2016-03-10T14:02:51+00:00
さらに
ソース
編集
#56788728

個人的には、Nickがステートマシンでコマンドラインパターン解析を行うようにアドバイスしたとは思わない。彼の例は、コマンドライン入力に基づいて状態マシンを変更することです。
私はいくつかのコマンドラインパーサーを書いており、これを行うためにステートマシンを使用したことはありません。ステートマシンを使用するようアドバイスしません。
簡単な文字列解析がはるかに簡単です。

Edit To answer the remark below:
I would not advice to go byte by byte. I'd advice to go the line by line way. I have written a library to do read line by line and an article on how that one works. http://blog.baeyens.it/#post16
Here a link to the lib https://github.com/jantje/libraries/tree/master/SerialCommunicator.
Here is a parcing code example. It is not so interesting for you as I have it done in a stage by stage way in a very high level way of coding. https://github.com/jantje/libraries/blob/master/SerialBridgeCommunicator/SerialBridgeCommunicator.cpp#L21

Basically the algorithm is=
1 Take the first word;
2 identify the word.
3 If the command is complete ->do it
else Send the rest of the string to a specialized piece of code. (which has the same algorithm)










3
0
caryden
10日 3月 2016 в 2:09
2016-03-10T14:09:50+00:00
さらに
ソース
編集
#56788729

提案: - ステートマシンの階層を1つの大きなフラットな状態マシンに「モーシュ」(技術的な用語です!)しようとしないでください。そういうわけで、狂気がある。例えば、あなたの{NULL、COMMAND、PARAMETER、OPTIONS}の状態マシンを保持しておき、それらの状態のうちの一つで単純な文字列の収集以上のものが必要なところでは、あなたが期待する種類の入力に適したパーサーSMを呼び出してくださいその点 - 数字、引用符付き文字列、オプション指定子など

3
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Roxana Elizabeth CASTILLO Avalos
登録済み 6日前
2
Hideo Nakagawa
登録済み 1週間前
3
Sergiy Tytarenko
登録済み 1週間前
4
shoxrux azadov
登録済み 1週間前
5
Koreets Koreytsev
登録済み 1週間前
© de-vraag :年
ソース
arduino.stackexchange.com
ライセンス cc by-sa 3.0 帰属