/*
YW-201射频卡模块uart通信例程
http://www.youwokeji.com.cn
89S52
*/
#include <reg52.h>
#include <intrins.h>
unsigned char idata g_cReceiveBuffer[70]; //和上位机通讯时的缓冲区
unsigned char g_cReceiveCounter = 0; //接收到上位机的字节数
unsigned char g_cCheckSum; //串口校验
bit g_bReceived0x10Flag; //是否接收到0x10
bit g_bPackageStarted; //包接收是否开始
bit g_bReceiveOK; //正确接收到上位机指令标志
bit g_bReceivePackageStart;
/*****************************************************************************
*功能:正确执行完上位机指令,应答
*入口:
* DataLEN = 数据域长度
*注意:1、从g_cReceiveBuffer[3] 开始是应答数据块,所以调用前将所有数据写入
从g_cReceiveBuffer[3] 开始的地方
2、status是应答状态位
*****************************************************************************/
void Answer(unsigned char DataLEN, char Status)
{
unsigned char CheckSum = 0;
unsigned char i;
g_cReceiveBuffer[0] = DataLEN+4;
//g_cReceiveBuffer[1]为命令字节
g_cReceiveBuffer[2] = Status;
ES = 0;
SendByte(0x02); // 发送起始字符
for (i=0; i<DataLEN+3; i++)
{
if ((g_cReceiveBuffer[i] == 0x02) || (g_cReceiveBuffer[i] == 0x03) || (g_cReceiveBuffer[i] == 0x10))
{
SendByte(0x10);
}
SendByte(g_cReceiveBuffer[i]);
CheckSum ^= g_cReceiveBuffer[i];
}
if ((CheckSum == 0x02) || (CheckSum == 0x03) || (CheckSum == 0x10))
{
SendByte(0x10);
}
SendByte(CheckSum);
SendByte(0x03);
ES=1;
}
//发送单个字节
void SendByte(unsigned char i)
{
TI=0;
SBUF=i;
while(!TI);
TI=0;
}
/*****************************************************************************
*功能:串行中断,接收上位机数据
*说明:
g_cReceiveBuffer[0] = 长度字节
g_cReceiveBuffer[1] = 命令字节
g_cReceiveBuffer[2~(g_cReceiveCounter-2)] = 数据字节
g_cReceiveBuffer[g_cReceiveCounter-1] = 校验字节
*****************************************************************************/
void seri_int () interrupt 4 using 1
{
static unsigned char data i;
unsigned char j;
if(RI)
{
i = SBUF;
RI = 0;
if(!g_bReceiveOK) //接收该包数据
{
if((0x02 == i) && (0 == g_bReceived0x10Flag))
{
g_bPackageStarted = 1;
g_cReceiveCounter = 0;
g_cCheckSum = 0;
}
else if((0x03 == i) && (0 == g_bReceived0x10Flag) && (g_bPackageStarted)) //package end
{
g_bPackageStarted = 0;
if ((g_cReceiveCounter > 1) && (g_cReceiveCounter < sizeof(g_cReceiveBuffer)+1))
{
g_cCheckSum = 0;
for(j=0; j<g_cReceiveCounter; j++)
{
g_cCheckSum ^= g_cReceiveBuffer[j];
}
if((g_cCheckSum == 0)&&(g_cReceiveBuffer[0] == g_cReceiveCounter))
{
g_bReceiveOK = 1;
ES = 0;
}
else
{
g_bPackageStarted = 0;
g_cReceiveCounter = 0;
}
}
}
else if((0x10 == i) && (0 == g_bReceived0x10Flag))
{
g_bReceived0x10Flag = 1;
}
else if(g_bPackageStarted)
{
g_bReceived0x10Flag = 0;
if(g_cReceiveCounter < sizeof(g_cReceiveBuffer))
{
g_cReceiveBuffer[g_cReceiveCounter++] = i;
}
else
{
g_bPackageStarted = 0; //标准串口接收包起始标志
g_cReceiveCounter = 0;
g_cCheckSum = 0;
}
}
else
{
g_bReceived0x10Flag = 0;
}
}
}
}
ddd.rar_www.03ddd_www.DDD89.com
版权申诉
5 浏览量
2022-09-23
12:09:15
上传
评论
收藏 18KB RAR 举报
weixin_42651887
- 粉丝: 76
- 资源: 1万+
最新资源
- 筷手引流工具.apk
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈