📄 usart.c
字号:
/**************************** 包含库函数 *******************************/
#include <iom16v.h>
#include <stdio.h>
#include <macros.h>
#include "usart.h"
/******************************************************************************/
unsigned char temprecv[60]; //接收串口数据
unsigned char tempread[6]; //数组串
unsigned char recvnum=0; //
unsigned char readnum=0; //
unsigned char overflow=0; //串口缓冲溢出标志位
unsigned char read_available=0; //
unsigned char ask=0; //服务器查询标志
/***************************** 延时函数 ********************************
void delay_us(int time)
{
while (time)
time--;
asm("nop");
}
//////////////////////////////////////////////////////////////////////////////*/
/*************************** 串口接收中断程序 *****************************/
#pragma interrupt_handler uart0_rx_isr:16
void uart0_rx_isr (void)
{
temprecv[recvnum]=UDR;
recvnum++;
if (recvnum == 60 )
{
recvnum=0;
overflow=1;
}
}
/******************************************************************************/
/************************* 串口数据发送程序 ***************************/
void send_char (unsigned char data)
{
//DE_set;
UCSRB = 0x98; //开发送中断
UDR=data;
while (!(UCSRA & 0x40));
{
asm("nop");
}
UCSRA |= 0x40;
UCSRB = 0x90; //关发送中断
//DE_clr;
}
////////////////////////////////////////////////////////////////////////////////
/*************************** 串口读取程序 *****************************/
void uart_read (unsigned char *rdnum)
{
unsigned char i,k;
rdnum=tempread;
if ((overflow == 0) && (recvnum >= (readnum+5)))
{
for (i=0;i<6;i++)
{
tempread[i] = temprecv[(readnum+i)];
}
read_available=1;
}
else if ((overflow==1) && ((59+recvnum)>=(readnum+5)))
{
for (i=0;i<6;i++)
{
if ((readnum+i)>59)
tempread[i] = temprecv[(readnum+i-59)];
else
tempread[i] = temprecv[(readnum+i)];
}
read_available=1;
}
else
{
read_available=0;
}
}
/******************************************************************************/
/*********************** 串口接收数据处理程序 *************************/
void urat_act (void)
{
unsigned char i=0,k=0,p=0;
for (i=0;i<5;i++)
{
if (tempread[i] == 0xAA)
{
p=i;
}
}
if ((tempread[0]!= 0xAA) && (p == 0)) readnum+=5;
else if (p != 0) readnum+=p;
else if ((tempread[0]== 0xAA) && (p == 0))
{
readnum+=5;
if ((tempread[1] == device_type) && (tempread[2] == device_number)) //设备类型、设备号正确
{
k = 0xff ^ tempread[1] ^ tempread[2] ^ tempread[3];
if (tempread[4] == k)
{
if (tempread[3] == 0x51) //服务器发送查询命令
{
ask = 1;
}
else if (tempread[3] == 0x52) //服务器发送ID验证成功
{
;
}
else if (tempread[3] == 0x53) //服务器发送ID验证错误
{
;
}
else if (tempread[3] == 0x54) //服务器发送发票号验证成功
{
;
}
else if (tempread[3] == 0x55) //服务器发送发票号验证错误
{
;
}
else if (tempread[3] == 0x56) //服务器接受成功
{
step = ;
}
else if (tempread[3] == 0x57) //服务器接收错误
{
ask = 1;
}
}
else //要求服务器重发命令
{
DE_set;
delay(200);
send_char(0xbb);
send_char(device_type);
send_char(device_number);
send_char(0x46);
send_char(0x0);
send_char(0xff ^ device_type ^ device_number ^ 0x46 ^ 0x0);
DE_clr;
}
}
}
if (readnum >59)
{
readnum-=60;
overflow=0;
}
}
/******************************************************************************/
/******************************************************************************
void port_init(void)
{
PORTA = 0xF0;
DDRA = 0xff;
PORTB = 0xFF;
DDRB = 0xE0;
PORTC = 0xFF;
DDRC = 0x00;
PORTD = 0x94;
DDRD = 0x64;
}
******************************************************************************/
////////////////////////////////////////////////////////////////////////////////
void uart0_init(void)
{
UCSRA=0x00;
UCSRB=0x00;
UCSRB=0x98;
UCSRC=0x86; //采用8位模式
UBRRL=0x19; //设置波特率
UBRRH=0x00;
}
/******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -