comm.c

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

C
761
字号
			              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==8){                 
                          TimeOver_Handle_add();
					      comm_over_and_change_value_start_add=1;//一次写寄存器通信完成,在主循环中响应的标志
					   }
					   else
					   if((TmpCommChr_add==6)||(TmpCommChr_add==7))
					   send_crc_process_add();

					   else
					   if((TmpCommChr_add>1)&&(TmpCommChr_add<6))
                       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{
			        comm_time_over_num_add++;                       //超时处理开始
			        if(comm_time_over_num_add>=20)
                    TimeOver_Handle_add();
                 }	      	  
				 
	  	         if(TmpCommChr_add==1){
				        comm_time_over_num_add=0;
	                    SBUF1=CommCommand_add;
						CommBuf_add[1]=CommCommand_add;
		                TmpCommChr_add=2;
						send_register_num_over_flag_add=0;
						ii_add=1;
						jj_add=0;
	             }
	      }

	   	  if(TmpCommChr_add==0){
		         comm_time_over_num_add=0;
	             SBUF1=CommStation;
				 CommBuf_add[TmpCommChr_add]=CommStation;
		         TmpCommChr_add=1;
	      } 
	   }
	}

//以下为接收部分	
	else{                              /*如果还没有接收完主控制器发来的数据*/	
	      if(SCON1&0x02)   //TI1==1                 
	      SCON1&=~0x02;       //TI1=0
	      if(receive_addr_over_flag_add==1){		         
	             if(receive_command_over_flag_add==1){
		               if(receive_start_register_addr_over_flag_add==1){					     
			                   if(receive_register_num_over_flag_add==1){		 
							            if(receive_data_over_flag_add==1){				 
										       if(receive_crc_over_flag_add==1&&CRC_flag_add==CORRECT){
//                                                       P4&=~0x10;//不选中RAM,即IO_CS=0;
//   		                                               e485n_write_register_add=0xff;//485EN=1;变换为写
//                                                       P4|=0x10;//选中RAM,即IO_CS=1;
                                                       ENABLE_485_WRITE2
												       receive_to_send_num_add++;
													   if(receive_to_send_num_add>=50){//转至发送状态
							                                receive_all_over_flag_add=1;  
 	                                                        receive_to_send_num_add=0;

                                                            receive_crc_over_flag_add=0;
									                        receive_data_over_flag_add=0;
													        receive_size_num_over_flag_add=0;
													        receive_register_num_over_flag_add=0;
                                                            receive_start_register_addr_over_flag_add=0;
									                        receive_command_over_flag_add=0;
									                        receive_addr_over_flag_add=0;
		                                                    TmpCommChr_add=0;
                                                            over_time_num_add=0;

															send_register_num_over_flag_add=0;
                                                            send_start_register_addr_over_flag_add=0;
			                                                comm_over_and_change_value_start_add=0;

			                                                comm_register_num_error_flag_add=0;
                                                            comm_start_register_addr_error_flag_add=0;
													   }
											   }
											   else
											   receive_crc_process_add();      
										 }
										 else
                                         receive_data_process_add();
			                   }
			                   else{
					                     if(word_high_over_flag_add==1){
							                    if(SCON1&0x01){    //RI1==1
									                   SCON1&=~0x01;   //RI1=0
                                                       comm_time_over_num_add=0;
                                                       CommRegisterNum_add.Chr[1]=SBUF1;  //接收低字节
                                                       CommBuf_add[5]=CommRegisterNum_add.Chr[1];
													   TmpCommChr_add=6;
													   if(CommRegisterNum_add.IntData>100){
													         comm_register_num_error_flag_add=1;
													   }//寄存器个数非法,置标志位,超过100就非法
                                                       word_high_over_flag_add=0;
			                                           receive_register_num_over_flag_add=1;
													   receive_data_over_flag_add=0;
									            }
												else{
				                                       comm_time_over_num_add++;               //超时处理开始
					                                   if(comm_time_over_num_add>=20)
                                                       TimeOver_Handle_add();
												}
							             }
							             else{
							                    if(SCON1&0x01){    //RI1==1
									                   SCON1&=~0x01;   //RI1=0
                                                       comm_time_over_num_add=0;
                                                       CommRegisterNum_add.Chr[0]=SBUF1;  //接收高字节
                                                       CommBuf_add[4]=CommRegisterNum_add.Chr[0];
													   TmpCommChr_add=5;
											           word_high_over_flag_add=1;
									            }
												else{
				                                       comm_time_over_num_add++;               //超时处理开始
					                                   if(comm_time_over_num_add>=20)
                                                       TimeOver_Handle_add();
												}
							             }
							   }
			           }
			           else{
					           if(word_high_over_flag_add==1){
							           if(SCON1&0x01){    //RI1==1
									           SCON1&=~0x01;   //RI1=0
                                               comm_time_over_num_add=0;
                                               CommStartRegisterAddr_add.Chr[1]=SBUF1;  //接收低字节
											   CommBuf_add[3]=CommStartRegisterAddr_add.Chr[1];
											   if(CommStartRegisterAddr_add.IntData>600){
											           comm_start_register_addr_error_flag_add=1;
											   }//开始地址非法,置标志位,超过600就非法
											   //这是因为一个寄存器就是一个字。
											   TmpCommChr_add=4;
                                               word_high_over_flag_add=0;
			                                   receive_start_register_addr_over_flag_add=1;
											   receive_register_num_over_flag_add=0;
									   }
									   else{
				                               comm_time_over_num_add++;               //超时处理开始
					                           if(comm_time_over_num_add>=20)
                                               TimeOver_Handle_add();
									   }
							   }
							   else{
							           if(SCON1&0x01){    //RI1==1
									           SCON1&=~0x01;   //RI1=0
                                               comm_time_over_num_add=0;
                                               CommStartRegisterAddr_add.Chr[0]=SBUF1;  //接收高字节
											   CommBuf_add[2]=CommStartRegisterAddr_add.Chr[0];
											   TmpCommChr_add=3;
											   word_high_over_flag_add=1;
									   }
									   else{
				                               comm_time_over_num_add++;               //超时处理开始
					                           if(comm_time_over_num_add>=20)
                                               TimeOver_Handle_add();
									   }
							   }
			           }
		         }
		         else{
                       if(SCON1&0x01){    //RI1==1
					           SCON1&=~0x01;   //RI1=0
							   comm_time_over_num_add=0;
							   CommCommand_add=SBUF1;
							   CommBuf_add[1]=CommCommand_add;
                               TmpCommChr_add=2;
							   if(CommCommand_add==READ_REGISTER||CommCommand_add==WRITE_REGISTER){
							        command_flag_add=CORRECT;
		                            receive_command_over_flag_add=1;
                                    receive_start_register_addr_over_flag_add=0;
                                    word_high_over_flag_add=0;
							   }
							   else{
						            command_flag_add=FAULT;
                                    TimeOver_Handle_add();
                               }
					   }
					   else{
				               comm_time_over_num_add++;                       //超时处理开始
					           if(comm_time_over_num_add>=20)
                               TimeOver_Handle_add();
					   }
		         }
	      }
	      else{
	             if(SCON1&0x01){    //RI1==1
					   SCON1&=~0x01;   //RI1=0
                       comm_time_over_num_add=0;
					   TmpCommChr_add=0;
					   CommBuf_add[TmpCommChr_add]=SBUF1;
                       //地址正确或接收广播命令,就继续响应。					   
	                   if(CommBuf_add[TmpCommChr_add]-CommStation==0){
	                       receive_addr_over_flag_add=1;
                           receive_command_over_flag_add=0;
					       TmpCommChr_add=1;
				           ii_add=1;
						   jj_add=0;
						   comm_num_add=0;
						   comm_num_size_add=0;
						   over_time_num_add=0;
				           send_register_num_over_flag_add=0;
					   }
					   else
                       TimeOver_Handle_add();
	             }
	      }
   }  
}

/*CRC-16(循环冗余错误校验) 

CRC-16错误校验程序如下:报文(此处只涉及数据位,不指起始位、停止位和任选的奇偶校验位)被看作是一个连续的二进制

⌨️ 快捷键说明

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