プロジェクト型演習 #2 (raspberrypi emboard RS232C通信)

# 理想の流れ
RS232C を使用し em board (RX63n) と Raspberry Pi を接続する。
ゲーム終了後、em board から曲番号とスコアを送信し、Raspberry Pi で受信する。
Raspberry Pi は受け取ったデータを一度ファイルに書き込む。
その後、Pythonのプログラムを呼び出し、DBへ格納する。
# 実装
## em board側
<details><summary>送信側プログラム</summary><div>

```c:RS232C_em_board.c
#include <machine.h>
#include "iodefine.h"
#include "initBASE.h"

void main(void);

void main(void)
{	
	volatile int cnt = 0;
	volatile unsigned char str;
	volatile char list[8] = {'1', '2', ',', '3', '4', ',', '5', '6'};
	volatile int i;
	volatile int delay = 0;
	
	/* CMTO初期化 */
	SYSTEM.PRCR.WORD = 0xA502;
	MSTP(CMT0) = 0;
	SYSTEM.PRCR.WORD = 0xA500;
	CMT0.CMCR.WORD = 0x00C2;
	CMT0.CMCNT = 1;
	CMT0.CMCOR = 374;
	IR(CMT0, CMI0) = 0;
	CMT.CMSTR0.BIT.STR0 = 1;
	
	/* クロック初期化 */
	initBASE();
	
	/* SCI2 */
	SYSTEM.PRCR.WORD = 0xA502;
	MSTP(SCI2) = 0;
	SYSTEM.PRCR.WORD = 0xA500;
	
	MPC.PWPR.BIT.B0WI = 0;
	MPC.PWPR.BIT.PFSWE = 1;
	MPC.P50PFS.BYTE = 0x0A;
	MPC.P52PFS.BYTE = 0x0A;
	MPC.PWPR.BIT.PFSWE = 0;
	MPC.PWPR.BIT.B0WI = 1;
	
	PORT5.PMR.BIT.B0 = 1;
	PORT5.PMR.BIT.B2 = 1;
	SCI2.SMR.BYTE = 0x00;
	SCI2.BRR = 155;
	
	SCI2.SCR.BYTE = 0x30;
	
	
	while(1){
		while (IR(CMT0, CMI0) == 0) {
			;
		}
		IR(CMT0, CMI0) = 0;
		while (cnt < 10000000) {
			cnt ++;
		}
		cnt = 0;
		//if (SCI2.SSR.BIT.RDRF == 1) {
			//str = SCI2.RDR;
			//SCI2.SSR.BIT.RDRF = 0;
			//SCI2.TDR = str;
		//}
		for (i = 0; i < 8; i++) {
			while (delay < 100000) {
				delay ++;
			}
			delay = 0;
			SCI2.TDR = list[i];
			
		}
		break;
	}
	
}
```

</div></details>

>GitHub : [RS232C_raspberry_pi.c](https://github.com/kawanishi291/proen2021/blob/main/RS232C_em_board.c)

## Rspberry Pi側
<details><summary>受信側プログラム</summary><div>

```c:RS232C_raspberry_pi.c
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <wiringSerial.h>

int main(void){
    int indat, count;
    int fd;
    char buf[17];
    FILE *fp;

    fd = serialOpen("/dev/ttyUSB0", 9600);
    if (fd < 0) {
        printf("serialOpen error!!\n");

        return -1;
    }

    printf("fd = %d\n", fd);
    serialFlush(fd);
    while (1) {
        printf("\n");
        serialPuts(fd, buf);
        delay(10000);
        while (!(count = serialDataAvail(fd)));
        /* 受信開始 */
        fp = fopen("result.txt", "w");
        if (fp == NULL){
                printf("error\n");
                exit(1);
        }
        while (count--) {
            /* 1文字づつ格納 */
            indat = serialGetchar(fd);
            printf("%c", indat);
            fprintf(fp, "%c", indat);
        }
        /* 受信終了 */
        fclose(fp);
    }
    serialClose(fd);

    return 0;
}
```
</div></details>

>GitHub : [RS232C_raspberry_pi.c](https://github.com/kawanishi291/proen2021/blob/main/RS232C_raspberry_pi.c)

## 実行
em board (RX63n) は CS+ で [`RS232C_em_board.c`](https://github.com/kawanishi291/proen2021/blob/main/RS232C_em_board.c) を実行。
Rspberry Pi は [`RS232C_raspberry_pi.c`](https://github.com/kawanishi291/proen2021/blob/main/RS232C_raspberry_pi.c) をコンパイルして実行。
同一ディレクトリ内に以下のresult.txtが生成される。

```txt:result.txt
12,34,56
```

# 今後
- ~~em board (RX63n) 側で仮の結果を格納したchar型配列を作りる。~~
- ~~一文字づつ取り出して送信し、うまく書き出せるか試す。~~
- ファイル生成後、DBへ送信するPythonプログラムを呼び出す。
- データの最後に特殊文字などを送信し、それで判定させる。