?? serial.lst
字號:
C51 COMPILER V6.14 SERIAL 07/15/2005 09:38:51 PAGE 1
C51 COMPILER V6.14, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN .\Serial.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\Serial.C DEBUG OBJECTEXTEND
stmt level source
1 /*********************************************************************************
2 * *
3 * FileName: Serial.c *
4 * Function: serial port functions *
5 * SystemName: NDS18000-BSC *
6 * CPU: ATMEL AT89C52 *
7 * Startup: 14/Oct/2002 *
8 * Author: XuYiBo *
9 * *
10 *********************************************************************************/
11 #include <AT89X52.H>
12 #include <intrins.h>
13
14 #include "NDSBSCUI.H"
15 #include "Serial.h"
16 #include "General.h"
17
18 #include "display.h"
19 unsigned char idata UART_TransBuffer[UARTBUFFERLEN_TX]; //串口發送緩沖區(存放要求收發信機應答的數據幀)
20 unsigned char idata UART_RcvBuffer[UARTBUFFERLEN_RX];
21
22 unsigned char idata *UARTTransHead;
23 unsigned char idata *UARTTransTail;
24 unsigned char idata *UARTTransFrame;
25 unsigned char idata *UARTRcvHead;
26 unsigned char idata *UARTRcvTail;
27 unsigned char idata *UARTRcvFrame;
28
29 unsigned char data ucAckTimeout; //應答計時器
30 unsigned char data ucRcvLen; //幀長度,不包括STX和ETX
31 unsigned char data ucRcvCheckSum; //用于計算接收到的數據幀的校驗和
32
33 unsigned char data ucNoAckCount; //重發次數
34
35 unsigned char bdata SerialFlag;
36 sbit STXRcvFlag = SerialFlag^0; //TRUE->已經接收到STX,允許降數據放入接收緩沖區
37 sbit EnableTran = SerialFlag^1; //TRUE->允許發送數據
38 sbit StopTran = SerialFlag^2; //TRUE->已經停止發送數據
39 sbit ConnectFlag= SerialFlag^3; //TRUE->和收發信機連接成功,FALSE->和收發信機連接失敗;
40
41 extern UISema xdata UISemaphore; //define in NDSBSCUI.C
42 extern UIMemory xdata UIDataArea; //define in NDSBSCUI.C
43
44 unsigned char code ucACK[]= {STX,ACK_FRAME,ETX,0};
45 unsigned char code ucNAK[]= {STX,NAK_FRAME,ETX,0};
46 unsigned char code ucREQ[]= {STX,REQ_FRAME,ETX,0};
47 unsigned char code ucUpfreq[]= {STX,COMM_FRAME,UPFREQ_COMM,0};
48 unsigned char code ucDwnfreq[]= {STX,COMM_FRAME,DWNFREQ_COMM,0};
49 /******************************************************************************
50 * *
51 * Initialize serial receive&transfer function *
52 * *
53 ******************************************************************************/
54 void InitSerial(void)
55 {
C51 COMPILER V6.14 SERIAL 07/15/2005 09:38:51 PAGE 2
56 1 UARTTransHead = UART_TransBuffer;
57 1 UARTTransTail = UART_TransBuffer;
58 1 UARTTransFrame = UART_TransBuffer;
59 1 UARTRcvHead = UART_RcvBuffer;
60 1 UARTRcvTail = UART_RcvBuffer;
61 1 UARTRcvFrame = UART_RcvBuffer;
62 1
63 1 ucAckTimeout = 0;
64 1 ucRcvLen = 0;
65 1 ucRcvCheckSum = 0;
66 1 ucNoAckCount = 0;
67 1
68 1 STXRcvFlag = FALSE;
69 1 EnableTran = TRUE;
70 1 StopTran = TRUE;
71 1 ConnectFlag = FALSE;
72 1 }
73
74 /******************************************************************************
75 * *
76 * serial port interrupt handle *
77 * *
78 ******************************************************************************/
79 void UART(void) interrupt UARTINT using 1
80 {
81 1 unsigned char ucByte;
82 1 unsigned char idata *TmpPtr;
83 1
84 1 if(RI)
85 1 {
86 2 ucByte = SBUF;
87 2 RI = 0;
88 2 if( ucByte == STX)
89 2 {
90 3 STXRcvFlag = TRUE;
91 3 UARTRcvFrame = UARTRcvTail;
92 3 *(UARTRcvTail++) = ucByte;
93 3 if(UARTRcvTail == UART_RcvBuffer+UARTBUFFERLEN_RX)
94 3 {
95 4 UARTRcvTail = UART_RcvBuffer;
96 4 }
97 3 }
98 2 else if( STXRcvFlag == TRUE)
99 2 {//已經收到STX
100 3 *(UARTRcvTail++) = ucByte;
101 3 if(UARTRcvTail == UART_RcvBuffer+UARTBUFFERLEN_RX)
102 3 {
103 4 UARTRcvTail = UART_RcvBuffer;
104 4 }
105 3 if(ucByte==ETX)
106 3 {//收完一個幀
107 4 STXRcvFlag = FALSE; //重新搜索STX
108 4 }
109 3 }
110 2 }
111 1 if(TI)
112 1 {
113 2 TI = 0;
114 2 if(EnableTran==TRUE)
115 2 {
116 3 if(UARTTransHead != UARTTransTail)
117 3 {
C51 COMPILER V6.14 SERIAL 07/15/2005 09:38:51 PAGE 3
118 4 SBUF = *UARTTransHead;
119 4 if( *UARTTransHead == STX)
120 4 {
121 5 UARTTransFrame = UARTTransHead;
122 5 }
123 4 else if( *UARTTransHead == ETX)
124 4 {
125 5 TmpPtr = UARTTransFrame;
126 5 if(++TmpPtr == UART_TransBuffer+UARTBUFFERLEN_TX)
127 5 {
128 6 TmpPtr = UART_TransBuffer;
129 6 }
130 5 if( (*TmpPtr == COMM_FRAME) || (*TmpPtr == REQ_FRAME) )
131 5 {//等待收發信機應答.除命令幀(COMM_FRAME)和REQ幀要求收發信機應答外,其它幀不要求收發信機應答
132 6 EnableTran = FALSE;
133 6 StopTran = TRUE;
134 6 ucAckTimeout= 30;
135 6 }
136 5 }
137 4 if(++UARTTransHead == UART_TransBuffer+UARTBUFFERLEN_TX)
138 4 {
139 5 UARTTransHead = UART_TransBuffer;
140 5 }
141 4 }
142 3 else
143 3 {//transfer buffer empty
144 4 StopTran = TRUE;
145 4 }
146 3 }
147 2 }
148 1 }
149
150 /******************************************************************************
151 * *
152 * write data to transfer buffer *
153 * *
154 ******************************************************************************/
155
156 void WriteSerial(unsigned char code *pstr_Sour,unsigned char uclen)
157 {
158 1 unsigned char ucCanWrite;
159 1 unsigned char idata *TransPtr;
160 1
161 1 if(uclen==0) return;
162 1
163 1 TransPtr = UARTTransTail;
164 1 if( UARTTransFrame > TransPtr)
165 1 {
166 2 ucCanWrite = UARTTransFrame - TransPtr;
167 2 }
168 1 else
169 1 {
170 2 ucCanWrite = UARTBUFFERLEN_TX - (TransPtr - UARTTransFrame);
171 2 }
172 1
173 1 if( ucCanWrite != 0)
174 1 {
175 2 if(ucCanWrite > uclen)
176 2 {
177 3 ucCanWrite = uclen;
178 3 }
179 2 if(TransPtr + ucCanWrite > UART_TransBuffer + UARTBUFFERLEN_TX)
C51 COMPILER V6.14 SERIAL 07/15/2005 09:38:51 PAGE 4
180 2 {
181 3 while( TransPtr != UART_TransBuffer + UARTBUFFERLEN_TX)
182 3 {
183 4 *(TransPtr++) = *(pstr_Sour++);
184 4 ucCanWrite--;
185 4 }
186 3 TransPtr = UART_TransBuffer;
187 3 for(;ucCanWrite!=0;ucCanWrite--)
188 3 {
189 4 *(TransPtr++) = *(pstr_Sour++);
190 4 }
191 3 }
192 2 else
193 2 {
194 3 for(;ucCanWrite!=0;ucCanWrite--)
195 3 {
196 4 *(TransPtr++) = *(pstr_Sour++);
197 4 }
198 3 }
199 2 if(TransPtr == UART_TransBuffer+UARTBUFFERLEN_TX)
200 2 {
201 3 TransPtr = UART_TransBuffer;
202 3 }
203 2 UARTTransTail = TransPtr;
204 2 }
205 1 }
206
207 /******************************************************************************
208 * *
209 * write a byte to transfer buffer *
210 * *
211 ******************************************************************************/
212
213 void WriteSerialByte(unsigned char ucByte)
214 {
215 1 unsigned char idata *TransPtr;
216 1 TransPtr = UARTTransTail;
217 1 *TransPtr = ucByte;
218 1 if(++TransPtr == UART_TransBuffer+UARTBUFFERLEN_TX)
219 1 {
220 2 TransPtr = UART_TransBuffer;
221 2 }
222 1 UARTTransTail = TransPtr;
223 1 }
224 /******************************************************************************
225 * *
226 * timer2 interrupt handle *
227 * *
228 ******************************************************************************/
229 void Timer2(void) interrupt TIMER2INT using 1
230 {
231 1 unsigned char data ucTmp;
232 1 if( ucAckTimeout != 0)
233 1 {
234 2 if( --ucAckTimeout ==0 )
235 2 {//timeout
236 3 EnableTran = TRUE;
237 3 if( ++ucNoAckCount < MAX_REP)
238 3 {
239 4 UARTTransHead = UARTTransFrame;
240 4 StopTran = FALSE;
241 4 TI = 1;
C51 COMPILER V6.14 SERIAL 07/15/2005 09:38:51 PAGE 5
242 4 }
243 3 else
244 3 {//重發次數超過“最大允許重發次數”
245 4 ucTmp = 255;
246 4 while( --ucTmp )
247 4 {
248 5 UISemaphore.ucExamAreaSem = 0x00; //request semaphore
249 5 if( UISemaphore.ucExamAreaSem == 0x00)
250 5 {
251 6 UIDataArea.Exam_Buffer.ConnectFlag = FALSE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -