📄 pc与51的快速串行通信.c
字号:
/********************************************************************
* file name: define.h
* writer: 李慧(LH)
* created: 2008-04-12
* last changed: 2008-05-22
* compiler: KeilC51 7.01
* descreption: 单片机接收PC机发送的数据帧子程序
* resource: T0,T1
*********************************************************************/
/*起始帧0x68
m_frameStatus 0x00接收
0x01地址m_addrCode
0x02控制码m_controlCode
0x03数据长度m_dataLen
0x04数据m_dataBuffer[]
0x05校验码 m_sysCheckData
0x06帧结束m_frameEnd
m_dataFieldCount//串口接收数据信息计数器
b_validFrame=0;//置数据帧无效标志
*/
#include <reg51.h>
/*****************************************************************************************
* 函数名: systeminitial
* 功能描述:系统初始化,初始化定时器1T1、串口、系统中断
* 创建时间:2008-05-12
* 修改时间:2008-05-22
******************************************************************************************/
void systeminitial(void)
{
TMOD=0x21; //T1工作在方式2,T0工作在方式0
PCON=0x00; //设置波特率参数:单倍频,数据传输速率选择
SCON=0x58; //串口工作方式1选择,并打开接收允许
ES=1; //允许串行中断
PS=1; //设置串口中断优先级为高
TH1=0x0E8; //系统选用11.0592Mhz晶振
TL1=0x0E8;
TR1=1; //启动定时器T1
EA=1; //打开总中断
}
bit b_validFrame;
unsigned char m_frameStatus;
unsigned char m_sysCheckData;//自己计算的校验数字
unsigned char m_controlCode;
unsigned char m_addrCode;
unsigned char m_dataLen;
unsigned char m_dataFieldCount;
unsigned char m_checkData;//接收来的校验数字
unsigned char m_frameEnd;
unsigned char m_dataBuffer[];
//};
//68H Address Control DataLen Datal Data2...DataN SumCheck 16??
/*****************************************************************************************
* 函数名: corn_isp
* 功能描述:串口中断服务子程序
* 创建时间:2008-05-12
* 修改时间:2008-05-22
******************************************************************************************/
void corn_isp(void) interrupt 4 using 3
{
if(RI)
{
RI=0;
if(b_validFrame)//上一个数据帧未处理完
{
return;//放弃对当前数据帧的接收
}
if(m_frameStatus==0x00) //****串口接收中断处于接收帧起始字节阶段
{
if(SBUF!=0x68)//不是有效的帧起始字节
{
m_frameStatus=0x00;//串口接收中断状态标志不更新
}
else
{
m_frameStatus=0x01;//串口接收中断状态标志更新为接收
}
}
else if(m_frameStatus==0x01) //****串口接收中断处于接收数据帧地址码阶段
{
m_addrCode=SBUF;//保存地址
m_frameStatus=0x02;//串口接收中断状态标志更新为控制码阶段
m_sysCheckData=0x00;//准备进行数据和校验
}
else if(m_frameStatus==0x02) //****串口接收中断处于接收控制码阶段
{
m_controlCode=SBUF;//保存控制码
m_frameStatus=0x03;//串口接收中断状态标志更新为接收数据长度
m_sysCheckData+=m_controlCode;//更新校验和
}
else if(m_frameStatus==0x03) //****串口接收中断处于接收数据长度信息阶段
{
m_dataLen=SBUF;
m_frameStatus=0x04;//接收数据
m_sysCheckData+=m_dataLen;
m_dataFieldCount=0x00;//串口接收数据信息计数器清零
}
else if(m_frameStatus==0x04) //****串口处于接收数据信息阶段
{
m_dataBuffer[m_dataFieldCount]=SBUF;
m_sysCheckData+=m_dataBuffer[m_dataFieldCount];
m_dataFieldCount++;
if(m_dataFieldCount==m_dataLen)
{
m_frameStatus=0x05;//数据信息接收结束,更新状态
}
}
else if(m_frameStatus==0x05) //****串口处于接收校验码阶段
{
m_checkData=SBUF;
if(m_sysCheckData != m_checkData)
{
m_frameStatus=0x00;//复位状态标志
}
else
{
m_frameStatus=0x06;//更新状态标志为接收结束码
}
}
else if(m_frameStatus==0x06) //****串口接收中断处于接收结束码阶段
{
m_frameEnd=SBUF;//保存结束码
if(m_frameEnd!=0x16)//错误的帧结束标志
{
b_validFrame=0;//置数据帧无效标志
}
else
{
b_validFrame=1;//一个数据帧接收完毕
}
m_frameStatus=0x00;//复位状标志,准备接收下一帧数据
}
}
}
void main(void)
{
systeminitial();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -