当前位置:文档之家› 51串口通信协议(新型篇)

51串口通信协议(新型篇)

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))

相关主题