⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial1.c

📁 基于Atmega128的串口通信(232)
💻 C
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#define SYNC 0x40
#define PARITY_EVEN 0x20
#define PARITY_ODD  0x30
#define STOP_2  0x04
#define DATA_5  0x00
#define DATA_6  0x02
#define DATA_7  0x04
#define DATA_8  0x06
#define DATA_9  0x0c
#define SYSTEM_CLOCK 14745600L
#define BAUD_RATE    115200L
#define UART_RX_BUFFER_SIZE 128
#define UART_RX_BUFFER_MASK (UART_RX_BUFFER_SIZE-1)
#if(UART_RX_BUFFER_SIZE&UART_RX_BUFFER_MASK)
#error RX buffer size is not a power of 2
#endif
#define UART_TX_BUFFER_SIZE 128
#define UART_TX_BUFFER_MASK (UART_TX_BUFFER_SIZE-1)
#if(UART_TX_BUFFER_SIZE&UART_TX_BUFFER_MASK)
#error TX buffer size is not a power of 2
#endif
volatile static unsigned char UART_RxBuf[UART_RX_BUFFER_SIZE];
volatile static unsigned char UART_RxHead;
volatile static unsigned char UART_RxTail;
volatile static unsigned char UART_TxBuf[UART_TX_BUFFER_SIZE];
volatile static unsigned char UART_TxHead;
volatile static unsigned char UART_TxTail;
unsigned char __attribute__((__progmem__)) prompt[]="ATmega128> ";
unsigned char __attribute__((__progmem__)) EEPROM_prompt[]="EEPROM> ";
unsigned char __attribute__((__progmem__)) logo[]="\r\n+----------------------------------+\r\n| AVR(ATmega128) Test program ver 1.0  |\r\n+----------------------------------+\r\n|<H> Help Messages                     |\r\n|                                       |\r\n|                Serial Test Program    |\r\n      +----------------------------------+\r\n";
unsigned char __attribute__((__progmem__)) M_Unknown_Command[]=
                                     "Unknown Command, Try again\r\n";
unsigned char __attribute__((__progmem__)) M_Enter_Address[]=
                                      "\r\nBase Address:0x";
unsigned char __attribute__((__progmem__)) M_Help[]="\r\n                                      H: This Message\r\n                                      D:Dump Internal Flash \r\n									  E:EEPROM Test Mode\r\n									  L:Logo Print\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Test[]="\r\n										                         EEPROM   Test  Mode...\r\n                        press<Q> to quit,<H> to Display Help Message\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Write[]="\r\n	                                      EEPROM Write  Mode\r\n";							 
unsigned char __attribute__((__progmem__)) M_EEPROM_Read[]="\r\n                                      EEPROM Read Mode\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Write_End[]="\r\n                                      EEPROM Write  Mode 	End\r\n";								 
unsigned char __attribute__((__progmem__)) M_EEPROM_Help[]="\r\n                                      H:This Message\r\n 								      W:EEPROM Write Test\r\n									  R:EEPROM Read Test\r\n									  E:EEPROM Entire Erase Mode\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Empty[]="\r\n                                      EEPROM is Empty !\r\n";
unsigned char __attribute__((__progmem__)) M_EEPROM_Erase_Wait[]="\r\n                      Please Wait for Erasing of Entire EEPROM Memory\r\n";									 
void Initialize(void);
void serial_Initialize(unsigned long int baud);
unsigned char  ReceiveByte(void);
void TransmitByte( unsigned char  data);
void print_logo(void);
void print_prompt(void);
void print_Message(unsigned char *message);
void program_memory_dump(unsigned int base_addr);
unsigned int To_Numeric(unsigned char in_data);
void EEPROM_Test(void);
void Initialize(void)
{
  MCUCR=0x00;
  serial_Initialize(BAUD_RATE);
}
void serial_Initialize(unsigned long int baud)
{
   unsigned short int ubrr1;
   ubrr1=((SYSTEM_CLOCK/(16L*baud))-1);
   UBRR1H=(unsigned char)(ubrr1>>8);
   UBRR1L=(unsigned char)ubrr1;
   UCSR1A=0x20;
   UCSR1B=((1<<RXCIE)|(1<<RXEN)|(1<<TXEN));
   UCSR1C=DATA_8;
   UART_RxTail=0;
   UART_RxHead=0;
   UART_TxTail=0;
   UART_TxHead=0;
}
SIGNAL(SIG_UART1_RECV)
{ 
   unsigned char data;
   unsigned char tmphead;
   data=UDR1;
   tmphead=(UART_RxHead+1)&UART_RX_BUFFER_MASK;
   UART_RxHead=tmphead;
   if(tmphead==UART_RxTail){
      }
	UART_RxBuf[tmphead]=data;
}
SIGNAL(SIG_UART1_DATA)
{
   unsigned char tmptail;
   if( UART_TxHead!= UART_TxTail){
        tmptail= (UART_TxTail+1)& UART_TX_BUFFER_MASK;
        UART_TxTail=tmptail;
	    UDR1=UART_TxBuf[tmptail];
	  }
	else{
	     UCSR1B&=~(1<<UDRIE);
		 }
}
unsigned char ReceiveByte(void)
{
   unsigned char tmptail;
   while( UART_RxHead==UART_RxTail);
   tmptail=(UART_RxTail+1)&UART_RX_BUFFER_MASK ;
   UART_RxTail=tmptail;
   return  UART_RxBuf[tmptail];
} 
void TransmitByte( unsigned char  data)
{
   unsigned char tmphead;
   tmphead=(UART_TxHead+1)&UART_TX_BUFFER_MASK;
   while( tmphead==UART_TxTail);
   UART_TxBuf[tmphead]=data;
   UART_TxHead=tmphead;
   UCSR1B|=(1<<UDRIE);
}
int main(void)
{
   unsigned char  data;
   unsigned int address=0;
    Initialize();
	sei();
	print_logo();
	while(1){
	   data=ReceiveByte();
	   switch(data){
	      case '\r': TransmitByte('\r');
	                  TransmitByte('\n');
					  print_prompt();
					  break;
		  case'\n':  TransmitByte('\r');
	                  TransmitByte('\n');
					   print_prompt();
					   break;
		  case 'd':
		  case 'D':  TransmitByte(data);
		              print_Message((unsigned char *)M_Enter_Address);
				      for(;;){
				          data=ReceiveByte();
						  if((data!='\r')&&(data!='\n')){
						     address=address*16+To_Numeric(data);
							 TransmitByte(data);
							}
						  else{
							 TransmitByte('\r');
	                         TransmitByte('\n'); 
                             break;
                             }
                         }
                      TransmitByte('\r');
	                  TransmitByte('\n'); 
                      program_memory_dump(address);
					  print_prompt();
					  break;
			case 'h':
			case 'H': TransmitByte(data);
			           print_Message((unsigned char *)M_Help);
                       print_prompt();
					   break;
			case 'l':
			case 'L':
			          TransmitByte(data);
					  print_logo();
					  break;
			case 'e':
			case 'E': TransmitByte(data);
                       print_Message((unsigned char *)M_EEPROM_Test);
					   EEPROM_Test();
					   print_prompt();
					   break;
			default:  TransmitByte(data);
			}
	}
}
void print_logo(void)
{
  unsigned int i;
  for(i=0;;i++){
       if(PRG_RDB(logo+i)=='\0')
	       break;
		TransmitByte(PRG_RDB(logo+i));
		}
	 print_prompt();
}
void print_prompt(void)	
{
  unsigned int i;
  for(i=0;;i++){
       if(PRG_RDB(prompt+i)=='\0')
	       break;
		TransmitByte(PRG_RDB(prompt+i));
	 }
}
void print_Message(unsigned char *message)
{
   unsigned int i;
   for(i=0;;i++){
       if(PRG_RDB(message+i)=='\0')
	       break;
		TransmitByte(PRG_RDB(message+i));
	 }
}
void program_memory_dump(unsigned int base_addr)
{
   unsigned char upper_L,lower_L,upper_H,lower_H,mask=0x0f;
   unsigned char compensate_numeric=48, compensate_uppercase='A'-0x0a;
   unsigned int i,temp,j;
   unsigned char *pAddr,data[16]={0,};
   pAddr=0x00;
   for(i=base_addr;i<(base_addr+256);i=i+2){
        if(i%16==0){
		   temp=i>>8;
		   upper_H=(unsigned char)temp>>4;
		   upper_H&=mask;
	       lower_H=(unsigned char)temp&mask;
		   if(upper_H<=9)
		      upper_H+=compensate_numeric;
		    else
			  upper_H+=compensate_uppercase;
			if(lower_H<=9)
			  lower_H+=compensate_numeric;
			else
			   lower_H+=compensate_uppercase;
			TransmitByte(upper_H);
			TransmitByte(lower_H);
			upper_L=(unsigned char)i>>4;
			upper_L&=mask;
			upper_L=(unsigned char)i&mask;
			if(upper_L<=9)
			   upper_L+=compensate_numeric;
			else
			   upper_L+=compensate_uppercase;
			if(lower_L<=9)
			    lower_L+=compensate_numeric;
			else
			    lower_L+=compensate_uppercase;
            TransmitByte(upper_L); 
			TransmitByte(lower_L);
			TransmitByte(' ');
			TransmitByte(':');
			TransmitByte(' ');
			}
		data[i&0x0f]=(PRG_RDB(pAddr+i));
		upper_L=data[i&0x0f]>>4;
		upper_L&=mask;
		lower_L=data[i&0x0f]&mask;
		if(upper_L<=9)
		   lower_L+=compensate_numeric;
		else
		    upper_L+=compensate_uppercase;
		if(lower_L<=9)
		    lower_L+=compensate_numeric;
		else
			lower_L+=compensate_uppercase;
		data[(i+1)&0x0f]=(PRG_RDB(pAddr+i+1));
		upper_H=data[(i+1)&0x0f]>>4;
		upper_H&=mask;
		lower_H=data[(i+1)&0x0f]&mask;
		if(upper_H<=9)
		   upper_H+=compensate_numeric;
		else
			upper_H+=compensate_uppercase;
		if(lower_H<=9)
		    lower_H+=compensate_numeric;
		else
			 lower_H+=compensate_uppercase;
		 TransmitByte(upper_L); 
		 TransmitByte(lower_L);
		 TransmitByte(' ');
		 TransmitByte(upper_H);
		 TransmitByte(lower_H );
         TransmitByte(' ');
        if(i%16==14){
           TransmitByte(' ');
           for(j=0;j<16;j++){
               if((data[j]<=122)&&(data[j]>=32))
                  TransmitByte(data[j]);
                else
                  TransmitByte('.');
                }
            TransmitByte('\r');
            TransmitByte('\n');
            }
        }
    TransmitByte('\r');
    TransmitByte('\n');	
} 
 unsigned int To_Numeric(unsigned char in_data)
{
   if(in_data=='0')
       return 0;
	else if((in_data<='9')&&(in_data>='1'))
	   return(unsigned int)(in_data-'1'+1);
	else if((in_data<='f')&&(in_data>='a'))
	   return(unsigned int)(in_data-'a'+10);
	else if((in_data<='F')&&(in_data>='A'))
	   return(unsigned int)(in_data-'A'+10);
	else
	   return 0;
}	   
void EEPROM_Test(void)
{
  unsigned char temp_data,temp;
  unsigned int address=0;
  for(;;){
      print_Message((unsigned char*)EEPROM_prompt);
	  temp= ReceiveByte();
	  if((temp=='w')||(temp=='W')){
	    TransmitByte(temp);
		print_Message((unsigned char*)M_EEPROM_Write);
		address=0;
		for(;;){
		     temp_data=ReceiveByte();
			 if((temp_data=='\r')||(temp_data='\n')){
			    _EEPUT(address++,temp_data);
				print_Message((unsigned char*)M_EEPROM_Write_End);
				address=0;
				break;
				  }
			  else{
			     _EEPUT(address++,temp_data);
                 TransmitByte(temp_data); 
				   }
			 }
          }
		else if((temp=='r')||(temp=='R')){
		     TransmitByte(temp);
			 print_Message((unsigned char*)M_EEPROM_Read);
			 address=0;
			for(;;){
			  _EEGET(temp_data,address++);
			  if((temp_data=='\r')||(temp_data=='\n')||(temp_data==0xff)){
			     if(address==1)
				    print_Message((unsigned char*)M_EEPROM_Empty);
                  TransmitByte('\r');
                  TransmitByte('\n');
                  break;
                 }
              else{
                   TransmitByte(temp_data);
                   }
                }
            }
        else if( (temp=='e')||(temp=='E')){
               TransmitByte(temp);
			   print_Message((unsigned char*)M_EEPROM_Erase_Wait);
			   for(address=0;address<4096;address++)
			      _EEPUT(address,0xff);
               TransmitByte('\r');
               TransmitByte('\n');
               }
        else if( (temp=='h')||(temp=='H')){
               print_Message((unsigned char*)M_EEPROM_Help);
			   }
		else if( (temp=='q')||(temp=='Q')){
		       TransmitByte(temp);
			   TransmitByte('\r');
               TransmitByte('\n');
			   break;
			   }
		else{
		     TransmitByte(temp);
			 TransmitByte('\r');
             TransmitByte('\n');
			 }
	}
}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -