📄 freescale
字号:
#include "Recv_Tran.h"
#include "Uart.h"
#define RECFRMMAXLEN 0x10 //接收帧的最大长度,超过此值认为帧超长错误
#define STATUSMAXLEN 0x0A //设备状态信息最大长度
unsigned char DevNo; //设备号
unsigned char StatusBuf[STATUSMAXLEN]; //设备状态信息缓冲区
//接收数据帧函数,实际上接收的是主机的指令
uchar Recv_Data(uchar *type)
{
uchar tmp,rCount,i;
uchar r_buf[RECFRMMAXLEN]; //保存接收到的帧
uchar Flag_ReceOver; //一帧接收结束标志
uchar Flag_StartRec; //一帧开始接收标志
uchar CheckSum; //校验和
uchar DataLen; //数据字节长度变量
Uart_Ctrl_ClrVal(); //禁止发送,允许接收
//接收一帧数据
rCount = 0;
Flag_StartRec = 0;
Flag_ReceOver = 0;
while(!Flag_ReceOver)
{
Uart_RecvChar(&tmp);
if((!Flag_StartRec) && (tmp == 0x24)) //判断是否接收到字符“$”
{
Flag_StartRec = 1;
}
if(Flag_StartRec)
{
r_buf[rCount] = tmp;
rCount++;
if(tmp == 0x2A) //判断是否接收到字符“*”
{
Flag_ReceOver = 1;
}
}
if(rCount == RECFRMMAXLEN) //帧超长错误,返回0
{
return 0;
}
}
CheckSum = 0; //计算校验和字节
DataLen = r_buf[3];
for(i=0; i++; i<3+DataLen)
{
CheckSum +=r_buf[i+1];
}
if(rCount < 6) //帧过短错误,返回0,最短的指令帧为6个字节
return 0;
if(r_buf[1] = DevNo) //地址不符合错误,返回0
return 0;
if(r_buf[rCount -2] != CheckSum) //校验错误,返回0
return 0;
*type = r_buf[2]; //获取指令类型
return 1; //成功,返回1
}
//发送数据函数,包括发送指令和发送设备状态信息
void Send_Data(uchar type, uchar len, uchar *buf)
{
uchar i,tmp;
uchar CheckSum = 0;
Uart_Ctrl_SetVal(); //允许发送,禁止接收
tmp = 0x24;
Uart_SendChar(tmp); //发送帧起始字节
Uart_SendChar(DevNo); //发送地址字节,也即设备号
CheckSum +=DevNo;
Uart_SendChar(type); //发送类型字节
CheckSum +=type;
Uart_SendChar(len); //发送数据长度字节
CheckSum +=len;
for(i=0; i<len; i++) //发送数据
{
Uart_SendChar(*buf);
CheckSum +=*buf;
*buf++;
}
Uart_SendChar(CheckSum);
tmp = 0x2A;
Uart_SendChar(tmp); //发送帧结束字节
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -