51串口通信协议(新型篇)
C51编程:这是网友牛毅编的一个C51串口通讯程序!
//PC读MCU指令结构:(中断方式,ASCII码表示)
//帧:帧头标志|帧类型|器件地址|启始地址|长度n|效验和|帧尾标志
//值: 'n' 'y'| 'r' | 0x01 | x | x | x |0x13 0x10
//字节数: 2 | 1 | 1 | 1 | 1 | 1 | 2
//求和:
/////////////////////////////////////////////////////////////////////
//公司名称:***
//模块名:protocol.c
//创建者:牛毅
//修改者:
//功能描述:中断方式:本程序为mcu的串口通讯提供(贞结构)函数接口,包括具体协议部分
//其他说明:只提供对A T89c51具体硬件的可靠访问接口
//版本:1.0
//信息:QQ 75011221
/////////////////////////////////////////////////////////////////////
#include
#include
//预定义
//帧
#define F_ST1 0x6e //帧头标志n
#define F_ST2 0x79 //帧头标志y
#define F_R 0x72 //帧类型读r
#define F_W 0x77 //帧类型写w
#define F_D 0x64 //帧类型数据帧d
#define F_B 0x62 //帧类型写回应帧b
#define F_C 0x63 //帧类型重发命令帧c
#define F_Q 0x71 //帧类型放弃帧q
#define F_ADDR 0x31 //器件地址0-9
#define F_END 0x7a //帧尾标志z
#define F_SPACE 0x30 //空标志0
#define F_ERR1 0x31 //错误标志1,flagerr 1
#define F_ERR2 0x32 //错误标志2 2
//常数
#define S_MAXBUF 16 //接收/发送数据的最大缓存量
#define FIELD_MAXBUF 48 //最小场缓存,可以大于48字节,因为协议是以20字节为
#define communicationing P1_7 //正在通讯(1)标志
#define ERRFRAME_MAX 5 //连续NOFRAME_CNT次帧不正确
#define ERR_NOCNTMAX_RESEND if(++errframe_cnt<=ERRFRAME_MAX)resend_frame(); else errframe_cnt=communicationing=0;
//若超过ERRFRAME_MAX 次则令通讯停止ERR_NOCNTMAX_RESEND
//public 变量
unsigned char databuf[FIELD_MAXBUF],errframe_cnt;
//函数
/////////////////////////////////////////////////////////////////////
//函数名:send()
//功能描述:向串口发送一个字符
//函数说明:
//调用函数:
//全局变量:
//输入:ch-要发送的ASCII字符
//返回:无
//设计者:牛毅
//修改者:
//版本:
/////////////////////////////////////////////////////////////////////
void send(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
/////////////////////////////////////////////////////////////////////
//函数名:receive()
//功能描述:从串口接收一个字符
//函数说明:
//调用函数:
//全局变量:
//输入:无
//返回:一个ASCII字符
//设计者:牛毅
//修改者:
//版本:
/////////////////////////////////////////////////////////////////////
unsigned char receive(void)
{
RI=0;
return SBUF;
}
/////////////////////////////////////////////////////////////////////
//函数名:CharToHex()
//功能描述:把ASCII字符转换为16进制
//函数说明:
//调用函数:
//全局变量:
//输入:ASCII字符
//返回:16进制
//设计者:牛毅
//修改者:
//版本:
///////////////////////////////////////////////////////////////////// unsigned char CharToHex(unsigned char bChar) {
if((bChar>=0x30)&&(bChar<=0x39))
bChar -= 0x30;
else if((bChar>=0x41)&&(bChar<=0x46))//大写字母bChar -= 0x37;
else if((bChar>=0x61)&&(bChar<=0x66))//小写字母bChar -= 0x57;
else bChar = 0xff;
return bChar;
}
/////////////////////////////////////////////////////////////////////
//函数名:HexToChar()
//功能描述:把16进制转换为ASCII字符
//函数说明:
//调用函数:
//全局变量:
//输入:16进制
//返回:ASCII字符
//设计者:牛毅
//修改者:
//版本:
///////////////////////////////////////////////////////////////////// unsigned char HexToChar(unsigned char bHex) {
if((bHex>=0)&&(bHex<=9))