|
80黑币
STC8A单片机通过串口写入数据存到EEPROM,两条命令单独运行正常,一起运行有一条能运行
CF 01 04 FD这条命令执行不了
单片机源程序如下:
- #include "Uart.h"
- bit busy; //判忙标志
- uchar idata SinBuf[20]; //接收缓冲区
- uint SinP; //接收指针
- uchar idata SoutBuf[20]; //发送缓冲区
- uint SoutP; //发送指针
- uchar Send_OK,Sin_OK; //发送完成标志
- U32 Ul_Value,RXDATA,ADDR_485; //超声波值
- /**************************************初始化串口********************************************/
- void UartInit(void)
- {
- SCON = 0x50;
- T2L = BRT;
- T2H = BRT >> 8;
- AUXR = 0x15;
- busy = 0;
- ES = 1;
- EA = 1;
- }
- /**************************************串口服务函数*******************************************/
- void ReceiveChar (void) interrupt 4 using 3
- {
- uchar ch;
- uchar idata Start=0xCF;//帧头;
- uchar idata End=0xFD;//帧尾;
- static bit bReceiveAdr= 0; //接收地址标志
- uchar ucharAdr;//存放地址;
- static bit bReceiveCmd= 0; //接收命令标志
- uchar ucharCmd; //存放命令;
- static bit bReceiveEnd=0;//接收帧尾标志;
- bit bReceiveComplete=0; //收到一个完整的数据包(导引头+地址+数据+帧尾)例:CF 00 04 FD
- //*********************
- if (RI)
- {
- ES = 0;
- RI = 0;
- ch=SBUF;
-
- SinBuf[SinP]=ch;
- SinP= SinP+1;
- SW_Ctrl = 0;
- if(ch==Start)//如果收到帧头;
- {
- bReceiveAdr=1;//接收地址标志1,准备接收地址;
- bReceiveComplete=0;// 完整帧数据包状态为0;
-
- }
- else if(bReceiveAdr==1)//开始接收地址
- { ucharAdr=SinBuf[2];
- bReceiveAdr=0;//清除地址标志;
- bReceiveCmd=1;//准备接收命令;
- }
- else if(bReceiveCmd==1)//开始接收命令;
- { ucharCmd=ch;
- bReceiveCmd=0;
- bReceiveEnd=1;
- }
- else if(bReceiveEnd ==1 &&(SinBuf[3]==End))//如果帧尾是End;//就代表一帧数据包完成;
- { bReceiveComplete=1;
- }
- else//收到干扰;
- {
- bReceiveAdr=0;
- bReceiveCmd=0;
- bReceiveEnd=0;
- bReceiveComplete=0;
- //ucharAdr=0;
- }
- if(bReceiveComplete ==1)//如果有完整的数据包;
- {
- if(SinBuf[2]==0x04)//查询 //如果是查询命令,就把对应的地址位的值取回来,按格式发回上位机;
- {
-
- CommandType();
- SinP= 0;
- Sin_OK = 1;
-
-
- }
-
- }
- if (SinBuf[0] != 0x06 )
- {
- SinP= 0;
- SinBuf[1] = 0;
- }
- if ((SinP == 8)&& (SinBuf[3] == 0x00))//修改这行可更换寄存器地址
- {
- SinP= 0;
- Send_OK = 1;
- //return;
- }
- ES = 1;
- }
-
- if (TI)//发送----------------
- {
- ES = 0;
- TI = 0;
- if (SoutP < 7)
- {
- SBUF = SoutBuf[SoutP];
- SoutP= SoutP+ 1;
- }
- }
- else
- {
- SW_Ctrl = 0;
- SoutP=1;//发送指针归零
-
- }
-
- ES = 1;
- }//发送
- /**************************************发送03号指令*******************************************/
- void Respond03(void)
- {
- unsigned int x;
- unsigned int i ;
- SoutBuf[0] = 0x06;//
- SoutBuf[1] = 0x03;//A型号:01,B型号:02
- SoutBuf[2] = 0x02;
- SoutBuf[3] = ((Ul_Value & 0xFF00)>>8);
- SoutBuf[4] = (Ul_Value & 0x00FF);
- x = 0xffff;
- for (i = 0;i<5 ; i++)
- x = CRC_modbus_rtu(x,SoutBuf[i]);
- SoutBuf[5] = (x & 0x00FF);
- SoutBuf[6] = ((x & 0xFF00)>>8);
- SoutP = 1;
- SW_Ctrl = 1;
- SBUF = 0x06;//启动中断发送
- }
- /*-------------------------------------------------------------
- 调用方式:void CommandType(void)
- 函数说明:
- ---------------------------------------------------------------*/
- void CommandType(void)
- {
- // uchar CommandLong;
- // CommandLong = SinBuf[1];
- // if (SinBuf[0] != 0xCF)
- // return;
- // if (SinBuf[CommandLong - 1] != 0xFD)
- // return;
- switch (SinBuf[1])
- {
- case 0x01://采集器发送请求
- {
- RXDATA = 0x01;
- IapErase(0x0400); //擦除0400扇区数据
- IapProgram(0x0400, RXDATA); //在0400写入数据
- break;
- }
- case 0x02:
- {
- RXDATA = 0x02;
- IapErase(0x0400); //擦除0400扇区数据
- IapProgram(0x0400, RXDATA); //在0400写入数据
- break;
- }
- case 0x03:
- {
- RXDATA = 0x03;
- IapErase(0x0400); //擦除0400扇区数据
- IapProgram(0x0400, RXDATA); //在0400写入数据
- break;
- } case 0x04:
- {
- RXDATA = 0x04;
- IapErase(0x0400); //擦除0400扇区数据
- IapProgram(0x0400, RXDATA); //在0400写入数据
- break;
- } case 0x05:
- {
- RXDATA = 0x05;
- IapErase(0x0400); //擦除0400扇区数据
- IapProgram(0x0400, RXDATA); //在0400写入数据
- break;
- } case 0x06:
- {
- RXDATA = 0x06;
- IapErase(0x0400); //擦除0400扇区数据
- IapProgram(0x0400, RXDATA); //在0400写入数据
- break;
- } case 0x07:
- {
- RXDATA = 0x07;
- IapErase(0x0400); //擦除0400扇区数据
- IapProgram(0x0400, RXDATA); //在0400写入数据
- break;
- } case 0x08:
- {
- RXDATA = 0x08;
- IapErase(0x0400); //擦除0400扇区数据
- IapProgram(0x0400, RXDATA); //在0400写入数据
- break;
- } case 0x09:
- {
- RXDATA = 0x09;
- IapErase(0x0400); //擦除0400扇区数据
- IapProgram(0x0400, RXDATA); //在0400写入数据
- break;
- } case 0x0A:
- {
- RXDATA = 0x0A;
- IapErase(0x0400); //擦除0400扇区数据
- IapProgram(0x0400, RXDATA); //在0400写入数据
- break;
- }
- }
- }
- void Respond01(void)
- {
- ADDR_485 = RXDATA;
- SoutBuf[0] = 0xCF;//
- SoutBuf[1] = ADDR_485;//A型号:01,B型号:02
- SoutBuf[2] = 0x04;
- SoutBuf[3] = 0xFD;
- SoutP = 1;
- SW_Ctrl = 1;
- SBUF = 0xCF;//启动中断发送
- }
- void Respond02(void)
- {
- SoutBuf[0] = 0xCF;//
- SoutBuf[1] = ADDR_485;//A型号:01,B型号:02
- SoutBuf[2] = 0x04;
- SoutBuf[3] = 0xFD;
- SoutP = 1;
- SW_Ctrl = 1;
- SBUF = 0xCF;//启动中断发送
- }
复制代码 |
|