Beispiel #1
0
static void h3600_micro_process_char( unsigned char rxchar )
{
        switch ( g_rxdev.state ) {
        case STATE_SOF:         /* Looking for SOF */
                if ( rxchar == CHAR_SOF )
                        g_rxdev.state=STATE_ID; /* Next byte is the id and len */
		else 
			g_statistics.missing_sof++;
                break;

        case STATE_ID:          /* Looking for id and len byte */
                g_rxdev.id  = ( rxchar & 0xf0 ) >> 4 ;
                g_rxdev.len    = ( rxchar & 0x0f );
                g_rxdev.index  = 0;
                g_rxdev.chksum = rxchar;
                g_rxdev.state  = ( g_rxdev.len > 0 ) ? STATE_DATA : STATE_CHKSUM;
                break;

        case STATE_DATA:        /* Looking for 'len' data bytes */
                g_rxdev.chksum += rxchar;
                g_rxdev.buf[g_rxdev.index]= rxchar;
                if ( ++g_rxdev.index == g_rxdev.len )
                        g_rxdev.state = STATE_CHKSUM;
                break;

        case STATE_CHKSUM:      /* Looking for the checksum */
                if ( rxchar == g_rxdev.chksum )
			h3600_micro_rx_msg( g_rxdev.id, g_rxdev.len, g_rxdev.buf );
		else
                        g_statistics.bad_checksum++;

                g_rxdev.state = STATE_SOF;
                break;
	}
}
Beispiel #2
0
static void h3600_micro_process_char( unsigned char ch )
{
	switch ( rx.state ) {
	case STATE_SOF:	/* Looking for SOF */
		if ( ch == CHAR_SOF )
			rx.state=STATE_ID; /* Next byte is the id and len */
		//else
		//	g_statistics.missing_sof++;
		break;
	case STATE_ID: /* Looking for id and len byte */
		rx.id = ( ch & 0xf0 ) >> 4 ;
		rx.len = ( ch & 0x0f );
		rx.index = 0;
		rx.chksum = ch;
		rx.state = ( rx.len > 0 ) ? STATE_DATA : STATE_CHKSUM;
		break;
	case STATE_DATA: /* Looking for 'len' data bytes */
		rx.chksum += ch;
		rx.buf[rx.index]= ch;
		if ( ++rx.index == rx.len )
			rx.state = STATE_CHKSUM;
		break;
	case STATE_CHKSUM: /* Looking for the checksum */
		if ( ch == rx.chksum )
			h3600_micro_rx_msg( rx.id, rx.len, rx.buf );
		//else
		//	g_statistics.bad_checksum++;
		rx.state = STATE_SOF;
		break;
	}
}