📄 uartgai._c
字号:
#define FRAMING_ERROR (1<<FE0)
#define PARITY_ERROR (1<<UPE0)
#define DATA_OVERRUN (1<<DOR0)
#define DATA_REGISTER_EMPTY (1<<UDRE0)
#define RX_COMPLETE (1<<RXC0)
#define FRAMEFLAG1 0xFF
#define REVSUCCEED 0x00 //接收成功回传标志
#define SENDAGAIN 0xFE //重发标志
// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 8
char rx_buffer0[RX_BUFFER_SIZE0];
volatile unsigned char rx_rd_index0,rx_counter0;
// This flag is set on when USART0 Receival is error
volatile unsigned char rx_error0;
volatile unsigned char FrameHead0;
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x26;
UBRR0L = 0x33; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0xD8;
FlashRxBuf();
}
void FlashRxBuf(void)
{
rx_error0 = 0;
rx_counter0 = 0;
rx_rd_index0 = 0;
FrameHead0 = 0;
}
char TestFrameHead(char data)
{
if(data == FRAMEFLAG1) //是否和设定的帧标志相等?有多种帧类型时,以或运算添加其他标志
return 1;
else
return 0;
}
// USART0 Receiver interrupt service routine
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
if(FrameHead == 0 && rx_counter0 == 0) //判断是否帧头
if(TestFrameHead(data)) //数据有效才设置FrameHead
FrameHead = data;
else
{
rx_buffer0[rx_counter0]=data;
if (++rx_counter0 == RX_BUFFER_SIZE0)
{
rx_counter0 = 0;
rx_error0 = 1;
}
}
}
else rx_error0 = 1 ;
}
// Get a character from the USART0 Receiver buffer
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
// USART0 Transmitter buffer
#define TX_BUFFER_SIZE0 8
char tx_buffer0[TX_BUFFER_SIZE0];
volatile unsigned char tx_wr_index0,tx_rd_index0,tx_counter0;
// USART0 Transmitter interrupt service routine
#pragma interrupt_handler uart0_tx_isr:iv_USART0_TXC
void uart0_tx_isr(void)
{
if (tx_counter0)
{
--tx_counter0;
UDR0=tx_buffer0[tx_rd_index0];
if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
};
}
// Write a character to the USART0 Transmitter buffer
void putchar(char c)
{
while (tx_counter0 == TX_BUFFER_SIZE0);
#asm("cli")
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
{
tx_buffer0[tx_wr_index0]=c;
if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
++tx_counter0;
}
else
UDR0=c;
#asm("sei")
}
void DisposeBufDatas(void)
{
//定义变量
unsigned char tPumpCyc; //换能器周期,单位s
unsigned char tSprayOn; //喷射脉宽,单位0.1ms
unsigned char tSprayCyc; //喷射周期,单位ms
unsigned char tPivDelay; //piv脉宽延时,单位0.1ms
char sprayNumL; //SprayNum低字节
char sprayNumH; //SprayNum高字节
if(rx_error0) //接收错误
putchar(SENDAGAIN);
else
{
sprayNumL = getchar();
sprayNumH = getchar();
tPumpCyc = getchar();
tSprayOn = getchar();
tSprayCyc = getchar();
tPivDelay = getchar();
//转换数据
SparyNum = (int)sprayNumL + ((int)sprayNumH << 8);
T1OveForPump = (unsigned char)(tPumpCyc * 1000 / (2 * 524.288));
CSprayOn = (unsigned char)(tSprayOn * 100 / 8);
CSprayCyc = (unsigned char)(tSprayCyc * 1000 / 8);
CPivDelay = (unsigned char)(tPivDelay * 100 /8);
putchar(REVSUCCEED); //回传接收成功标志
}
FlashRxBuf();
}//DisposeBufDatas(void)结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -