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

📄 uart.c

📁 GSM模块的AT指令代码~,了解如何使用AT指令控制GSM模块收发短信等。
💻 C
字号:
#include <mega128.h>
#include "define.h"

#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)

//timer1=============================================================
bool rx_time_overflow;  //溢处标志,由TIMER1定时得到。
//定时器定时设置
#define TH 0x00
#define TL 0x00
interrupt [TIM1_OVF] void timer1_ovf_isr(void){
rx_time_overflow=1;
}

//uart0==================================================================
// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 32
char rx_buffer0[RX_BUFFER_SIZE0];
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
bool rx_buffer_overflow0;

//==========================================
void uart_on(void);
void uart_off(void);

//==========================================
void uart_on(void){
rx_time_overflow=0;
rx_buffer_overflow0=0;
rx_wr_index0=rx_rd_index0=rx_counter0=0;
TCNT1H=TH;        //溢出计数器清0
TCNT1L=TL;
UCSR0B|=0x80;
TCCR1B=0x04;
}

void uart_off(void){
UCSR0B&=0x7F;
TCCR1B=0x00; 
}

//====================================
// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer0[rx_wr_index0]=data;
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (++rx_counter0 == RX_BUFFER_SIZE0)
      {
      rx_counter0=0;
      rx_buffer_overflow0=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0)
   if (rx_time_overflow) return 0;
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
cli();
--rx_counter0;
sei();
return data;
}
#pragma used-
#endif

unsigned char gets_OK(char* dst,int max_num){
unsigned char i;
uart_on();
for (i=0;i<(max_num-1);i++)
   {
   TCNT1H=TH;        //溢出计数器清0
   TCNT1L=TL;
   *(dst++)=getchar();
   if (rx_time_overflow) 
      {
      i=0;
      break;
      }
   else if ((i>2)&&(*(dst-4)=='O')&&(*(dst-3)=='K')&&(*(dst-2)=='\r')&&(*(dst-1)=='\n'))
      {
      *dst=0;
      break;
      }
   }
uart_off();
*(dst+max_num-1)=0;
if (rx_buffer_overflow0) i=0;
return i;
}

char gets_dayu(void){
bool flag=0;
uart_on();
while (!rx_time_overflow)
{
   TCNT1H=TH;        //溢出计数器清0
   TCNT1L=TL;
   if (getchar()=='>') 
   {
      flag=1;
      break;
   }
}
uart_off();
return flag;
}

//uart1=================================================================
// USART1 Receiver buffer
#define RX_BUFFER_SIZE1 8
char rx_buffer1[RX_BUFFER_SIZE1];
unsigned char rx_wr_index1,rx_counter1;
//unsigned char rx_rd_index1;
bool rx_buffer_overflow1;

//字幕机损坏,下面两个函数暂时不用
/*/===============================
void uart1_on(void);
void uart1_off(void);

//==========================
void uart1_on(void){
rx_time_overflow=0;
rx_buffer_overflow1=0;
rx_wr_index1=rx_rd_index1=rx_counter1=0;
TCNT1H=TH;        //溢出计数器清0
TCNT1L=TL;
UCSR1B|=0x80;
TCCR1B=0x04;
}

void uart1_off(void){
UCSR1B&=0x7F;
TCCR1B=0x00;
}
*/

//========================
// USART1 Receiver interrupt service routine
interrupt [USART1_RXC] void usart1_rx_isr(void)
{
char status,data;
status=UCSR1A;
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer1[rx_wr_index1]=data;
   if (++rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
   if (++rx_counter1 == RX_BUFFER_SIZE1)
      {
      rx_counter1=0;
      rx_buffer_overflow1=1;
      };
   };
}

//字幕机损坏,此函数暂时不用。。。
/*/ Get a character from the USART1 Receiver buffer
#pragma used+
char getchar1(void){
char data;
uart1_on();
while (rx_counter1==0)
   if (rx_time_overflow) return 0;
data=rx_buffer1[rx_rd_index1];
if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
#asm("cli")
--rx_counter1;
#asm("sei")
uart1_off();
return data;
}
#pragma used- 
*/

// Write a character to the USART1 Transmitter
#pragma used+
void putchar1(char c)
{
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
}
#pragma used-

void put1_tg(void){
unsigned int i;
unsigned char temp=4;
putchar1(0x9A);
putchar1(0x01);   //ID_LENGTH
putchar1(0x00);   //0号字幕机
if (temp>array) temp=array;
for (i=0;i<temp;i++)
{
   putchar1(tg[i]);    //长度统计中出现0x9A发送两遍
   if (tg[i]==0x9A)
      {
      putchar1(tg[i]);
      tg[array-1]+=0x9A;   //校验位校正
      }
}
for (i=4;i<array;i++)
{
   putchar1(tg[i]);
}
if ( tg[array-1]==0x9A )    //校验位为0x9A则发送两遍
{
   putchar1(0x9A);
}
}

/*
void put1(unsigned char *p, unsigned char num) 
{
  unsigned char i;
  for (i = num; i; i--)
  {
    putchar1(*p++);
  }
}
*/

⌨️ 快捷键说明

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