私はこの質問について少し確信が持てませんが、現在の設計で常に問題に遭遇しており、誰かがこれに対する別のアプローチを示すことができれば、本当に素晴らしいことです.
私のプログラムは、rs232 を介して非同期コマンドをデバイスに書き込みますが、受信したデータを常に読み取って反応します。
これはすべてうまく機能しますが、初期化フェーズでは、プログラムを続行させる前に、応答を待つ必要がある一連のコマンドを送信する必要があります。
さて、この部分は単純な C で行う必要があり、思いついたのはグローバル var と while ループを使用することだけでした。しかし、これは本当にきれいではないと思います。
これを疑似コードの例として取り上げます。
OnReceive(data){
switch determineCommand(data)
case CMD1:
config.value1 = data.value1
case CMD2:
config.value2 = data.value2
default:
print data
}
DoCommandChain(){
Send(CMD1)
If("Send(CMD1)" got its response){
Send(CMD2)
}
}
さて、問題は「XYが応答を受け取った場合」です-これを検出するためにいくつかの変数を使用したくないため、これは単なる指標であるため、Send(CMD1)の戻り値に依存できないためです。 CMD1 が送信されました - 受信された対応するものはありませんでした。
この混乱を良い方法で解決するために、何を検索/読むことができるか知りたいので、ここで質問しています。
今のところ、これに対する私の最善の考えは、特定の応答が受信された場合に監視するタイマー保護機能を何らかの方法でセットアップすることです。次に、この応答のステータスに応じて、次の応答に進むSend
か、最後の応答を再試行します。
このような:
Instead of `Send(CMD1)` -> `DoUntilResponse(Send(CMD1),Timeout,NumberOfRetries)`
DoUntilResponse(function,Timeout,NumberOfRetries){
registerExpectedResponse(CMD1, gotResponse) //awaiting some response for CMD1
for(i=0 ; i!=Numberofretries; i++){
if (Send(CMD1) == successfulSend ){
while(not timeout){
if gotResponse then break;
}
if gotResponse then break;
}
}
}
編集:
明確にするために:シリアル接続や関数の起動方法について心配していませんOnReceive
-これはすべてすでに機能しています。明確なアイデアが得られないのは、ポーリングを使用せずに、できれば純粋な C で上記の擬似コードを解決する方法です。