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