The Receiver project:
/********************************************* Datum : 03.07.2005 Author : H. Brachschoss AVR : ATmega32 Receiver *********************************************/
#include <mega32.h> #include <delay.h> #include <math.h> #include <sleep.h> #include <stdio.h> #include <string.h> #include <sleep.h>
// Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 #endasm #include <lcd.h> #define xtal 16000000L // Declare your global variables here #define A0 55 #define A1 110 #define A2 220 // in Hz #define B2 233 #define H2 247 #define C2 262 #define CIS2 277 #define D2 294 #define DIS2 311 #define E2 330 #define F2 349 #define FIS2 370 #define G2 392 #define GIS2 415
#define A3 440 #define B3 466 #define H3 494 #define C3 523 #define CIS3 554 #define D3 587 #define DIS3 622 #define E3 659 #define F3 698 #define FIS3 740 #define G3 784 #define GIS3 830
#define T12000 // Tonlänge (ms) #define T21000 #define T4 500 #define T8 250 #define T16 125
#define T10 0// keine Pause (ms) #define T11 5 #define T12 10 #define T13 20 #define T14 30 #define T15 40 #define P1 50
#define TERMINAL 0x01// Masterterminal #define STX0x02 #define ETX0x03 #define SYN0x16 #define DC10x11// Decive Control 1 für Bewegungsmelder #define DC20x12// Device Control 2 #define DC30x13 // Device Control 3
char adc0[10] ; unsigned int d_adc0=0 ;// Beleuchtung unsigned int d_adc1=0 ;// Feldstärke unsigned int d_adc2=0 ; // Batterie unsigned int light=0 ; char strText[15] [17] ; unsigned int sleepcnt=0 ; char strRecBuff[17] ; unsigned int isrflag=0 ; typedef unsigned char byte ; unsigned int lighton=0 ; unsigned int terminalkennung=0 ; unsigned char srbcklight=1 ; unsigned char srsoundon=1 ; unsigned int wdtcnt=0 ; unsigned int displayoff=0 ; unsigned int rcvint=0 ;
eeprom unsigned char eebcklight=1 ;// NOV Speicher für Hintergrundbeleuchtung eeprom unsigned char eesoundon=1 ;// NOV Speicher für sound
// Character table für selbstdefinierte Zeichen flash byte char0[8]={ 0b00000000, 0b00000001, 0b00000001, 0b00000001, 0b00000111, 0b00001001, 0b00000110, 0b00000000 };
flash byte char1[8]={ 0b00000000, 0b00000110, 0b00001001, 0b00001110, 0b00001000, 0b00001000, 0b00001000, 0b00000000 }; flash byte char2[8]={ 0b00000000, 0b00000000, 0b00001110, 0b00010001, 0b00010001, 0b00001110, 0b00000000, 0b00000000 };
// function für die selbsdefinierten Zeichen void define_char(byte flash *pc, byte char_code) { byte i,a ; a=(char_code)<<3 | 0x40 ; for (i=0; i<8; i++) lcd_write_byte(a++, *pc++) ;
}
#define ADC_VREF_TYPE 0xC0 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; }
void check_batterie(void) { d_adc2=read_adc(2) ; }
void check_fieldstrength(void) { d_adc1=read_adc(1) ; }
void check_light(void) {
d_adc0=read_adc(0) ; if (d_adc0<=20) if (lighton!=1) { while (light<128) // LCD Beleuchtung ein { light++ ; delay_ms(5) ; OCR1A=light ; } lighton=1 ; }; if (d_adc0>20) // LCD Beleuchtung aus { OCR1A=0 ; lighton=0 ; light=0 ; }
}
void pause(unsigned int timeout) { long n ; double schleifen ; unsigned int ischleifen ;
schleifen = 1000 * timeout ; ischleifen = schleifen ;
for (n=0; n<schleifen;n++) delay_us(1) ; }
void note(double freq, double dauer, unsigned int timeout) { long n,i ; double frequenz ; double schleifen ; unsigned int ifrequenz, ischleifen ;
freq = freq * 10 ; frequenz = 1 / freq ; frequenz = frequenz / 2 ; frequenz = frequenz * 1000000 ; schleifen = 1/ (frequenz * 2 ) ; schleifen = schleifen * 1000 ; schleifen = (schleifen * dauer) / 10 ; ifrequenz = frequenz ; ischleifen = schleifen ;
for(n=0;n<ischleifen;n++) { PORTB=0x01; for(i=0; i< ifrequenz;i++) delay_us(1);
PORTB=0x00; for(i=0; i<ifrequenz;i++) delay_us(1) ; }
if ( timeout > 0 ) pause(timeout) ; }
// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) {
/* if ( rcvint ==1 ) while ( PIND.2==1) { delay_ms(20) ; } ; // Taste immer noch gedrückt ? Dann warten... */ rcvint=0 ; sleepcnt=0 ; GIFR |=0x40 ;// INT0 Flag wieder setzen #asm("sei")// Interrupts wieder zulassen }
// Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
// Reinitialize Timer 0 value TCNT0=0xFF;
if ( wdtcnt>= 65534 ) { #asm("wdr") note(A0,T16,T10); // C wdtcnt=0 ; } wdtcnt++ ;
}
#define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7
#define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC)
// USART Receiver buffer #define RX_BUFFER_SIZE 24 char rx_buffer[RX_BUFFER_SIZE]; unsigned char rx_wr_index,rx_rd_index,rx_counter; // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow;
// USART Receiver interrupt service routine #pragma savereg- interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; #asm push r26 push r27 push r30 push r31 in r26,sreg push r26 #endasm status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; #asm pop r26 out sreg,r26 pop r31 pop r30 pop r27 pop r26 #endasm sleepcnt=0 ; } #pragma savereg+
#ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif
// ----------------------------------------------------------- --------------------- // Anzeigetexte in die variablen laden. (spart speicherplatz) // ----------------------------------------------------------- --------------------- void ladetexte(void) { // "1234567890123456" strcpyf(strText[1]," Remote Control "); strcpyf(strText[2]," (c)05 HB. ");
strcpyf(strText[3],"Haustuerklingel "); strcpyf(strText[4]," Tuer offen ");
strcpyf(strText[5],"Tuer geschlossen"); strcpyf(strText[6]," Oeffne Tuer ");
strcpyf(strText[7],"Person kommt... "); strcpyf(strText[8]," ");
strcpyf(strText[9]," "); strcpyf(strText[10]," ");
strcpyf(strText[11],"Empfangsbereit "); strcpyf(strText[12]," sleep... "); strcpyf(strText[13],"oo.o..o.oo..oo.o") ; strcpyf(strText[14],"..o.oo.o..oo..o.") ; }
void bewegungsmelder(char strDisplay[15]) { unsigned int cnt=0 ; rcvint=1 ; // Interrupt durch Receiver while(cnt<2) { if (srsoundon==1) { note(E2,T16,T10) ; note(E3,T4,T10) ; } if (displayoff==0 ) { lcd_clear() ; lcd_puts(strDisplay); lcd_gotoxy(0,1); lcd_putsf("Bewegungsmelder !"); } delay_ms(2000) ; cnt++ ; } while(PIND.2==0) { delay_ms(50) ; }
}
void klingel(char strDisplay[15]) { unsigned int cnt=0 ;
rcvint=1 ;// Interrupt durch Receiver while(cnt<2) { if (srsoundon==1) { note(A3,T16,T10) ; note(H3,T16,T10) ; note(D3,T16,T10) ; note(A2,T4,T10) ; } if (displayoff==0 ) { lcd_clear() ; lcd_puts(strDisplay); lcd_gotoxy(0,1); lcd_putsf("Klingel !"); } delay_ms(2000) ; cnt++ ; }
while(PIND.2==0) { delay_ms(50) ; }
}
void holezeichen(void) { unsigned int i=0 ; char strbuff[24] ; char strDisplay[15] ; delay_ms(500) ;// warten bis alle Zeichen da sind for (i=0;i<17;i++) { strRecBuff[i]="" ; strbuff[i]="" ; } sprintf(strRecBuff," ") ; sprintf(strbuff," ");
terminalkennung = getchar() ;// Terminalkennung aus datensatz holen
i = 0 ; while (rx_counter>0) { strRecBuff[0]=getchar() ; if (strRecBuff[0]==0x03)// lesen bis ETX break ;
strbuff[i]=strRecBuff[0] ; i++ ; if (i>17)// zu viele Zeichen ? Störungen ? ETX nicht erkannt ? { sprintf(strbuff,"Fehler Empfang! "); break ; } delay_ms(20) ; }
sprintf(strDisplay,"Data TRS%1d",terminalkennung);
if (strbuff[0] == DC1) { if (strbuff[1] == DC1) bewegungsmelder(strDisplay) ; }
if (strbuff[0] == DC2) { if (strbuff[1] == DC2) klingel(strDisplay) ; }
if (strbuff[0] == SYN) { if (displayoff==0 ) { lcd_clear() ; lcd_puts(strDisplay); lcd_gotoxy(0,1); lcd_putsf("SYN empfangen."); } }
printf("ACK"); delay_ms(500) ; }
void init_tranceiver(void) { printf("ER_CMD#R1"); // select Factory defaults delay_ms(1000); }
void main(void) {
unsigned int lightcnt=0 ;
// Input/Output Ports initialization // Port A initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTA=0x00; DDRA=0x00;
// Port B initialization // Func0=Out Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=0 State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTB=0x02; DDRB=0x03;
// Port C initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTC=0x00; DDRC=0x00;
// Port D initialization // Func0=In Func1=In Func2=Out Func3=In Func4=In Func5=Out Func6=In Func7=In // State0=T State1=T State2=0 State3=T State4=T State5=0 State6=T State7=T PORTD=0x00; DDRD=0x20;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 15,625 kHz // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x05; TCNT0=0xFF; OCR0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 15,625 kHz // Mode: Ph. correct PWM top=00FFh // OC1A output: Non-Inv. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x81; TCCR1B=0x02; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
// External Interrupt(s) initialization // INT0: On // INT0 Mode: Rising Edge // INT1: Off // INT2: Off GICR|=0x40; MCUCR=0x03 ; MCUCSR=0x00; GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; // 0x01 = freilaufend
// USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; // 33;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; SFIOR=0x00;
// ADC initialization // ADC Clock frequency: 125,000 kHz // ADC Voltage Reference: Int., cap. on AREF ADMUX=ADC_VREF_TYPE; ADCSRA=0x87;
// Watchdog Timer initialization // Watchdog Timer Prescaler: OSC/2048k WDTCR=0x0F ;
// Transceiver auf default Werte zurücksetzen init_tranceiver() ;
// Display Funktion ein/aus if ( PIND.2==1 ) { delay_ms(200) ; if ( PIND.2==1) displayoff=1 ; else displayoff=0 ; }
// LCD module initializationHarald if (displayoff==0 ) { lcd_init(16); ladetexte() ; } sleep_enable() ;
// -------------------- EEProm auslesen ------------------ if (eebcklight==255) eebcklight=0 ; if (eesoundon==255) eesoundon=0 ; srsoundon = eesoundon ; srbcklight = eebcklight ;
srbcklight=1 ; srsoundon=1 ; // ----------------------------------------------------------- -----
rcvint=0 ;// Interrupt durch receiver zurücksetzen if ( displayoff==0 ) { if (srbcklight==1) check_light() ; delay_ms(100) ; lcd_clear() ; }
check_fieldstrength() ; // Empfangsfeldstärke einlesen if (srsoundon==1) { note(C2,T16,T10); // C note(C3,T8,T10); // C note(A2,T8,T10); // C }
if ( displayoff==0 ) { define_char(char0,0) ; define_char(char1,1) ; define_char(char2,2) ;
lcd_clear() ; lcd_puts(strText[1]); lcd_gotoxy(0,1); lcd_puts(strText[2]); delay_ms(4000) ; lcd_clear() ; } isrflag=0 ;
// Watchdog disable
#asm("wdr") ; WDTCR |= (1<<0x04) | (1<<0x03) ; WDTCR=0x00 ;
// Global enable interrupts #asm("sei");
while (1) { check_batterie() ; if (d_adc2 < 600)// Batteriespannung <= 6,0 Volt { note(C3,T16,T10); // C note(C3,T8,T10); // C lcd_clear(); lcd_putsf("Batteriespannung"); lcd_gotoxy(0,1); lcd_putsf("<= 6,0 Volt"); delay_ms(2000) ; } if (displayoff==0) { lcd_gotoxy(0,0); lcd_puts(strText[11]);// "Erwarte Ereignis" } if (displayoff==0 ) { if (lightcnt>= 50) { if (srbcklight==1) check_light() ;
check_fieldstrength() ; lightcnt=0 ; } } lightcnt++ ; if (displayoff==0 ) { //sprintf(adc0,"ADC= %d ",d_adc) ; sprintf(adc0,"AD=%d %d ",d_adc0,d_adc1) ; lcd_gotoxy(0,1); lcd_puts(adc0) ; }
/* if (sleepcnt>=50)// ca. 2,5 Sekunden, Schlafmodus { lcd_clear() ; lcd_puts(strText[1]); lcd_gotoxy(0,1); lcd_puts(strText[12]); if (displayoff==0 ) { _lcd_ready() ; _lcd_write_data(0x8); } idle() ; while(1) { if ( sleepcnt == 0 ) break ; } ; }
*/
delay_ms(50) ; sleepcnt++ ; if ( rx_counter > 0 ) // Commando von Schnittstelle gekommen ? { if ( getchar() == 0x02 )// 0x02 = STX holezeichen() ; if (displayoff==0 ) lcd_clear() ; } }; }
|
The Transmitter project:
/********************************************* Project : FM Transceiver Datum : 07.07.2005 Author : H. Brachschoss Transmitter *********************************************/
#include <mega32.h> #include <delay.h> #include <stdlib.h> #include <stdio.h>
#define TERMINAL 0x02 #define STX 0x02 #define ETX 0x03 #define SYN 0x16 #define DC1 0x11// Device Control 1 für Bewegungsmelder #define DC2 0x12 // Klingel #define DC3 0x13// Ultraschall Melder
unsigned int USStatus=0 ;
// External Interrupt 1 service routine interrupt [EXT_INT1] void ext_int1_isr(void) { delay_ms(100) ; if (PIND.3 == 1 ) printf("%c%c%c%c%c",STX,TERMINAL,DC2,DC2,ETX);// Klingel Meldung übertragen.
while (PIND.3 == 1 ) delay_ms(20) ;
GIFR |=0xE0 ;// INT0 Flag wieder setzen #asm("sei")// Interrupts wieder zulassen }
// External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { delay_ms(100) ; if (PIND.2 == 1 ) printf("%c%c%c%c%c",STX,TERMINAL,DC1,DC1,ETX);// Bewegungsmelder Meldung übertragen.
while (PIND.2 == 1 ) delay_ms(20) ;
GIFR |=0xE0 ;// INT0 Flag wieder setzen #asm("sei")// Interrupts wieder zulassen }
// External Interrupt 2 service routine interrupt [EXT_INT2] void ext_int2_isr(void) { delay_ms(100) ; if (PINB.2 == 1 ) USStatus = 0 ; //printf("%c%c%c%c%c",STX,TERMINAL,DC3,DC3,ETX);// Ultraschall Meldung übertragen.
//while (PINB.2 == 1 ) delay_ms(500) ;
GIFR |=0xE0 ;// INT0 Flag wieder setzen #asm("sei")// Interrupts wieder zulassen }
#define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7
#define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC)
// USART Receiver buffer #define RX_BUFFER_SIZE 24 char rx_buffer[RX_BUFFER_SIZE]; unsigned char rx_wr_index,rx_rd_index,rx_counter; // This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow;
// USART Receiver interrupt service routine #pragma savereg- interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; #asm push r26 push r27 push r30 push r31 in r26,sreg push r26 #endasm status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; #asm pop r26 out sreg,r26 pop r31 pop r30 pop r27 pop r26 #endasm } #pragma savereg+
#ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index]; if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #asm("cli") --rx_counter; #asm("sei") return data; } #pragma used- #endif
// Standard Input/Output functions #include <stdio.h>
void holezeichen(void) { unsigned int i=0 ; unsigned char strbuff[16]="" ; delay_ms(1000) ;
while (rx_counter > 0 ) { strbuff[i] = getchar() ; i++ ; delay_ms(50) ; } //if ( strbuff[0] != STX ) //printf("%s",strbuff) ; }
// Declare your global variables here
void main(void) {
// Input/Output Ports initialization // Port A initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTA=0x00; DDRA=0x00;
// Port B initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTB=0x00; DDRB=0x00;
// Port C initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTC=0x00; DDRC=0x00;
// Port D initialization // Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In // State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T PORTD=0x00; DDRD=0x00;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00;
// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;
// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
// External Interrupt(s) initialization // INT0: On // INT0 Mode: Rising Edge // INT1: On // INT1 Mode: Rising Edge // INT2: On // INT2 Mode: Falling Edge GICR|=0xE0; MCUCR=0x0F; MCUCSR=0x00; GIFR=0xE0;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;
// USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 19200 UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; SFIOR=0x00;
printf("ER_CMD#R1"); // select Factory defaults delay_ms(1000) ;
// Global enable interrupts #asm("sei")
while (1) { if (rx_counter > 0) holezeichen() ; /* cnt++ ; delay_ms(5000) ; printf("%c%cT2: %d%c",STX,TERMINAL,cnt,ETX); if (cnt>=1000) cnt=0 ; */
delay_ms(10000) ; printf("%c%c%c%c%c",STX,TERMINAL,SYN,SYN,ETX) ;
if ( PINB.2 == 1 ) { delay_ms(100) ; if ( PINB.2 == 1 ) { USStatus = 0 ; printf("%c%c%c%c%d%c",STX,TERMINAL,DC3,DC3,USStatus, ETX) ; }
} else { USStatus=1 ; printf("%c%c%c%c%d%c",STX,TERMINAL,DC3,DC3,USStatus, ETX) ;
}
}; }
|