comm.c

来自「这是用C8051F020单片机实现双串口通信功能的源代码。两个串口可以同时独立收」· C语言 代码 · 共 761 行 · 第 1/3 页

C
761
字号
													        receive_register_num_over_flag=0;
                                                            receive_start_register_addr_over_flag=0;
									                        receive_command_over_flag=0;
									                        receive_addr_over_flag=0;
		                                                    TmpCommChr=0;
                                                            over_time_num=0;

															send_register_num_over_flag=0;
                                                            send_start_register_addr_over_flag=0;
			                                                comm_over_and_change_value_start=0;

			                                                comm_register_num_error_flag=0;
                                                            comm_start_register_addr_error_flag=0;
													   }
											   }
											   else
											   receive_crc_process();      
										 }
										 else
                                         receive_data_process();
			                   }
			                   else{
					                     if(word_high_over_flag==1){
							                    if(RI0==1){
									                   RI0=0;
                                                       comm_time_over_num=0;
                                                       CommRegisterNum.Chr[1]=SBUF0;  //接收低字节
                                                       CommBuf[5]=CommRegisterNum.Chr[1];
													   TmpCommChr=6;
													   if(CommRegisterNum.IntData>100){
													         comm_register_num_error_flag=1;
													   }//寄存器个数非法,置标志位,超过100就非法
                                                       word_high_over_flag=0;
			                                           receive_register_num_over_flag=1;
													   receive_data_over_flag=0;
									            }
												else{
				                                       comm_time_over_num++;               //超时处理开始
					                                   if(comm_time_over_num>=20)
                                                       TimeOver_Handle();
												}
							             }
							             else{
							                    if(RI0==1){
									                   RI0=0;
                                                       comm_time_over_num=0;
                                                       CommRegisterNum.Chr[0]=SBUF0;  //接收高字节
                                                       CommBuf[4]=CommRegisterNum.Chr[0];
													   TmpCommChr=5;
											           word_high_over_flag=1;
									            }
												else{
				                                       comm_time_over_num++;               //超时处理开始
					                                   if(comm_time_over_num>=20)
                                                       TimeOver_Handle();
												}
							             }
							   }
			           }
			           else{
					           if(word_high_over_flag==1){
							           if(RI0==1){
									           RI0=0;
                                               comm_time_over_num=0;
                                               CommStartRegisterAddr.Chr[1]=SBUF0;  //接收低字节
											   CommBuf[3]=CommStartRegisterAddr.Chr[1];
											   if(CommStartRegisterAddr.IntData>600){
											           comm_start_register_addr_error_flag=1;
											   }//开始地址非法,置标志位,超过600就非法
											   //这是因为一个寄存器就是一个字。
											   TmpCommChr=4;
                                               word_high_over_flag=0;
			                                   receive_start_register_addr_over_flag=1;
											   receive_register_num_over_flag=0;
									   }
									   else{
				                               comm_time_over_num++;               //超时处理开始
					                           if(comm_time_over_num>=20)
                                               TimeOver_Handle();
									   }
							   }
							   else{
							           if(RI0==1){
									           RI0=0;
                                               comm_time_over_num=0;
                                               CommStartRegisterAddr.Chr[0]=SBUF0;  //接收高字节
											   CommBuf[2]=CommStartRegisterAddr.Chr[0];
											   TmpCommChr=3;
											   word_high_over_flag=1;
									   }
									   else{
				                               comm_time_over_num++;               //超时处理开始
					                           if(comm_time_over_num>=20)
                                               TimeOver_Handle();
									   }
							   }
			           }
		         }
		         else{
                       if(RI0==1){
					           RI0=0;
							   comm_time_over_num=0;
							   CommCommand=SBUF0;
							   CommBuf[1]=CommCommand;
                               TmpCommChr=2;
							   if(CommCommand==READ_REGISTER||CommCommand==WRITE_REGISTER){
							        command_flag=CORRECT;
		                            receive_command_over_flag=1;
                                    receive_start_register_addr_over_flag=0;
                                    word_high_over_flag=0;
							   }
							   else{
						            command_flag=FAULT;
                                    TimeOver_Handle();
                               }
					   }
					   else{
				               comm_time_over_num++;                       //超时处理开始
					           if(comm_time_over_num>=20)
                               TimeOver_Handle();
					   }
		         }
	      }
	      else{
	             if(RI0==1){
	                   RI0=0;
                       comm_time_over_num=0;
					   TmpCommChr=0;
					   CommBuf[TmpCommChr]=SBUF0;
                       //地址正确或接收广播命令,就继续响应。					   
	                   if(CommBuf[TmpCommChr]-CommStation==0){
	                       receive_addr_over_flag=1;
                           receive_command_over_flag=0;
					       TmpCommChr=1;
				           ii=1;
						   jj=0;
						   comm_num=0;
						   comm_num_size=0;
						   over_time_num=0;
				           send_register_num_over_flag=0;
					   }
					   else
                       TimeOver_Handle();
	             }
	      }
   }  
}

//串口2通信部分的主程序
Comm_Main_add()
{
//以下为发送部分
	if(receive_all_over_flag_add==1) {	           /* 如果主控制器发来的数据已经接收完毕,将数据回应的标志置位 */
          
       over_time_num_add++;
       if(over_time_num_add>=1000){               //如果0.5秒都没有回答完毕,则说明有问题,通信复位
	      over_time_num_add=0;
          TimeOver_Handle_add();
       }
	   else{

	      if(SCON1&0x02){     //TI1==1
	             SCON1&=~0x02;   //TI1=0
				 if(CommCommand_add==READ_REGISTER){
				    
/*				    if(comm_start_register_addr_error_flag==1){  //开始地址非法的处理
					   if(TmpCommChr==5){ 
                       TimeOver_Handle();

	                   }
					   else
				       if((TmpCommChr>2)&&(TmpCommChr<5)){ 
				          send_crc_process();
					   }
					   else
				       if(TmpCommChr==2){ 
						  comm_time_over_num=0;
					      SBUF0=0xaa;
						  CommBuf[TmpCommChr]=0xaa;
		                  TmpCommChr++;
					   }
                       else{
			              comm_time_over_num++;                       //超时处理开始
			              if(comm_time_over_num>=20)
                          TimeOver_Handle();
                       }	      
					}
       
					else
					if(comm_register_num_error_flag==1)  //寄存器个数非法的处理
					   if(TmpCommChr==5){ 
                       TimeOver_Handle();
	                   
                       else
				       if((TmpCommChr>2)&&(TmpCommChr<5)){ 
				          send_crc_process();
					   }
					   else
				       if(TmpCommChr==2){ 
						  comm_time_over_num=0;
					      SBUF0=0xbb;
						  CommBuf[TmpCommChr]=0xbb;
		                  TmpCommChr++;
					   }
                       else{
			              comm_time_over_num++;                       //超时处理开始
			              if(comm_time_over_num>=20)
                          TimeOver_Handle();
                       }	      
					}

					else*/
					if((comm_start_register_addr_error_flag_add==0)&&(comm_register_num_error_flag_add==0)){//正常报文处理
                       if(TmpCommChr_add-send_size_num_add==5){    
					      TimeOver_Handle_add();
	                   }
					   else
				       if((TmpCommChr_add<send_size_num_add+5)&&(TmpCommChr_add>=send_size_num_add+3)) 
				       send_crc_process_add();

					   else
	                   if((TmpCommChr_add<send_size_num_add+3)&&(TmpCommChr_add>1))     
					   send_data_process_add();

                       else{
			              comm_time_over_num_add++;                       //超时处理开始
			              if(comm_time_over_num_add>=20)
                          TimeOver_Handle_add();
                       }	      
					}

                    else
                    TimeOver_Handle_add();	      
				 }
 
				 else
				 if(CommCommand_add==WRITE_REGISTER){
/*				    if(comm_start_register_addr_error_flag==1){
					   if(TmpCommChr==5){ //开始地址非法的处理
                       TimeOver_Handle();
	                   }
					   else
				       if((TmpCommChr>2)&&(TmpCommChr<5)) //开始地址非法的处理
				       send_crc_process();

					   else
				       if(TmpCommChr==2){ //开始地址非法的处理
						  comm_time_over_num=0;
					      SBUF0=0xaa;
						  CommBuf[TmpCommChr]=0xaa;
		                  TmpCommChr++;
					   }
                       else{
			              comm_time_over_num++;                       //超时处理开始

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?