重複の可能性:
UART ISRTxRxアーキテクチャ
現在、DMAUARTドライバーと並列タスクをサポートするオペレーティングシステムを含むTIマイクロを使用しています。UARTドライバーの機能は次のとおりです。
- static void HalUARTInitDMA(void);
- static void HalUARTOpenDMA(halUARTCfg_t * config);
- static uint16 HalUARTReadDMA(uint8 * buf、uint16 len);
- static uint16 HalUARTWriteDMA(uint8 * buf、uint16 len);
- static void HalUARTPollDMA(void);
- static uint16 HalUARTRxAvailDMA(void);
- static void HalUARTSuspendDMA(void);
- static void HalUARTResumeDMA(void);
キャリッジリターンで終了したメッセージを受け入れ、その後キャリッジリターンでメッセージを応答する別の周辺機器と通信しようとしています。
このタイプの通信ステートマシンを設計するための最良の方法が何であるかを知りたいと思いました。私の問題は、UARTポートのコールバック関数を次のように設計することです...
- 応答を待ってシステムをハングさせません。(ある種のタイムアウト)
- 応答の読み取りが早すぎると、応答が連結されます
- キャリッジリターンはメッセージの終わりを意味します
基本的な理論は次のようなものです。
//send messsage to peripheral
HalUARTWriteDMA("tx\r",4);
//wait a little bit for the device to process the message
//start reading from the peripheral
do {
//how many bytes are at the RX port?
int len = HalUARTRxAvailDMA();
//Read those bytes
HalUARTReadDMA(msg, len);
//append the rx msg to the buffer
strcat(rxbuf, msg)
//does the response contain a CR?
} while(strchr(rxbuf, 0x0D));
このアイデアには明らかな欠陥がいくつかあります。この種のコミュニケーションがどのように行われるかについて、誰かがアイデアを共有してくれることを望んでいましたか?
ありがとう!