回答編集履歴

3

情報補足

2023/09/08 07:27

投稿

thkana
thkana

スコア7681

test CHANGED
@@ -21,7 +21,7 @@
21
21
 
22
22
  ---
23
23
  結局気になってコードを書いてみちゃったので。もちろん、あくまでサンプルなので、あなたの用途でいろいろ不具合があるかも知れません。
24
- 扱いやすさの関係で開始コードは0x30, 終端コードは0X39。なんかスマートコンフィグレータが拗ねたのでSCIは8。
24
+ 扱いやすさの関係で開始コードは0x30, 終端コードは0X39。なんかスマートコンフィグレータが拗ねたのでSCIは8。大勢に影響ないとは思うけど、マイコンはRX671。
25
25
  ```C
26
26
  volatile int rcvd = 0;
27
27
  #define START 0x30

2

サンプルコード追加

2023/09/08 07:24

投稿

thkana
thkana

スコア7681

test CHANGED
@@ -19,3 +19,53 @@
19
19
  ということのようです。
20
20
  なので、受信処理の状態遷移をr_Config_SCIF9_callback_receiveend()に書いておいて、R_Config_SCIF9_Serial_Receive()を呼び出し、空のループで(割り込み中で)必要データが溜まるのを待つ、というようなことになりそうな気がします。
21
21
 
22
+ ---
23
+ 結局気になってコードを書いてみちゃったので。もちろん、あくまでサンプルなので、あなたの用途でいろいろ不具合があるかも知れません。
24
+ 扱いやすさの関係で開始コードは0x30, 終端コードは0X39。なんかスマートコンフィグレータが拗ねたのでSCIは8。
25
+ ```C
26
+ volatile int rcvd = 0;
27
+ #define START 0x30
28
+ #define END 0x39
29
+ int rcvFrame(uint8_t buf[]) {
30
+ uint16_t num;
31
+ // スタートマーク待ち
32
+ buf[0] = 0;
33
+ do {
34
+ num = 1;
35
+ rcvd = 0;
36
+ R_Config_SCI8_Serial_Receive(buf, num);
37
+ while (!rcvd)
38
+ ;
39
+ } while (buf[0] != START);
40
+ // データサイズ取得
41
+ num = 1;
42
+ rcvd = 0;
43
+ R_Config_SCI8_Serial_Receive(buf, num);
44
+ while (!rcvd)
45
+ ;
46
+ // データ本体+終了マーク待ち
47
+ num = buf[0] + 1;
48
+ rcvd = 0;
49
+ R_Config_SCI8_Serial_Receive(buf, num);
50
+ while (!rcvd)
51
+ ;
52
+ return buf[num-1] == END;
53
+ }
54
+ void main(void) {
55
+ uint8_t buf[256];
56
+ R_Config_SCI8_Create();
57
+ R_Config_SCI8_Start();
58
+ while (1) {
59
+ int rc= rcvFrame(buf);
60
+ buf[255] = 0; //ブレークかける為の無意味な処理
61
+ }
62
+ }
63
+ ```
64
+ ```C
65
+ static void r_Config_SCI8_callback_receiveend(void)
66
+ {
67
+ /* Start user code for r_Config_SCI8_callback_receiveend. Do not edit comment generated here */
68
+ rcvd=1;
69
+ /* End user code. Do not edit comment generated here */
70
+ }
71
+ ```

1

追記

2023/09/07 12:15

投稿

thkana
thkana

スコア7681

test CHANGED
@@ -10,3 +10,12 @@
10
10
  4. EFでなかったならフレームは受信失敗なので捨てて1.からやり直し
11
11
 
12
12
  ということになるかと思います。
13
+
14
+ ---
15
+ 受信関数の使い方、という話であれば、私の前回の回答も結構間違ってて(といいながら今回のを実験してみたわけでもない。RXのボードは手元にあるけれど...)
16
+ ・要求した文字数を受信した時に呼ばれるコールバック処理を`r_Config_SCIF9_callback_receiveend(void)`の二行のコメントの間に記述しておく
17
+ ・要求する受信文字数と、その文字数を格納するバッファを引数に`R_Config_SCIF9_Serial_Receive(uint8_t * const rx_buf, uint16_t rx_num)`を呼ぶ。
18
+ ・指定文字数を受信し終わると、割り込みで先の`r_Config_SCIF9_callback_receiveend(void)`が呼び出される
19
+ ということのようです。
20
+ なので、受信処理の状態遷移をr_Config_SCIF9_callback_receiveend()に書いておいて、R_Config_SCIF9_Serial_Receive()を呼び出し、空のループで(割り込み中で)必要データが溜まるのを待つ、というようなことになりそうな気がします。
21
+