Main Page | Data Structures | File List | Data Fields | Globals

AVRGSM_FILES/AVRGSM_com.c

Go to the documentation of this file.
00001 // This file has been prepared for Doxygen automatic documentation generation. 00022 //Used for SPLINT 00023 #ifdef S_SPLINT_S 00024 #include"splint.h" 00025 #endif 00026 00027 00028 //Includes 00029 #include<ioavr.h> 00030 #include<inavr.h> 00031 #include"AVRGSM_com.h" 00032 00034 int rx_overflow, rx_ack; 00035 00037 static unsigned char rx_buffer[RX_BUFFER_SIZE]; 00038 00040 static unsigned char searchStr; 00041 00043 static int rx_i; 00044 00046 static int rx_wr_i; 00047 00049 const unsigned char __flash OK[] = "OK\r\n"; 00050 const unsigned char __flash CMTI[] = "+CMTI: "; 00051 const unsigned char __flash READY[] = "> "; 00052 const unsigned char __flash CR_LF[] = "\r\n"; 00053 const unsigned char __flash *searchFor; 00054 const unsigned char __flash *searchStrings[4] = {OK, CMTI, READY, CR_LF}; 00055 00056 00066 void COM_init( unsigned int baudrate ) 00067 { 00068 00069 UBRR0H = (unsigned char) (baudrate>>8); //Setting baudrate 00070 UBRR0L = (unsigned char) baudrate; //Setting baudrate 00071 00072 UCSR0B = ( 1 << RXEN0 ) | ( 1 << TXEN0 ); //Enable receiver and transmitter 00073 UCSR0C = ( 1 << USBS0 ) | ( 1 << UCSZ01 ) | ( 1 << UCSZ00 ); //8N1...see Datasheet for more information 00074 00075 COM_rx_reset(); //Reset buffers etc. 00076 } 00077 00078 00085 void COM_rx_reset( void ) 00086 { 00087 00088 UCSR0B &= ~(1<<RXCIE0); // Disable RX interrupt 00089 rx_i = rx_wr_i = 0; //Init variables 00090 rx_overflow = rx_ack = 0; //Zero overflow flag 00091 rx_buffer[ rx_wr_i ] = '\0'; //Buffer init. 00092 } 00093 00094 00101 void COM_rx_on( void ) 00102 { 00103 00104 UCSR0B |= ( 1 << RXCIE0 ); // Enable RX interrupt 00105 } 00106 00107 00114 void COM_rx_off( void ) 00115 { 00116 00117 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt 00118 } 00119 00120 00127 void COM_setSearchString( unsigned char Response ) 00128 { 00129 00130 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt 00131 searchFor = searchStrings[Response]; //Set desired search dtring 00132 searchStr = Response; //Used in rx_isr 00133 rx_i = 0; 00134 } 00135 00136 00142 #pragma vector=USART0_RXC_vect 00143 __interrupt void USART0_RX_interrupt( void ) 00144 { 00145 00146 unsigned char data; //Local variable 00147 00148 data = UDR0; //Always read something 00149 00150 rx_buffer[ rx_wr_i++ ] = data; //Store new data 00151 00152 00153 if( rx_wr_i > RX_BUFFER_MASK ) //Check for overflow 00154 { 00155 rx_wr_i = 0; //Reset write index 00156 rx_overflow = 1; //Set flag high 00157 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt 00158 } 00159 00160 if( searchFor[rx_i] == data ) //Test response match 00161 { 00162 rx_i++; 00163 00164 if( !searchFor[rx_i] ) //End of new_message string...received new message! 00165 { 00166 rx_i = 0; 00167 00168 if( searchStr == CMTI_ ) //+CMTI: 00169 { 00170 searchFor = searchStrings[ CRLF_ ]; //Wait for 00171 searchStr = CRLF_; 00172 } 00173 00174 else //Normal acknowledgement 00175 { 00176 rx_ack = 1; //Set new message flag 00177 UCSR0B &= ~( 1 << RXCIE0 ); // Disable RX interrupt 00178 } 00179 } 00180 } 00181 00182 else 00183 { 00184 rx_i = 0; //Not valid search pattern...start again. 00185 } 00186 } 00187 00188 00198 int COM_putchar( unsigned char data ) 00199 { 00200 00201 //Local variables 00202 unsigned int i; 00203 00204 for( i = 0; !( UCSR0A & ( 1 << UDRE0 ) ); i++ ) // Wait for empty transmit buffer 00205 { 00206 if( i > RX_WAIT ) //How long one should wait 00207 { 00208 return -1; //Give feedback to function caller 00209 } 00210 } 00211 00212 UDR0 = data; // Start transmittion 00213 00214 return (int)data; //Cast and return int value 00215 } 00216 00217 00224 void COM_put_integer( int i ) 00225 { 00226 00228 int ii; 00229 unsigned char int_buf[5]; 00230 00231 if (i < 0) //Integer is negative 00232 { 00233 i = -i; //Convert to positive Integer 00234 COM_putchar('-'); //Print - sign 00235 } 00236 00237 for (ii=0; ii < 5; ) //Convert Integer to char array 00238 { 00239 int_buf[ii++] = '0'+ i % 10; //Find carry using modulo operation 00240 i = i / 10; //Move towards MSB 00241 } 00242 do{ ii--; }while( (int_buf[ii] == '0') && (ii != 0) ); //Remove leading 0's 00243 do{ COM_putchar( int_buf[ii--] ); }while (ii >= 0); //Print int->char array convertion 00244 00245 } 00246 00247 00254 void COM_puts(unsigned char *str) 00255 { 00256 00257 for( ;*str != '\0'; ) 00258 { 00259 COM_putchar( *str++ ); 00260 } 00261 } 00262 00263 00270 void COM_putsf( const unsigned char __flash *fstr ) 00271 { 00272 00273 for( ;*fstr != '\0'; ) 00274 { 00275 COM_putchar( *fstr++ ); 00276 } 00277 } 00278 00279 00289 int COM_trim( void ) 00290 { 00291 00293 int i; 00294 unsigned char temp; 00295 00296 for( i = rx_wr_i - 1; i >= 0; i--) //Run through COM_in[] backwards 00297 { 00298 temp = rx_buffer[i]; //rx_buff[i] into temp 00299 if( ( temp != '\r' ) && ( temp != '\n' ) && ( temp != 'O' ) && ( temp != 'K' ) ) //If not equal to 'O', 'K', '\r' or '\n', break 00300 { 00301 break; //Do break 00302 } 00303 } 00304 00305 rx_buffer[ i+1 ] = '\0'; //Terminate trimmed string 00306 00307 return i; //Return new length 00308 } 00309 00310 00317 unsigned char* COM_gets( void ) 00318 { 00319 return rx_buffer; 00320 }

Generated on Tue Nov 1 16:21:39 2005 for AVR323 Interfacing GSM modems by doxygen 1.3.7