#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
收藏0 举报
您需要 登录 才可以下载或查看,没有账号?注册
查看全部评分
lirunze 发表于 2013-12-22 19:25 是收到的不对吗?
ningling_21 发表于 2013-12-23 14:35 这个不是可以调试的吗,单步运行不就知道了...
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
等级类勋章
发帖类勋章
4
25
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号