#include <c8051f330.h>
#include <Init.h>
#include <stdio.h>
#include <string.h>
#include <UART_SPI.h>
#include <spi.h>
//unsigned int xdata SendBuffer[512]; //发送缓冲区
//unsigned int xdata ReceiveBuffer[512]; //接收缓冲区
//unsigned int Flag_NewMessage; //新消息标志位
unsigned int Frame_Lenth; //待发送数据长度
unsigned int Data_len, Data_LRC; //数据长度和校验和计算结果
unsigned int Send_count = 1, Receive_count = 0; //初始化发送和接收计数器
unsigned char LRC_Data = 0; //校验和
unsigned char Star_flag = 0; //帧开始标志
unsigned char Data_flag = 0; //数据开始标志
//unsigned char LRC_flag = 0; //校验和标志
//unsigned char Uart_Spi = 0x0A; //与存储部分通信接口
unsigned char B_Star = 0, B_End = 0; //帧开始和结束
//unsigned char D_flag = 0; //开始收数据标志
//unsigned char STR_flag1=0;
static int R = 0;
static int i = 0;
#define STX 0x02 //帧开始标志
#define ETX 0x03 //帧结束标志
#define DATA_OK 0x83 //正确接收响应
#define DATA_ERROR 0x38 //接收出错响应
#define STR_flag 0x7E //开始握手标志
#define CON_flag 0x7D //暂停结束标志
#define DATA_flag 0x7C //数据开始标志
#define DATA_OVER_flag 0x7B //数据发送完标志
/************************************************************
函数名:Uart_ISR()
功 能:串口中断服务程序,完成一帧数据的接收和发送.在传送时,
按数据长度Frame_Lenth将发送缓冲区的数据依次发出.在接
收时完成一帧数据的接收并校验,在校验正确后置一标志以
示有新消息,供其他接口查询.
*************************************************************/
void Uart_ISR() interrupt 4
{
if (TI0)
{
TI0 = 0;
if(Send_count <=Frame_Lenth)
{
SBUF0 = SendBuffer[Send_count];
Send_count++;
}
else
Send_count = 1;
}
if(RI0)
{
RI0=0;
switch(i)
{
case 0 : {
B_Star = SBUF0;
if(B_Star == STX)
{
++i;
Star_flag = 1;
}
break;
}
case 1 : {
if(Star_flag)
{
Data_len = SBUF0;
Data_LRC = SBUF0;
Data_len <<= 8;
++i;
}
break;
}
case 2 : {
Data_len |= SBUF0;
Data_LRC ^= SBUF0;
++i;
break;
}
case 3 : {
Data_flag = SBUF0;
if(Data_flag == DATA_flag)
{
Data_LRC ^= SBUF0;
++i;
}
else
{
ReceiveBuffer[0] = SBUF0;
Data_LRC ^= SBUF0;
i += 2;
}
break;
}
case 4 : {
if(Receive_count < Data_len-2)
{
ReceiveBuffer[Receive_count] = SBUF0;
Data_LRC ^= SBUF0;
++Receive_count;
}
else
{
ReceiveBuffer[Data_len-2] = SBUF0;
Receive_count = 0;
Data_LRC ^= SBUF0;
++i;
}
break;
}
case 5 : {
B_End = SBUF0;
if(B_End == ETX)
{
++i;
}
else
Data_LRC ^= SBUF0;
break;
}
case 6 : {
LRC_Data = SBUF0;
if(Data_LRC == LRC_Data)
{
++R;
Star_flag = 0;
if((ReceiveBuffer[0] == STR_flag)&&(R == 1))
{
STR_flag1 = 1;
}
else if(R ==2)
{
machine = ReceiveBuffer[0];
Uart_Spi = 0x35;
}
else if((R>2)&&(R<=256))
{
Uart_Spi = 0x35;
}
else;
i=0;
Uart_PackageSend(DATA_OK,1);
}
else
{
Uart_PackageSend(DATA_ERROR,1);
i=0;
}
break;
}
default: {
i = 0;
break;
}
}
}
}
/**************************************************************
函数名:Uart_Scan()
功 能:查询新消息标志,如果有新消息完成消息的解析.
**************************************************************/
void Uart_Scan()
{ unsigned char aa = 0;
//i = 2;
do
{
if(Key == 1)break;
if(STR_flag1)
{
Uart_PackageSend(STR_flag,1); //返回开始握手信号
ReceiveBuffer[0] = 0;
STR_flag1 = 0;
//-----------------------------------------
//-------------------------------------------
ET0 = 0 ;
Upload_LED = 0;
}
UART_SPI_Transfer();
if ((ReceiveBuffer[0] == DATA_OVER_flag)&&(R==257))
{
Uart_PackageSend(DATA_OVER_flag,1); //返回数据传送完信号
ReceiveBuffer[0] = 0;
Uart_Spi = 0x00;
R = 0x00; //所有数据传送完
ET0 = 1;
//Key = 1;
aa = 1;
}
if (Uart_Spi == 0x50)
{
Uart_PackageSend(CON_flag,1); //发送暂停结束信号
Uart_Spi = 0;
}
}while(aa == 0);
}
/**************************************************************
函数名:Uart_PackageSend(MESSAGE_ID)
参 数:消息标识
功 能:根据消息的标识,对消息的内容进行打包,并启动传送.
**************************************************************/
void Uart_PackageSend(unsigned char MESSAGE_ID,unsigned int Lenth)reentrant
{
int i = 0, j = 0;
unsigned int len;
REN0 = 0;
len = Lenth;
SendBuffer[0] = STX; //发送帧开始标志位
len >>= 8;
SendBuffer[1] = len; //发送数据长度
Data_LRC = len;
SendBuffer[2] = Lenth;
Data_LRC ^= Lenth;
for (i = 0; i < Lenth; i++)
{
SendBuffer[i + 3] = MESSAGE_ID; //发送消息内容
Data_LRC ^= MESSAGE_ID;
}
SendBuffer[Lenth + 3] = ETX; //发送帧结束标志
SendBuffer[Lenth + 4] = Data_LRC; //发送校验码
Frame_Lenth = Lenth + 4;
SBUF0 = SendBuffer[0]; //启动发送
REN0 = 1;
}
UART.zip_C8051F430_visual c
版权申诉
138 浏览量
2022-09-20
19:08:40
上传
评论
收藏 2KB ZIP 举报
weixin_42651887
- 粉丝: 80
- 资源: 1万+