📄 rs485.lst
字号:
253 1 sendwaitBIT=1; //发送数据计时
254 1 sendwaitTimeCnt=0;
255 1 mBUSYdata=0;
256 1 for(;;)
257 1 { //a2
258 2
259 2 if((otherdoorcallBIT==1)&&((txgcommand==DCALL)||(txgcommand==DEXTCALL)||(txgcommand==DTOGETINFO)||(txgc
-ommand==DINCALL)))
260 2 {//别的门口机需要使用总线,延时一段时间再发送,若在延时的过程中,已经有人占用总线,则退出,不发送信息
261 3 for(i=0;i<25;i++)
262 3 {
263 4
264 4 RSdelays10ms();
265 4 watchdog();
266 4 if(manage_busy_bit==1)
267 4 break;
268 4 }
269 3 }
270 2
271 2 if((manage_busy_bit==1)&&((txgcommand==DCALL)||(txgcommand==DEXTCALL)||(txgcommand==DTOGETINFO)||(txgco
-mmand==DINCALL)))
272 2 {
273 3 mBUSYdata=1;
274 3 return NO;
275 3 }
276 2 if((Rxrun_bit==1)|(mRxd==0))
277 2 {
278 3
279 3 delays60ms();
280 3 watchdog();
281 3 delays60ms();
282 3 watchdog();
283 3 Rxlowtime=0;
284 3 Rxlow_bit=1;
285 3 //j=randdata; //随机数,以便和其它机通讯错开时间
286 3 }
287 2 if(sendwaitTimeCnt>SENDWAITTIMEOUT)
288 2 return NO;
289 2 if((Tx_bit==0)&&(Rxrun_bit==0)&&(TxF_bit==0)&&(Rxlow_bit==0)&&(j==0)&&(otherdoorcallBIT==0)&&(DataArive
-d==0))
290 2 {
291 3 Gtxstart();
292 3 return YES;
293 3 }
294 2 if(j==0)
295 2 j=50;
296 2 j--;
297 2 /*if((Rxrun_bit==1)||(Tx_bit==1)||(TxF_bit==1))
298 2 {
299 2 j=randdata; //随机数,以便和其它机通讯错开时间
C51 COMPILER V6.02 RS485 03/10/2006 14:34:52 PAGE 6
300 2 delays60ms();
301 2 }
302 2 */
303 2 nop();
304 2 watchdog();
305 2 }//a2
306 1
307 1 return NO;
308 1 }
309 /***********************************************/
310 bit fenask(void) /*分机收到数据后返回应答*/
311 {
312 1 uchar xdata i;
313 1 detectFbusSTA(); //检测分机总线状态
314 1 TxF_buffer[0]=MAINBACK; //命令1
315 1 TxF_buffer[1]=RxF_buffer[2]; //命令2 分机类型,发送给询问的解码器或智能型分机
316 1 TxF_buffer[2]=RxF_buffer[3]; //层号
317 1 TxF_buffer[3]=RxF_buffer[4]; //房号
318 1 TxF_buffer[4]=secdooraddr; //门口机地址
319 1 #if CANDOWITHLOWER
320 1 TxF_buffer[6]=secdooraddr; //门口机的地址
321 1 #endif
322 1 for(i=0;i<=1;i++)
323 1 {
324 2 if(Frsprogarm(TxF_buffer[0])==YES)
325 2 {
326 3 delays100ms();
327 3 return YES;
328 3 }
329 2 }
330 1 return NO;
331 1 }
332 /***********************************************/
333 bit Doorask(void) /*门口机收到数据后返回应答*/
334 {
335 1 uchar xdata i;
336 1 detectbusSTA(); //检测管理机总线状态
337 1 Tx_buffer[0]=DASK;
338 1
339 1 if(Tx_buffer[4]>0x0a)
340 1 Tx_buffer[4]=0;
341 1 if(Tx_buffer[5]>0x0a)
342 1 Tx_buffer[5]=0;
343 1 Tx_buffer[6]=secdooraddr;
344 1 if(Tx_buffer[6]==0x0A) //更新发送缓冲
345 1 Tx_buffer[6]=0x00; //更新发送缓冲
346 1 for(i=0;i<=1;i++)
347 1 {
348 2 if(Grsprogarm(Tx_buffer[0])==YES)
349 2 {
350 3 delays100ms();
351 3 return YES;
352 3 }
353 2 }
354 1 return NO;
355 1 }
356 //发送门口机占用
357
358 /**********************************************/
359 bit mainFcommon(uchar commandone,uchar commandtwo) /*主机发数据到分机,并等待回应
-,*/
360 {
C51 COMPILER V6.02 RS485 03/10/2006 14:34:52 PAGE 7
361 1 //uint mainFi;
362 1
363 1 uchar xdata j;
364 1 uchar xdata m,n;
365 1 uchar bdata k,maxtimes;
366 1 //detectFbusSTA(); //检测分机总线状态
367 1 m=*(Rx_buffer+1);
368 1 n=*(Rx_buffer+2);
369 1 TxF_buffer[0]=commandone; //命令1
370 1 k=commandtwo; //命令2的值
371 1 maxtimes=1;
372 1 if((TxF_buffer[0]==SINGLEINFO)||(TxF_buffer[0]==ALLINFO)) //短信息发送,分机类型已经在发送程序之前
373 1 {
374 2 k=k&0X0F;
375 2 maxtimes=2;//端信息最多可能需要发送三次
376 2 //k=k|0XF0; //把K的高4位变成1
377 2 //k=k|commandtwo; //加上低四位
378 2 }
379 1 else if((TxF_buffer[0]==DOORRESTMIMA))
380 1 {
381 2 ;
382 2 }
383 1 else if((TxF_buffer[0]==NEEDTOUSELINE)||(TxF_buffer[0]==NEEDTORELEASELINE))
384 1 {//发送独占申请
385 2 TxF_buffer[1]=0;
386 2 TxF_buffer[2]=secdooraddr;
387 2 TxF_buffer[3]=secdooraddr;
388 2 }
389 1 else
390 1 {
391 2 //清数据2~数据10
392 2 //for(j=5,j<)
393 2
394 2 if(kindBYTE==0X01) // 1为节能型分机 2 为智能型分机
395 2 {
396 3 k=k&0X0F; //把K的高4位变成0
397 3 TxF_buffer[1]=k; //最后对TxF_buffer[1]赋值
398 3 }
399 2 else // 为智能型分机
400 2 {
401 3 k=k|0XF0; //把K的高4位变成1
402 3 TxF_buffer[1]=k; //最后对TxF_buffer[1]赋值
403 3 }
404 2
405 2 TxF_buffer[4]=secdooraddr; //门口机的地址 //在发送短信的时候,不需要发送门口机的地址
406 2 #if CANDOWITHLOWER
407 2 TxF_buffer[6]=secdooraddr; //门口机的地址
408 2 #endif
409 2 }
410 1
411 1
412 1 //if((TxF_buffer[0]==MAINCALL)|(TxF_buffer[0]==CENCALL)|(Tx_buffer[0]==DDOORCALL))
413 1 rBUSYdata=0 ; //用户机忙
414 1 linebeusdBYTE=0;
415 1 copystoretotemp();
416 1 for(j=0;j<=maxtimes;j++)
417 1 {
418 2 if(EnWork_bit==1)
419 2 {
420 3
421 3 if(TxF_buffer[0]==NEEDTOUSELINE)
422 3 {
C51 COMPILER V6.02 RS485 03/10/2006 14:34:52 PAGE 8
423 4 if(lineuseNUM!=secdooraddr) //别人已经申请到总线,本机不再申请
424 4 break;
425 4 }
426 3 }
427 2 if(Frsprogarm(TxF_buffer[0])==YES)
428 2 {
429 3 TxBackBIT=1;
430 3 txtimecount=0;
431 3
432 3 for(;;) // 40000
433 3 {
434 4 if(Rx_bit)
435 4 {
436 5 if(m==GINFO)
437 5 {
438 6 Rx_bit=0;
439 6 if((n==GINFOALL)&&(mMaster))
440 6 {
441 7 roominfodatawork();
442 7
443 7 }
444 6 else if((n==GINFOONLY)&&(is_me_orno()))
445 6 {
446 7 Doorask();
447 7 roominfodatawork();
448 7
449 7
450 7 }
451 6 }
452 5 }
453 4 if(txtimecount>TxBackTIMEOUT)
454 4 {
455 5 TxBackBIT=0;
456 5 txtimecount=0;
457 5 break;
458 5 }
459 4
460 4 if(EnWork_bit==1)
461 4 {
462 5
463 5 if(TxF_buffer[0]==NEEDTOUSELINE)
464 5 {
465 6 if(lineuseNUM==secdooraddr) //别人已经申请到总线,本机不再申请
466 6 return YES;
467 6 else
468 6 {
469 7 j=0xff;
470 7 return NO;
471 7 }
472 6
473 6 }
474 5 }
475 4
476 4
477 4 if(RxF_bit)
478 4 {
479 5 RxF_bit=0;
480 5 if(kindBYTE==0X01) // 1为节能型分机 2 为智能型分机
481 5 { // 1为节能型分机
482 6 if(RxF_buffer[1]==EXTBACK)
483 6 {
484 7 if(TxF_buffer[0]!=SINGLEINFO)
C51 COMPILER V6.02 RS485 03/10/2006 14:34:52 PAGE 9
485 7 if(floorBACKUP==RxF_buffer[3])
486 7 if((RxF_buffer[5]==secdooraddr))//除了短信单发,都需要判断门口机地址和数据1是否相同
487 7 return YES;
488 7 }
489 6
490 6 else if((RxF_buffer[1]==EXTBUSY))
491 6 {
492 7 if((RxF_buffer[5]==secdooraddr)&&(floorBACKUP==RxF_buffer[3]))
493 7 {
494 8 rBUSYdata=1;
495 8 return NO;
496 8 }
497 7 }
498 6 }// 1为节能型分机
499 5 else
500 5 {//为智能型分机
501 6 if((RxF_buffer[1]==EXTBACK))
502 6 {
503 7 if((RxF_buffer[5]==secdooraddr)&&(floorBACKUP==RxF_buffer[3])&&(roomBACKUP==RxF_buffer[4])&&(TxF_buff
-er[0]!=SINGLEINFO))//除了短信单发,都需要判断门口机地址和数据1是否相同
504 7 return YES; }
505 6
506 6 else if((RxF_buffer[1]==EXTBUSY))
507 6 {
508 7 if((floorBACKUP==RxF_buffer[3])&&(roomBACKUP==RxF_buffer[4])&&(TxF_buffer[0]!=SINGLEINFO))//除了短
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -