#include <C8051F040.h>
#include <stdio.h>
#include "macroandconst.h"
#define SYSCLK 22118400L
#define BAUDRATE 9600 // 波特率9600
#define ID 0x01 //单片机地址
sfr16 RCAP2 = 0xCA; // 定时器2
sfr16 TMR2 = 0xCC;
uint8 state_flag=0; //通信协议解析状态标志,初始化为0
uint8 retval; //通信协议解析函数返回值,初始化为0
uint8 cmd; //指令码
uint8 Data[5]; //数据码
uint8 data_count; //数据长度码
uint8 rec_data;
bit busy; //串口发送完成标志位
void SendString(uchar *s,uchar as); //串口字符串发送
void UART0_Init (void); //串口0 初始化
void TxSend(uchar d); //串口字符发送
void jiexi();
void s_miao();
//////////////////////////////////
void s_miao()
{
uchar sendcmd; //下位机向PC发送的命令码
switch (retval)
{
case 1: //数据发送错误,请求PC重发
{
sendcmd=2; //向PC发送的重发数据命令,PC识**向下位机重发数据包。
TxSend(0xce);
TxSend(0x00);
retval=0; //标志清零,防止重复扫描,重复执行。 2013/9/24
break;
}
case 2: //数据发送成功,执行命令
{
switch (cmd) //命令解码
{
case 0x01:
{
SendString(Data,5);
cmd=0x00;
break;
}
case 0x02:
{
TxSend(0xed);
cmd=0x00;
break;
}
case 0x03:
{
TxSend(0xed);
cmd=0x00;
break;
}
}
}
retval=0; //标志清零,防止重复扫描,重复执行。
}
}
/////////////////////////////////////////
void jiexi()
{
switch (state_flag)
{
case 0:
{
if(rec_data == 0x2A) // 是否帧头第一个数据
state_flag = 1;
else
state_flag = 0; // 标志复位
break;
}
case 1:
{
if(rec_data == ID) // 判断目的地址是否正确
{
state_flag = 2;
}
else
state_flag = 0; // 标志复位
break;
}
case 2:
{
state_flag = 3;
Data[0]=rec_data; //指令码存储
break;
}
case 3:
{
Data[1]=rec_data;
state_flag=4;
break;
}
case 4:
{
Data[2]=rec_data;
state_flag=5;
break;
}
case 5:
{
Data[3]=rec_data;
state_flag=6;
break;
}
case 6:
{ Data[4]=rec_data;
if (rec_data==0x0D)
{
retval=2; //置接收成功标志,数据包传送成功。
state_flag=0;
}
else
state_flag=0;
break;
}
}
}
////////////////////////////////////////////////
void UART0_Interrupt (void) interrupt 4
{
//uchar se_data; //串口接收缓存
if (RI0 == 1)
{
RI0= 0; //清除接收完成标
rec_data=SBUF0;
jiexi();
}
if (TI0 == 1)
{
TI0 = 0;
busy = 0;
}
}
/////////////////////////////////////////////////////////
void UART0_Init (void)
{
uchar SFRPAGE_SAVE;
SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = TMR2_PAGE;
TMR2CN = 0x00;
TMR2CF = 0x08;
RCAP2 = - ((long) SYSCLK/BAUDRATE/16);
TMR2 = RCAP2;
TR2= 1;
SFRPAGE = UART0_PAGE;
SCON0 = 0x50;
SSTA0 = 0x15;
ES0 = 1;
IP |= 0x10;
SFRPAGE = SFRPAGE_SAVE;
}
///////////////////////////////////////////////////////////
void TxSend(uchar d)
{
SFRPAGE = UART0_PAGE;
while (busy); //等待上个数据发送完成
busy = 1;
SBUF0 = d; //发送数据
}
////////////////////////
void SendString(uchar *s,uchar as)
{
while (as) //判断字符串结束标志
{ as--;
TxSend(*s++); //发送字符
}
}
/////////////////////////////
C:\Users\Administrator\Desktop
为啥 串口助手发送2A 01 01 01 00 2A 0D 总是会回复相同的呢 ? 这才是我想要的回复的数据 01 01 00 2A 0D |