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

📄 serial.c

📁 MMC interface and FAT File system
💻 C
字号:
//#########################################################################
// File: serial.c
//
//
//#########################################################################
// Last change: 09.05.2003
//#########################################################################
// holger.klabunde@t-online.de
// http://home.t-online.de/home/holger.klabunde/homepage.htm
//#########################################################################
// Compiler: AVR-GCC 3.2
//#########################################################################
#include <io.h>
#include <interrupt.h>
#include <sig-avr.h>

#include "mydefs.h"
#include "serial.h"

#define RBUFLEN 64 //Pufferl鋘ge f黵 seriellen Empfang

volatile unsigned char rbuf[RBUFLEN]; //Ringpuffer 
volatile unsigned char rcnt, rpos, recbuf;

//volatile bit busy;
volatile unsigned char busy;

//Receive Interruptroutine
SIGNAL(SIG_UART_RECV)      /* signal handler for receive complete interrupt */
{
 recbuf= UDR; //Byte auf jeden Fall abholen, sonst Endlosinterrupt

 /* don't overwrite chars already in buffer */
 if(rcnt < RBUFLEN)  rbuf[(rpos+rcnt++) % RBUFLEN] = recbuf;
}

//Transmit Interruptroutine
SIGNAL(SIG_UART_TRANS)     /* signal handler for transmit complete interrupt */
{
 cbi(UCSRB,TXEN); //ATmega Disable Transmit complete interrupt l鰏chen
 busy=0; //Byte gesendet Flag r點ksetzen
}

unsigned char ser_getc (void)
{
 unsigned char c;

 while(!rcnt) { };   /* wait for character */
//   if(!rcnt) return 0; //Nix im Puffer, dann raus

// cbi(UCR,RXCIE); //AVR Disable Receiveinterrupt
 cbi(UCSRB,RXCIE); //ATMega Disable Receiveinterrupt

 rcnt--;
 c = rbuf [rpos++];
 if (rpos >= RBUFLEN)  rpos = 0;

// sbi(UCR,RXCIE); //AVR Enable Receiveinterrupt
 sbi(UCSRB,RXCIE); //ATmega Enable Receiveinterrupt
 return (c);
}

void ser_putc(unsigned char c)
{
//Nicht zu warten ist schlecht !
//Die Zeichenausgabe leidet dann !
  while(busy==1); //warten bis letztes Byte gesendet wurde
   
  sbi(UCSRB,TXEN); //ATmega Enable Transmit complete interrupt erlauben
  UDR=c;    //Byte in Sendepuffer
  busy = 1;        //Setze Flag Transmit gestartet
}

void ser_puts(unsigned char * s)
{
 unsigned char c;

   while((c=*s++))
    {
     if(c == '\n') //CR und LF senden bei \n
      {
       ser_putc(0x0D); //CR
       ser_putc(0x0A); //LF
      }
     else ser_putc(c);
    }
}

//void new_line( void) {	sendstring("\n\r"); }

void ser_init(void)
{
  rcnt = rpos = 0;  /* init buffers */
  busy = 0;

  sbi(TX_DIR,TX_PIN);  //TxD output
  sbi(TX_PORT,TX_PIN); //set TxD to 1

  /* enable RxD/TxD and ints  */
// UCR=(1<<RXCIE) |(1<<TXCIE)|(1<<RXEN) |(1<<TXEN); //AVR
  UCSRB=(1<<RXCIE) |(1<<TXCIE)|(1<<RXEN) |(1<<TXEN); //ATMega

//  UBRR=UART_BAUD_SELECT_4800; /* set baudrate*/

// Change baudrate in serial.h !
  UBRRH=(unsigned char)(UART_BAUD_SELECT>>8); /* set baudrate*/
  UBRRL=(unsigned char)(UART_BAUD_SELECT); /* set baudrate*/

  UCSRC=(1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); //ATMega 8 Bit,1 Stop, no parity
}

//Zeigt ein Byte im HexCode an
void ser_puthex(unsigned char by)
{
 unsigned char buff;

 buff=by>>4; //Highnibble zuerst
 if(buff<10) buff+='0'; //ASCII Code erzeugen
 else buff+=0x37;        //Gro遙uchstaben
 ser_putc(buff);

 buff=by&0x0f; //Danach das Lownibble
 if(buff<10) buff+='0'; //ASCII Code erzeugen
 else buff+=0x37;        //Gro遙uchstaben
 ser_putc(buff);
}

⌨️ 快捷键说明

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