@@ -23,105 +23,106 @@ void serial0_setup() {
//PORTD |= (1<<PD1);
/* Enable receiver and transmitter */
UCSR0B |= (1<<RXEN0)|(1<<TXEN0); // Enable rx/tx
/* Set frame format: 8data, 1stop bit */
UCSR0C |= (1 << UCSZ00) | (1 << UCSZ01); // - 1 stop bit
/* Set baud rate */
UBRR0H = (unsigned char)(USART0_BAUD_PRESCALE>>8);
UBRR0L = (unsigned char)USART0_BAUD_PRESCALE;
UCSR0B |= (1 << RXCIE0); // Enable interrupt
//UCSR0A |= (1<<RXC0);
}
/*
uint8_t test = 0;
ISR(USART0__RX_vect)
{
led_on(POWER);
test = UDR0;
}*/
void serial1_setup() {
UBRR1H = (unsigned char)(USART1_BAUD_PRESCALE>>8);
UBRR1L = (unsigned char)USART1_BAUD_PRESCALE;
UCSR1B = (1<<RXEN1)|(1<<TXEN1);
UCSR1C = (3<<UCSZ10); // - 1 stop bit
void serial0_sendChar( unsigned char byte )
while (!(UCSR0A & (1<<UDRE0)));
UDR0 = byte;
void serial1_sendChar( unsigned char byte )
while (!(UCSR1A & (1<<UDRE1)));
UDR1 = byte;
unsigned char serial0_readChar()
while(!(UCSR0A &(1<<RXC0)));
return UDR0;
unsigned char serial1_readChar()
while(!(UCSR1A &(1<<RXC1)));
return UDR1;
void serial0_sendString(const char* stringPtr){
while(*stringPtr != 0x00)
serial0_sendChar(*stringPtr);
stringPtr++;
void serial1_sendString(const char* stringPtr){
serial1_sendChar(*stringPtr);
void serial_sendCommand( char moduleID, char sensorID, char* data )
char checkSum = 0x00; //initialize checksum
serial0_sendChar('['); //bracket indicates start of command
serial0_sendChar(moduleID);
checkSum+=moduleID;
serial0_sendChar(sensorID);
checkSum+=sensorID;
// send data, null-terminated
while(*data != 0x00)
serial0_sendChar(*data);
checkSum += *data;
data++;
serial0_sendChar(checkSum);
serial0_sendChar(']'); //bracket indicates end of command
serial0_sendChar(checkSum); // checksum moved behind bracket to solve bug FS#29
void serial_sendResponseData()
@@ -56,140 +56,155 @@ static void setParserState(uint8_t state
checksumCalc = 0;
// Every time we change state, we have parsed a byte
bufferParsePosition = (bufferParsePosition + 1) % BUFFER_SIZE;
// Receive data on USART
char buffmeh[16];
buffer[bufferDataPosition % BUFFER_SIZE] = UDR0;
bufferDataPosition = (bufferDataPosition + 1) % BUFFER_SIZE;
/*sprintf(buffmeh, "bdp: %d, bpp: %d \r\n", bufferDataPosition, bufferParsePosition);
serial0_sendString((buffmeh)); */
#define DEBUG
// Parse data from circular buffer
int serparser_parse(void)
char byte;
// Process first command (if any) on the circular buffer
while(bufferDataPosition != bufferParsePosition)
byte = buffer[bufferParsePosition];
// Reset
if(parserState == STATE_RESET)
if(byte == '[') // Start of frame; keep parsing
#ifdef DEBUG
serial0_sendString("start ok\r\n");
#endif
setParserState(STATE_GETID);
else // Not start of frame, reset
serial0_sendString("not start\r\n");
setParserState(STATE_RESET);
return PARSERESULT_NODATA; // no valid start bit; better luck next time. run the function the next time around the main loop.
// Get destination module ID
else if(parserState == STATE_GETID)
if(byte == MODULE_ID) // Message intended for this module; keep parsing
serial0_sendString("dest ok\r\n");
checksumCalc += byte;
setParserState(STATE_GETDATATYPE);
else // Transmission is intended for another module; reset
serial0_sendString("bad dest\r\n");
// Get payload type ID
else if(parserState == STATE_GETDATATYPE)
serial0_sendString("type ok\r\n");
receivedDataType = byte; // Store the type of data receiving
setParserState(STATE_GETDATA);
// Get payload data
else if(parserState == STATE_GETDATA)
if (byte == ']') // End of frame
serial0_sendString("eof ok\r\n");
sprintf(buffmeh, "recvd %d bytes data\r\n", dataLength);
serial0_sendString((buffmeh));
if(bufferParsePosition == bufferDataPosition)
// We are at the end of the line. No more data to parse.
return PARSERESULT_PARSEOK;
else
// we could choose to keep parsing now, or parse the next message next loop around (better idea).
// return now so we hit it the next time around
setParserState(STATE_GETCHECKSUM);
// Checksum is now after the close bracket to solve bug FS#29
else // Still receiving data
serial0_sendString("data ok\r\n");
receivedPayload[dataLength] = byte;
dataLength++;
// Data buffer overrun protection
if(dataLength > MAX_PAYLOAD_LEN) {
serial0_sendString("data ovf\r\n");
return PARSERESULT_FAIL;
else {
// Set state. MUST call even though state is maintained to update parse position
return PARSERESULT_STILLPARSING;
else if(STATE_GETCHECKSUM)
// TODO: Compare checksums
if(byte == checksumCalc) {
serial0_sendString("checksum ok\r\n");
serial0_sendString("checksum fail\r\n");
return PARSERESULT_NODATA;
\ No newline at end of file
* Master Firmware: Serial Parser
*
* Wireless Observational Modular Aerial Network
* Ethan Zonca
* Matthew Kanning
* Kyle Ripperger
* Matthew Kroening
*/
#ifndef SERPARSER_H_
#define SERPARSER_H_
enum parseResults
PARSERESULT_FAIL = 0,
PARSERESULT_NODATA,
PARSERESULT_STILLPARSING,
PARSERESULT_PARSEOK,
};
// Parser states
enum parseStates
STATE_RESET = 0,
STATE_GETID,
STATE_GETDATATYPE,
STATE_GETDATA
STATE_GETDATA,
STATE_GETCHECKSUM,
// Prototypes
int serparser_parse(void);
#endif /* SERPARSER_H_ */
Status change: