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

📄 serial.c

📁 超好的GPS程序
💻 C
字号:
#include <io.h>
#include <interrupt.h>
#include <sig-avr.h>
#include <stdlib.h>

#include "serial.h"

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

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

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); //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
}

//ser_puts() st黵zt immer ab. Vermute kein RAM mehr ! Deshalb weggelassen
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 ser_init(void)
{
   rcnt = rpos = 0;  // init buffers
   busy = 0;

  // enable RxD/TxD and ints
// UCR=(1<<RXCIE) |(1<<TXCIE)|(1<<RXEN) |(1<<TXEN); //AVR
  UCSRB=(1<<RXCIE) |(1<<TXCIE)|(1<<RXEN) |(1<<TXEN); //AVR, ATMega
  UBRR=UART_BAUD_SELECT_4800; // set baudrate ATMega323
//  UBRRL=UART_BAUD_SELECT_4800; // set baudrate ATMega8
//  UCSRC=(1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); //ATMega 8 Bit,1 Stop, no parity
}

⌨️ 快捷键说明

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