PK 使人进步:晒晒你的串口程序
时间:10-02
整理:3721RD
点击:
这是我做的一个简单的下位机程序,欢迎拍砖!
引用刘公公的一句话“能修改BUG的才是高手!”
希望大家以这个程序为跳板,都成为高手!
同志们,拿起你的板砖,拍过来!
/*************************************************************************************************************/
/* 串口接收包程序
/* 功能:通过串口接收数据包
/* 作者:zsl
/* 日期:猴年马月
/* 修改日期:xxxx xxxx
/* 修改内容:增加注释
/* 通讯协议格式: 帧头(8bit) | 数据起始(8bit) | 数据域(32bit) | 数据尾
/* 0x55 | 0xaa | 高8 - 32bit:预留;0-7bit:控制led灯 | 0xee
/*
/*************************************************************************************************************/
#include <AT89X52.H>
#include "UART.h"
#define LEN 16
/********状态机*************/
enum UartFsm
{
HEAD = 0,
BEGIN,
DATA,
END,
};
/********当前状态变量***********/
unsigned char gudState = 0;
/********接收数据***********/
unsigned char ReceData[5];
/********串口接收缓冲***********/
unsigned char gaRXBuff[LEN];
/********接收队列头***********/
unsigned char gudHead = 0;
/********接收队列尾***********/
unsigned char gudTail = 0;
/********接收计数***********/
unsigned char gudCount = 0;
/********接收完成标志***********/
unsigned char gudRxOK标志寄存器 = 0;
/********错误标志***********/
unsigned char gudRxErr = 0;
/********接收缓冲变量***********/
volatile unsigned char Buftemp = 0;
/********************************/
/* 函数名称:GetData
/* 说明: 从接收队列中取一个字节
/********************************/
unsigned char GetData()
{
unsigned char udVal;
if(gudTail >= LEN)
{
gudTail = 0;
}
udVal = gaRXBuff[gudTail++];
return udVal;
}
/********************************/
/* 函数名称:GetFrmData
/* 说 明:从数据包中取出数据域
/********************************/
void GetFrmData(unsigned char *pDat)
{
unsigned char i;
if(gudTail == gudHead) return;
for(i = 0; i < 4; i++)
{
pDat = GetData();
}
}
main()
{
init_UART();
P0 = 0xff;
ReceData[4] = '\0';
Send_Data("Ready!\n");
while(1)
{
if(gudRxOK标志寄存器)
{
gudRxOK标志寄存器 = 0;
GetFrmData(ReceData);
/*******数据域中,第一个字节用来控制LED灯*******/
P0 = ~ReceData[0];
Send_Data("Receive OK!\n");
}
if(gudRxErr)
{
gudRxErr = 0;
Send_Data("Data error!\n");
}
}
}
void Uart(void) interrupt 4 using 3
{
if(RI)
{
RI=0;
Buftemp = SBUF;
switch(gudState)
{
case HEAD:
if(0x55 == Buftemp)
{
gudState = BEGIN;
}
break;
case BEGIN:
if(0xaa == Buftemp)
{
gudCount = 0;
gudState = DATA;
}
else
gudState = HEAD;
break;
case DATA:
if(gudHead >= LEN)
{
gudHead = 0;
}
gaRXBuff[gudHead++] = Buftemp;
gudCount++;
if(gudCount >= 4)
{
gudState = END;
}
break;
case END:
if(0xee == Buftemp)
{
gudRxOK标志寄存器 = 1;
}
else
{
gudRxErr = 1;
gudTail = gudHead; /* 如果有错误,数据丢弃 */
}
gudState = HEAD;
break;
default:
gudState = HEAD;
break;
}
}
}
引用刘公公的一句话“能修改BUG的才是高手!”
希望大家以这个程序为跳板,都成为高手!
同志们,拿起你的板砖,拍过来!
/*************************************************************************************************************/
/* 串口接收包程序
/* 功能:通过串口接收数据包
/* 作者:zsl
/* 日期:猴年马月
/* 修改日期:xxxx xxxx
/* 修改内容:增加注释
/* 通讯协议格式: 帧头(8bit) | 数据起始(8bit) | 数据域(32bit) | 数据尾
/* 0x55 | 0xaa | 高8 - 32bit:预留;0-7bit:控制led灯 | 0xee
/*
/*************************************************************************************************************/
#include <AT89X52.H>
#include "UART.h"
#define LEN 16
/********状态机*************/
enum UartFsm
{
HEAD = 0,
BEGIN,
DATA,
END,
};
/********当前状态变量***********/
unsigned char gudState = 0;
/********接收数据***********/
unsigned char ReceData[5];
/********串口接收缓冲***********/
unsigned char gaRXBuff[LEN];
/********接收队列头***********/
unsigned char gudHead = 0;
/********接收队列尾***********/
unsigned char gudTail = 0;
/********接收计数***********/
unsigned char gudCount = 0;
/********接收完成标志***********/
unsigned char gudRxOK标志寄存器 = 0;
/********错误标志***********/
unsigned char gudRxErr = 0;
/********接收缓冲变量***********/
volatile unsigned char Buftemp = 0;
/********************************/
/* 函数名称:GetData
/* 说明: 从接收队列中取一个字节
/********************************/
unsigned char GetData()
{
unsigned char udVal;
if(gudTail >= LEN)
{
gudTail = 0;
}
udVal = gaRXBuff[gudTail++];
return udVal;
}
/********************************/
/* 函数名称:GetFrmData
/* 说 明:从数据包中取出数据域
/********************************/
void GetFrmData(unsigned char *pDat)
{
unsigned char i;
if(gudTail == gudHead) return;
for(i = 0; i < 4; i++)
{
pDat = GetData();
}
}
main()
{
init_UART();
P0 = 0xff;
ReceData[4] = '\0';
Send_Data("Ready!\n");
while(1)
{
if(gudRxOK标志寄存器)
{
gudRxOK标志寄存器 = 0;
GetFrmData(ReceData);
/*******数据域中,第一个字节用来控制LED灯*******/
P0 = ~ReceData[0];
Send_Data("Receive OK!\n");
}
if(gudRxErr)
{
gudRxErr = 0;
Send_Data("Data error!\n");
}
}
}
void Uart(void) interrupt 4 using 3
{
if(RI)
{
RI=0;
Buftemp = SBUF;
switch(gudState)
{
case HEAD:
if(0x55 == Buftemp)
{
gudState = BEGIN;
}
break;
case BEGIN:
if(0xaa == Buftemp)
{
gudCount = 0;
gudState = DATA;
}
else
gudState = HEAD;
break;
case DATA:
if(gudHead >= LEN)
{
gudHead = 0;
}
gaRXBuff[gudHead++] = Buftemp;
gudCount++;
if(gudCount >= 4)
{
gudState = END;
}
break;
case END:
if(0xee == Buftemp)
{
gudRxOK标志寄存器 = 1;
}
else
{
gudRxErr = 1;
gudTail = gudHead; /* 如果有错误,数据丢弃 */
}
gudState = HEAD;
break;
default:
gudState = HEAD;
break;
}
}
}
unsigned char gudRxOK标志寄存器 = 0;
为什么代码传上去,这个变量后面成了中文?
顶农民工
代码专业,简练,功底不凡。现在的农民工,不得了啊。
gudtail&=len-1不破坏流水线,当然51没有流水线了,非2的幂可以为%=len。
俺不会串口编程的。
Send_Data 函数定义被吃掉啦?