Skip to content

Instantly share code, notes, and snippets.

@AdenoBluesky
Created April 19, 2015 07:08
Show Gist options
  • Save AdenoBluesky/926bf03ce349862beb90 to your computer and use it in GitHub Desktop.
Save AdenoBluesky/926bf03ce349862beb90 to your computer and use it in GitHub Desktop.
チェックサムの追加
#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){
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;
}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");
}
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment