com_prc.lst
来自「楼宇对讲系统里用的文字信息接收。用可视对讲话机的TFT屏可看到从管理中心发过来的」· LST 代码 · 共 1,318 行 · 第 1/5 页
LST
1,318 行
247 2 case 0x80: //PC单发
248 2 if(((rx_prc_buff[1]&0x1e)>>1) == rx_screen_cnt) //同样只有二者相等时才能继续处理
249 2 {
250 3 if((rx_prc_buff[3] == local_adr2)&&(rx_prc_buff[4] == local_adr3)
251 3 &&(rx_prc_buff[5] == local_adr4)) //如果接收地址符合本机地址
252 3 {
253 4 Htx_prc(); //先发送接收正常信息给PC机
254 4 if(rx_screen_cnt == 0)
255 4 mes_data_p = mes_data;
256 4 mes_data_p = Store_to_mesdata(&rx_prc_buff[6],mes_data_p,32);
257 4 rx_screen_cnt++;
258 4 if((rx_prc_buff[1]&0x01)== 1 )
259 4 {
260 5 received_mes_F = 1;
261 5 rx_screen_cnt = 0;
262 5 *mes_data_p = '\0';
263 5 }
264 4 }
265 3 }
266 2 else if(((rx_prc_buff[1]&0x1e)>>1) == (rx_screen_cnt-1) ) //接收正常,但可能是我的确认信息对方没收到
-而重发
267 2 {
268 3 if((rx_prc_buff[3] == local_adr2)&&(rx_prc_buff[4] == local_adr3)
269 3 &&(rx_prc_buff[5] == local_adr4)) //如果接收地址符合本机地址
270 3
271 3 Htx_prc();
272 3 }
273 2 else
274 2 rx_screen_cnt = 0 ;
275 2
276 2
277 2 break;
278 2 case 0xc0: //PC机向话机发送地址
279 2 if(work_F == 1) //只有处于设置本机地址状态才能继续处理
280 2 {
281 3 local_adr1 = rx_prc_buff[2];
282 3 local_adr2 = rx_prc_buff[3];
283 3 local_adr3 = rx_prc_buff[4];
284 3 local_adr4 = rx_prc_buff[5];
285 3 Htx_prc();
286 3 // work_F = 0;
287 3 //以下函数用于保存刚才收到的地址
288 3 Write_sector((unsigned char xdata*)(0x1000),(unsigned char xdata*)0x00);
289 3 }
290 2
291 2 break;
292 2 default:
293 2 break;
294 2 }
295 1
296 1 }
297
298 /*********************************************************************/
299 /* 功能:将收到的信息贮存到mes_data[]中 */
300 /*num 表示要存贮多少个字节,*src_p表示源信息的地址,*dst_p表示目的地址*/
301 /*********************************************************************/
C51 COMPILER V7.06 COM_PRC 06/10/2005 13:26:30 PAGE 6
302
303 unsigned char xdata* Store_to_mesdata( register unsigned char xdata *src_p, register unsigned char xdata *
-dst_p,unsigned char num)
304 {
305 1 // while((num--)&&(dst_p <= (&mes_data[0]+510)))
306 1 while(num--)
307 1 {
308 2 *dst_p = *src_p ;
309 2 dst_p++;
310 2 src_p++;
311 2 }
312 1 return(dst_p);
313 1 }
314
315 /****************************************************************/
316 /* 10ms执行一次 */
317 /****************************************************************/
318 void Trm_hd(void)
319 {
320 1 unsigned char c;
321 1 if((COMERR_F == 0)&&(one_frame_F == 1))
322 1 {
323 2 one_frame_F = 0 ;
324 2 c = Tget_data();
325 2 if(c == NORMAL_END) /*NORMAL_END define 0*/
326 2 {
327 3 Command_hd();
328 3 }
329 2 }
330 1 if(COMERR_F == 1) /* if communication is err */
331 1 {
332 2 Err_prc();
333 2 COMERR_F = 0;
334 2 }
335 1
336 1 }
337 /***********************************************************************/
338 /* rx_screen_cnt 表示现在接收到的是信息中的第几屏,它要和信息发送过来
339 的屏数相比较,只有一条信息的每帧全部相等时才能把信息存贮 */
-
340 /***********************************************************************/
341
342
343 void Err_prc(void)
344 {
345 1 rx_screen_cnt = 0; //由于出错,所以重新将接收屏数清0
346 1 mes_data_p = mes_data ; //重新指向mes_data的起始位置
347 1 }
348 /***********************************************************************/
349 /***********************************************************************/
350
351 unsigned char Tget_data(void)
352 {
353 1
354 1 register unsigned char parity,rx_data;
355 1 register unsigned char i;
356 1 while(((rx_data = Hget()) != -1 ) && ( rx_byte_cnt < 39 ))
357 1 {
358 2 if((rx_byte_cnt == 0) && (rx_data != CD_STX))
359 2 {
360 3 continue ;
361 3 }
C51 COMPILER V7.06 COM_PRC 06/10/2005 13:26:30 PAGE 7
362 2 else
363 2 {
364 3 if( rx_byte_cnt == 0)
365 3 {
366 4 if(rx_data == CD_STX )
367 4 {
368 5 rx_prc_buff[0] = CD_STX;
369 5 rx_byte_cnt++;
370 5 }
371 4 }
372 3 else
373 3 {
374 4 rx_prc_buff[rx_byte_cnt] = rx_data;
375 4 rx_byte_cnt++;
376 4 }
377 3 }
378 2 }
379 1
380 1 if( rx_byte_cnt == 39)
381 1 {
382 2 rx_byte_cnt = 0;
383 2 parity = 0xff;
384 2 for(i = 0 ; i < 38 ; i++)
385 2 {
386 3 parity ^= rx_prc_buff[i];
387 3 }
388 2 if(parity == rx_prc_buff[38])
389 2 {
390 3 com_cnt = 3 ; //有效的通信次数为3次
391 3 return((int)NORMAL_END); //define NORMAL_END 0
392 3 }
393 2 else
394 2 com_cnt--;
395 2 }
396 1 if(com_cnt == 0)
397 1 {
398 2 rx_byte_cnt = 0;
399 2 COMERR_F = 1 ;
400 2 return((int)COM_ERROR); //define COM_ERROR -1
401 2 }
402 1 return((int)NOW_COMMUNI);
403 1 }
404
405 /*********************************************/
406 /*********************************************/
407 unsigned char xdata *Hrxst_adr( void )
408 {
409 1 register unsigned char xdata *next ;
410 1 next = hrx_str + 1 ;
411 1 // if((unsigned int)next == ((unsigned int)&hrx_buff[0] + HRX_SIZE) )
412 1 if(next == (unsigned char xdata*)((unsigned int)hrx_buff + HRX_SIZE) )
413 1 next = (unsigned char xdata*)hrx_buff ;
414 1 if( next == hrx_rd )
415 1 return( (unsigned char xdata*)FULL );
416 1 else
417 1 return( next ) ;
418 1 }
419
420
421 /*********************************************/
422 /*********************************************/
423 unsigned char Hget( void )
C51 COMPILER V7.06 COM_PRC 06/10/2005 13:26:30 PAGE 8
424 {
425 1
426 1 register unsigned char xdata *next ;
427 1 register unsigned char rx_data ;
428 1
429 1 if( (int)(next = Hrxrd_adr()) != EMPTY )
430 1 {
431 2 EA = 0 ;
432 2 rx_data = *hrx_rd;
433 2 hrx_rd = next ;
434 2 EA = 1 ;
435 2 return( rx_data ) ;
436 2 }
437 1 else
438 1 return( (char)EMPTY ) ;
439 1 }
440
441 /*********************************************/
442 /*********************************************/
443
444 unsigned char xdata *Hrxrd_adr( void )
445 {
446 1 ES = 0;
447 1 if( hrx_rd == hrx_str )
448 1 {
449 2 ES = 1;
450 2 return( (unsigned char xdata *)EMPTY );
451 2 }
452 1
453 1 if( (unsigned int)hrx_rd == (unsigned int)((unsigned int)&hrx_buff[0] + HRX_SIZE - 1) )
454 1 {
455 2 ES = 1;
456 2 return( (unsigned char xdata *)hrx_buff ) ;
457 2 }
458 1 else
459 1 {
460 2 ES = 1;
461 2 return(hrx_rd + 1) ;
462 2 }
463 1 }
464
465
466 /*********************************************/
467 /*********************************************/
468
469 void Htx_st(void)
470 {
471 1 DE = ENABLE_TX;
472 1 _nop_();
473 1 _nop_();
474 1 htx_cnt=0;
475 1 TI = 0;
476 1 SBUF = htx_buff[0]; //启动发送
477 1 }
478
479 /*********************************************/
480 /*********************************************/
481 void Htx_prc(void)
482 {
483 1 register unsigned char xdata *htx_p = htx_buff;
484 1 *htx_p = CD_STX_P;
485 1 *(htx_p+1)= CD_RECEIVE_OK ; //功能特征码
C51 COMPILER V7.06 COM_PRC 06/10/2005 13:26:30 PAGE 9
486 1 *(htx_p+2) = local_adr1;
487 1 *(htx_p+3) = local_adr2;
488 1 *(htx_p+4) = local_adr3;
489 1 *(htx_p+5) = local_adr4;
490 1 *(htx_p+6) = CD_STX_P^CD_RECEIVE_OK^local_adr1^local_adr2^local_adr3^local_adr4;
491 1 Htx_st();
492 1 }
C51 COMPILER V7.06 COM_PRC 06/10/2005 13:26:30 PAGE 10
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _Hsio_init (BEGIN)
; SOURCE LINE # 95
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?