|
80黑幣
STC8A單片機(jī)通過串口寫入數(shù)據(jù)存到EEPROM,兩條命令單獨(dú)運(yùn)行正常,一起運(yùn)行有一條能運(yùn)行
CF 01 04 FD這條命令執(zhí)行不了
單片機(jī)源程序如下:
- #include "Uart.h"
- bit busy; //判忙標(biāo)志
- uchar idata SinBuf[20]; //接收緩沖區(qū)
- uint SinP; //接收指針
- uchar idata SoutBuf[20]; //發(fā)送緩沖區(qū)
- uint SoutP; //發(fā)送指針
- uchar Send_OK,Sin_OK; //發(fā)送完成標(biāo)志
- U32 Ul_Value,RXDATA,ADDR_485; //超聲波值
- /**************************************初始化串口********************************************/
- void UartInit(void)
- {
- SCON = 0x50;
- T2L = BRT;
- T2H = BRT >> 8;
- AUXR = 0x15;
- busy = 0;
- ES = 1;
- EA = 1;
- }
- /**************************************串口服務(wù)函數(shù)*******************************************/
- void ReceiveChar (void) interrupt 4 using 3
- {
- uchar ch;
- uchar idata Start=0xCF;//幀頭;
- uchar idata End=0xFD;//幀尾;
- static bit bReceiveAdr= 0; //接收地址標(biāo)志
- uchar ucharAdr;//存放地址;
- static bit bReceiveCmd= 0; //接收命令標(biāo)志
- uchar ucharCmd; //存放命令;
- static bit bReceiveEnd=0;//接收幀尾標(biāo)志;
- bit bReceiveComplete=0; //收到一個(gè)完整的數(shù)據(jù)包(導(dǎo)引頭+地址+數(shù)據(jù)+幀尾)例: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;//接收地址標(biāo)志1,準(zhǔn)備接收地址;
- bReceiveComplete=0;// 完整幀數(shù)據(jù)包狀態(tài)為0;
-
- }
- else if(bReceiveAdr==1)//開始接收地址
- { ucharAdr=SinBuf[2];
- bReceiveAdr=0;//清除地址標(biāo)志;
- bReceiveCmd=1;//準(zhǔn)備接收命令;
- }
- else if(bReceiveCmd==1)//開始接收命令;
- { ucharCmd=ch;
- bReceiveCmd=0;
- bReceiveEnd=1;
- }
- else if(bReceiveEnd ==1 &&(SinBuf[3]==End))//如果幀尾是End;//就代表一幀數(shù)據(jù)包完成;
- { bReceiveComplete=1;
- }
- else//收到干擾;
- {
- bReceiveAdr=0;
- bReceiveCmd=0;
- bReceiveEnd=0;
- bReceiveComplete=0;
- //ucharAdr=0;
- }
- if(bReceiveComplete ==1)//如果有完整的數(shù)據(jù)包;
- {
- if(SinBuf[2]==0x04)//查詢 //如果是查詢命令,就把對(duì)應(yīng)的地址位的值取回來,按格式發(fā)回上位機(jī);
- {
-
- 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)//發(fā)送----------------
- {
- ES = 0;
- TI = 0;
- if (SoutP < 7)
- {
- SBUF = SoutBuf[SoutP];
- SoutP= SoutP+ 1;
- }
- }
- else
- {
- SW_Ctrl = 0;
- SoutP=1;//發(fā)送指針歸零
-
- }
-
- ES = 1;
- }//發(fā)送
- /**************************************發(fā)送03號(hào)指令*******************************************/
- void Respond03(void)
- {
- unsigned int x;
- unsigned int i ;
- SoutBuf[0] = 0x06;//
- SoutBuf[1] = 0x03;//A型號(hào):01,B型號(hào):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;//啟動(dòng)中斷發(fā)送
- }
- /*-------------------------------------------------------------
- 調(diào)用方式:void CommandType(void)
- 函數(shù)說明:
- ---------------------------------------------------------------*/
- void CommandType(void)
- {
- // uchar CommandLong;
- // CommandLong = SinBuf[1];
- // if (SinBuf[0] != 0xCF)
- // return;
- // if (SinBuf[CommandLong - 1] != 0xFD)
- // return;
- switch (SinBuf[1])
- {
- case 0x01://采集器發(fā)送請(qǐng)求
- {
- RXDATA = 0x01;
- IapErase(0x0400); //擦除0400扇區(qū)數(shù)據(jù)
- IapProgram(0x0400, RXDATA); //在0400寫入數(shù)據(jù)
- break;
- }
- case 0x02:
- {
- RXDATA = 0x02;
- IapErase(0x0400); //擦除0400扇區(qū)數(shù)據(jù)
- IapProgram(0x0400, RXDATA); //在0400寫入數(shù)據(jù)
- break;
- }
- case 0x03:
- {
- RXDATA = 0x03;
- IapErase(0x0400); //擦除0400扇區(qū)數(shù)據(jù)
- IapProgram(0x0400, RXDATA); //在0400寫入數(shù)據(jù)
- break;
- } case 0x04:
- {
- RXDATA = 0x04;
- IapErase(0x0400); //擦除0400扇區(qū)數(shù)據(jù)
- IapProgram(0x0400, RXDATA); //在0400寫入數(shù)據(jù)
- break;
- } case 0x05:
- {
- RXDATA = 0x05;
- IapErase(0x0400); //擦除0400扇區(qū)數(shù)據(jù)
- IapProgram(0x0400, RXDATA); //在0400寫入數(shù)據(jù)
- break;
- } case 0x06:
- {
- RXDATA = 0x06;
- IapErase(0x0400); //擦除0400扇區(qū)數(shù)據(jù)
- IapProgram(0x0400, RXDATA); //在0400寫入數(shù)據(jù)
- break;
- } case 0x07:
- {
- RXDATA = 0x07;
- IapErase(0x0400); //擦除0400扇區(qū)數(shù)據(jù)
- IapProgram(0x0400, RXDATA); //在0400寫入數(shù)據(jù)
- break;
- } case 0x08:
- {
- RXDATA = 0x08;
- IapErase(0x0400); //擦除0400扇區(qū)數(shù)據(jù)
- IapProgram(0x0400, RXDATA); //在0400寫入數(shù)據(jù)
- break;
- } case 0x09:
- {
- RXDATA = 0x09;
- IapErase(0x0400); //擦除0400扇區(qū)數(shù)據(jù)
- IapProgram(0x0400, RXDATA); //在0400寫入數(shù)據(jù)
- break;
- } case 0x0A:
- {
- RXDATA = 0x0A;
- IapErase(0x0400); //擦除0400扇區(qū)數(shù)據(jù)
- IapProgram(0x0400, RXDATA); //在0400寫入數(shù)據(jù)
- break;
- }
- }
- }
- void Respond01(void)
- {
- ADDR_485 = RXDATA;
- SoutBuf[0] = 0xCF;//
- SoutBuf[1] = ADDR_485;//A型號(hào):01,B型號(hào):02
- SoutBuf[2] = 0x04;
- SoutBuf[3] = 0xFD;
- SoutP = 1;
- SW_Ctrl = 1;
- SBUF = 0xCF;//啟動(dòng)中斷發(fā)送
- }
- void Respond02(void)
- {
- SoutBuf[0] = 0xCF;//
- SoutBuf[1] = ADDR_485;//A型號(hào):01,B型號(hào):02
- SoutBuf[2] = 0x04;
- SoutBuf[3] = 0xFD;
- SoutP = 1;
- SW_Ctrl = 1;
- SBUF = 0xCF;//啟動(dòng)中斷發(fā)送
- }
復(fù)制代碼 |
-
3.png
(32.07 KB, 下載次數(shù): 66)
下載附件
2020-9-20 22:34 上傳
-
4.png
(14.46 KB, 下載次數(shù): 61)
下載附件
2020-9-20 22:34 上傳
-
2.png
(59.74 KB, 下載次數(shù): 71)
下載附件
2020-9-20 22:34 上傳
-
1.png
(50.81 KB, 下載次數(shù): 89)
下載附件
2020-9-20 22:34 上傳
-
-
Uart.rar
2020-9-20 22:31 上傳
點(diǎn)擊文件名下載附件
2.16 KB, 下載次數(shù): 10
串口部分
|