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 + -
显示快捷键?