シリアル受信の割り込み関数にユーザコード領域があれば...

コード生成はいつも活用させていただいてます。

早速ですが、コード生成でシリアル受信イベントは以下のように生成されます。


/***********************************************************************************************************************
* 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ブロックの下にユーザコード領域(以下例)があれば、受信完了フラグや受信開始フラグを容易に設定できるような気がします。


/* Start user code. Do not edit comment generated here */
if(rx_data == 0x0A) {
     // 受信完了処理
}
/* End user code. Do not edit comment generated here */

 

 

いつもこの受信イベント関数を改造して、特定のコード受信時に受信完了とするようにしています。

ただ、再生成したら改造コードは消えてしまうので、別に定義しておく必要があります。

 

割り込み処理ですのであまり重いコードを書くと不具合になるかもしれませんが、受信コードチェックくらいなら問題はないと思います。
実際今のところ問題は出ていません。

 

他の方は受信完了コールバックをどのように実装されていますか?
ご意見いただければと思います。

もし問題がなければ、コード生成で生成されるコードの受信イベントにユーザ定義領域を追加していただければと思います。

 

 

 

 

Parents
  • おはようございます。
    割込み関数内にコードを追加したいですよね、自分もずっとそう思ってました。
    チョコさんのコードの書き方や、考え方(初期化コード部分だけを使う)を参考にさせて頂いてますが、UARTの他にIICなどのコードも全体的に変更したいことがあり、その場合は別にソースを追加しています(例えばMy_serail.cなど)。

    元のr_cg_serial_user.cは全体を#if 0 で括って無効にしておき、必要なコードはMy_serial.cにベタコピーしてます。
    r_cg_serial_user.cはこんな感じで無効にしてます。
    /***********************************************************************************************************************
    Includes
    ***********************************************************************************************************************/
    #include "r_cg_macrodriver.h"
    #include "r_cg_serial.h"
    /* Start user code for include. Do not edit comment generated here */
    #if 0 // ← ここのコードは一切使ってない
    /* End user code. Do not edit comment generated here */
    #include "r_cg_userdefine.h"
    :
    :
    /* Start user code for adding. Do not edit comment generated here */
    #endif // ← 最下行のユーザーコード領域に#endifを追加
    /* End user code. Do not edit comment generated here */

    でも簡単な処理程度なら、やっぱり”割込み関数内にコードを追加したい”ですよね。
  • Mooさま

    返信ありがとうございます。

    こういうスレッドがなかったのでずれてるかなと思っていましたが、同じように考えている方がいてよかったです。
Reply
  • Mooさま

    返信ありがとうございます。

    こういうスレッドがなかったのでずれてるかなと思っていましたが、同じように考えている方がいてよかったです。
Children
No Data