📄 mmm.lst
字号:
234 1 else
235 1 {
236 2 TI_1=0;
237 2
C51 COMPILER V7.05 MMM 01/30/2003 18:32:34 PAGE 5
238 2 }
239 1 }
240 /****************************************************************************
241 * *
242 * Function: isr_UART *
243 * *
244 * Input: - *
245 * Output: - *
246 * *
247 * Description: *
248 ****************************************************************************/
249 void isr_UART(void) interrupt 4 using 2
250 {
251 1 unsigned char c , oldRecvState , i , bcc;
252 1
253 1 // WatchDog();
254 1
255 1 if ( RI ) // Receive Command
256 1 {
257 2 TR0 = 0 ; //stop t0
258 2 c = SBUF;
259 2 RI = 0;
260 2 if (RecvReady)
261 2 {
262 3 SendReady = FALSE;
263 3 oldRecvState = RecvState;
264 3 RecvState = RECV_STX;
265 3
266 3
267 3 switch (oldRecvState)
268 3 {
269 4 case RECV_STX: // Receive STX and answer DLE
270 4 if (c == STX)
271 4 {
272 5 RecvState = RECV_ADDR0;
273 5 START_T0(T_533_ms);
274 5 }
275 4 else
276 4 {
277 5 CALL_isr_T0() ;
278 5 };
279 4 break;
280 4
281 4 case RECV_ADDR0:
282 4 if (c == ADDR)//0xd2)//MeterNum.chrX[3])
283 4 {
284 5 RecvState = RECV_ADDR1;
285 5 START_T0(T_533_ms);
286 5 }
287 4 else
288 4 {
289 5 CALL_isr_T0() ;
290 5 };
291 4 break;
292 4 case RECV_ADDR1:
293 4 if (c == 0x02)//MeterNum.chrX[2])
294 4 {
295 5 RecvState = RECV_ADDR2;
296 5 START_T0(T_533_ms);
297 5 }
298 4 else
299 4 {
C51 COMPILER V7.05 MMM 01/30/2003 18:32:34 PAGE 6
300 5 CALL_isr_T0() ;
301 5 };
302 4 break;
303 4 case RECV_ADDR2:
304 4 if (c == 0x96)//MeterNum.chrX[1])
305 4 {
306 5 RecvState = RECV_ADDR3;
307 5 START_T0(T_533_ms);
308 5 }
309 4 else
310 4 {
311 5 CALL_isr_T0() ;
312 5 };
313 4 break;
314 4
315 4 case RECV_ADDR3:
316 4 if (c ==0x49) //MeterNum.chrX[0])
317 4 {
318 5 // LED_RED = ~LED_RED;
319 5 En485 = SEND;
320 5 //Ir_En = SEND;
321 5 SBUF = DLE ;
322 5 RecvState = RECV_DATA_DLE_ETX;
323 5 DataDleReceived = FALSE;
324 5 Index = 0;
325 5 Cmdok = FALSE;
326 5
327 5 while( !TI );
328 5 TI = FALSE;
329 5 En485 = RECV;
330 5 //Ir_En = RECV;
331 5 START_T0(T_533_ms);
332 5 }
333 4 else
334 4 {
335 5 CALL_isr_T0() ;
336 5 };
337 4 break;
338 4
339 4 case RECV_DATA_DLE_ETX:// Receive data,DEL,ETX and answer DLE
340 4 if (c == DLE)
341 4 {
342 5 if (!DataDleReceived) //如果上一个不是DLE 丢掉
343 5 {
344 6 DataDleReceived = TRUE;
345 6 RecvState = RECV_DATA_DLE_ETX;
346 6 START_T0(T_533_ms);
347 6 break;
348 6 }
349 5 else //如果上一个是DLE
350 5 {
351 6 DataDleReceived = FALSE; //留下
352 6 };
353 5 }
354 4 else if (c == ETX)
355 4 {
356 5 if (DataDleReceived) //如果是结束标记 处理
357 5 {
358 6 DataDleReceived = FALSE;
359 6
360 6 bcc = 0;
361 6 for (i = 0; i < Index; i++)
C51 COMPILER V7.05 MMM 01/30/2003 18:32:34 PAGE 7
362 6 {
363 7 bcc ^= SerBuffer[i];
364 7 } ;
365 6
366 6 if( bcc == 0)
367 6 { En485 = SEND;
368 7 //Ir_En = SEND;
369 7 Cmdok = TRUE;
370 7 SBUF = DLE ;
371 7 while( !TI );
372 7 TI = FALSE;
373 7 En485 = RECV;
374 7 //LED_RED = ~LED_RED;
375 7 //Ir_En = RECV;
376 7 }
377 6 else
378 6 { En485 = SEND;
379 7 //Ir_En = SEND;
380 7 Cmdok = FALSE;
381 7 SBUF = NAK ;
382 7 while( !TI );
383 7 TI = FALSE;
384 7 En485 = RECV;
385 7 //Ir_En = RECV;
386 7 };
387 6 RecvState=RECV_STX;
388 6 break;
389 6 }
390 5 else
391 5 {
392 6 DataDleReceived = FALSE; //如果不是结束标记 留下
393 6 };
394 5 };
395 4
396 4 if (Index < SERBUFLEN) //将数据写入SerBuffer[]
397 4 {
398 5 SerBuffer[Index++] = c;
399 5 };
400 4 RecvState = RECV_DATA_DLE_ETX;
401 4 START_T0(T_533_ms);
402 4 break;
403 4
404 4 case RECV_DLE: //Recieve answer from HOST
405 4 if ( c == DLE)
406 4 {
407 5 En485 = SEND;
408 5 //Ir_En = SEND;
409 5 for (i = 0; i < (3 + SerBuffer[2] +1); i++) //send data
410 5 {
411 6 SBUF = SerBuffer[i];
412 6 while (!TI);
413 6 TI = FALSE;
414 6 if ( SerBuffer[i] == DLE ) //send DLE two
415 6 {
416 7 SBUF = DLE;
417 7 while (!TI);
418 7 TI = FALSE;
419 7 };
420 6 };
421 5
422 5 SBUF = DLE; //send END
423 5 while (!TI);
C51 COMPILER V7.05 MMM 01/30/2003 18:32:34 PAGE 8
424 5 TI = FALSE;
425 5
426 5 SBUF = ETX;
427 5 while (!TI);
428 5 TI = FALSE;
429 5 RecvState = RECV_DLE_OR_NAK ;
430 5 START_T0(T_533_ms);
431 5 En485 = RECV;
432 5 //Ir_En = RECV;
433 5 }
434 4 else
435 4 {
436 5 CALL_isr_T0() ;
437 5 };
438 4 break;
439 4
440 4 case RECV_DLE_OR_NAK: //Recieve answer from HOST
441 4 if ( c == DLE)
442 4 {
443 5 SendOk = TRUE;
444 5 SendReady = FALSE;
445 5 RecvReady = TRUE;
446 5 RecvState = RECV_STX;
447 5 }
448 4 else
449 4 {
450 5 SendOk = FALSE;
451 5 SendReady = TRUE;
452 5 RecvReady = FALSE;
453 5 CALL_isr_T0() ;
454 5 };
455 4 En485 = RECV;
456 4 //Ir_En = RECV;
457 4 break;
458 4
459 4 default:
460 4 CALL_isr_T0() ;
461 4 break;
462 4
463 4 };//end of case
464 3 } //end of if(RecvReady)
465 2 };//end of if(RI)
466 1
467 1
468 1 if ( TI && !RI )
469 1 {
470 2 TI = 0 ;
471 2 if ( SendReady )
472 2 {
473 3 SendReady = FALSE ;
474 3
475 3 bcc = SerBuffer[0]; //计算BCC
476 3 for ( i = 1 ; i < SerBuffer[2]+3 ; i++ )
477 3 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -