目的
前回、受信機能を追加したが、1Byteのみだった。今回は、複数Byteの受信を拡張した。
結果
前回同様に1秒毎に顔文字「Adeno(^o^)mm-ss」※mm-ssは分-秒を送信し続けると、400回のコマンド送信に対して、送信NGは52回 13%くらい
なんか前よりも増えた気がする…。
受信の方は、PICから「Hello!!」を送信。100回中NGは5回 5%くらいか
こっちはこんなもんか??
これで、双方向の複数バイトデータを扱えるようになった。
ようやくここまで来た。
ラズベリーパイでも良いのだけれど、ちょっと高い。
このFONならば、中古だけど、ACアダプタと本体で 500円〜なので、
心置きなく遊び倒せる。
何をやったか
電文
変更点
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include "rcv_lib.h" | |
#include "lcd_lib.h" | |
volatile unsigned char rcv_state = 0; | |
volatile unsigned char rcv_poi = 0; | |
volatile unsigned char rcv_cmd = ' '; | |
volatile unsigned char rcv_buf[RCV_SIZE]; | |
volatile unsigned char rcv_timeoutflg = 0; | |
volatile unsigned char rcv_timeout = 0; | |
volatile unsigned char rcv_full = 0; | |
volatile unsigned char rcv_chksum = 0; | |
volatile unsigned char rcv_chksum_base = 0; | |
volatile unsigned char rcv_drv_state = 0; | |
void rcv_init(){ | |
//受信バッファの準備 | |
for(rcv_poi = 0; rcv_poi < RCV_SIZE; rcv_poi++){ | |
rcv_buf[rcv_poi] = ' '; | |
} | |
//drv | |
rcv_drv_state = RCV_DRV_STATE_S0_STXWAIT; | |
rcv_chksum = 0; | |
rcv_chksum_base = 0; | |
//app | |
rcv_full = 0; | |
rcv_state = RCV_STATE_S1_CMDWAIT; | |
rcv_cmd = ' '; | |
} | |
char read_byte(int i){ return rcv_buf[i]; } | |
void clearRCVflg(){ rcv_full = 0; } | |
char getRCVflg(){ return rcv_full; } | |
unsigned char getRCVcmd(){ return rcv_cmd; } | |
void rcv_byte(unsigned char c){ | |
if(rcv_full == 1){ | |
printf("BufFull>%c\r\n",c); | |
}else if(rcv_drv_state == RCV_DRV_STATE_S0_STXWAIT){ | |
if(c == rSTX){ | |
//printf("STX\r\n"); | |
rcv_cmd = ' '; | |
rcv_state = RCV_STATE_S1_CMDWAIT; | |
rcv_drv_state = RCV_DRV_STATE_S1_CHKSUMWAIT; | |
} | |
}else if(rcv_drv_state == RCV_DRV_STATE_S1_CHKSUMWAIT){ | |
rcv_chksum = 0; | |
rcv_chksum_base = c & 0x0f; | |
rcv_drv_state = RCV_DRV_STATE_S2_ETXWAIT; | |
//printf("Sum=%d\r\n",rcv_chksum_base); | |
}else if(rcv_drv_state == RCV_DRV_STATE_S2_ETXWAIT){ | |
if(c == rETX){ | |
rcv_chksum = rcv_chksum & 0xf; | |
if(rcv_chksum_base == rcv_chksum){ | |
rcv_buf[rcv_poi] = '\n'; | |
printf("ChkSumOK:%d\r\n",rcv_chksum); | |
rcv_full = 1; | |
}else{ | |
rcv_state = RCV_STATE_S1_CMDWAIT; | |
printf("ChkSumNG:%d:%d\r\n",rcv_chksum_base,rcv_chksum); | |
rcv_full = 2; | |
} | |
rcv_drv_state = RCV_DRV_STATE_S0_STXWAIT; | |
}else{ | |
rcv_chksum+= c; | |
if(rcv_state == RCV_STATE_S1_CMDWAIT){ | |
if(c == 'C'){ | |
rcv_state = RCV_STATE_S2_CMDWAIT2; | |
}else if(c == 'N'){ | |
rcv_poi = 0; | |
rcv_state = RCV_STATE_S3_DATAWAIT; | |
} | |
}else if(rcv_state == RCV_STATE_S2_CMDWAIT2){ | |
//コマンドを一時保存 | |
rcv_cmd = c; | |
rcv_state = RCV_STATE_S1_CMDWAIT; | |
}else if(rcv_state == RCV_STATE_S3_DATAWAIT){ | |
if(c == '\r'){ | |
}else{ | |
rcv_buf[rcv_poi] = c; | |
rcv_poi++; | |
//終了条件2:バッファがいっぱい | |
if(rcv_poi >= RCV_SIZE){ | |
rcv_poi = 0; | |
rcv_state = RCV_STATE_S1_CMDWAIT; | |
printf("End2\r\n"); | |
} | |
} | |
} | |
//printf("RCV>%c\r\n",c); | |
} | |
} | |
} |
0 件のコメント:
コメントを投稿