コード生成はいつも活用させていただいてます。
早速ですが、コード生成でシリアル受信イベントは以下のように生成されます。
/************************************************************************************************************************ Function Name: r_uart1_interrupt_receive* Description : This function is INTSR1 interrupt service routine.* Arguments : None* Return Value : None***********************************************************************************************************************/static void __near r_uart1_interrupt_receive(void){ volatile uint8_t rx_data; volatile uint8_t err_type; err_type = (uint8_t)(SSR03 & 0x0007U); SIR03 = (uint16_t)err_type; rx_data = RXD1;
if (g_uart1_rx_length > g_uart1_rx_count) { *gp_uart1_rx_address = rx_data; gp_uart1_rx_address++; g_uart1_rx_count++; }}
さらにオプションを付けると、指定サイズ受信したら受信完了コールバックが呼ばれたり、エラーコールバックが呼ばれたりします。
ただ、受信完了コールバックは指定の受信サイズのデータ受信時に呼ばれる仕様となっており、特定のデータを受信したときに呼ばれる仕様とはなっていません。
通信対象によってはSuffix(接尾辞)やPrefix(接頭辞)で判断することも多いかと思います。
上記のifブロックの下にユーザコード領域(以下例)があれば、受信完了フラグや受信開始フラグを容易に設定できるような気がします。
いつもこの受信イベント関数を改造して、特定のコード受信時に受信完了とするようにしています。
ただ、再生成したら改造コードは消えてしまうので、別に定義しておく必要があります。
割り込み処理ですのであまり重いコードを書くと不具合になるかもしれませんが、受信コードチェックくらいなら問題はないと思います。実際今のところ問題は出ていません。
他の方は受信完了コールバックをどのように実装されていますか?ご意見いただければと思います。
もし問題がなければ、コード生成で生成されるコードの受信イベントにユーザ定義領域を追加していただければと思います。