📄 serial.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 + -