?? uart_cimr.c
字號:
if(uart_number==8)
comm_error=0;
else comm_error=1;//num error
if(write_mode==2)
{
if(mode==1)
{
send_buf[16]=r_buffer[1];
send_buf[17]=r_buffer[2];
send_buf[18]=r_buffer[3];
send_buf[19]=r_buffer[5]*2;
for(i=0;i<8;i++)
{
send_buf[20+i]=0;
}
}
if(mode==2)
{
send_buf[4]=r_buffer[1];
send_buf[5]=r_buffer[2];
send_buf[6]=r_buffer[3];
send_buf[7]=r_buffer[5]*2;
send_buf[8]=0;
send_buf[9]=0;
}
}
write_mode=0;
break;
case FUN_TEST:
if(uart_number==8)
{
comm_error=0;
}
else comm_error=1;//num error
break;
case 0x83:
case 0x89:
case 0x90:
if(uart_number==5)
{
comm_error=0;
}
else comm_error=1;//num error
break;//異常時的響應
default:
comm_error=1;
break;//function error
}
}
else //ADDR ERROR
{
comm_error=1;
}
}
else //CRC ERROR
{
comm_error=1;
}
if(comm_error==0)
{
comm_flag=0;
TR2=0;
timer2_num=timer2_num1=timer2_num2=0;
comm_enum=0;
comm_cnum++;
if(comm_cnum==3)
{
RUN_FLAG=!RUN_FLAG;
comm_cnum=0;
}
ES=1;
RI=0;
}
uart_number=0;
uart_complete=0;
}
void ctrl_single(void)
{
write_mode=1;
s_buffer[0]=SLAVE_ADDR;
s_buffer[1]=FUN_WRITE;
s_buffer[2]=ctrl_mode_addr[2*j];
s_buffer[3]=ctrl_mode_addr[2*j+1];
s_buffer[4]=0;
s_buffer[5]=1; //寄存器個數
s_buffer[6]=2; //數據字節數
temp_u.temp_s.temp_h=receive_cmp[2*j];
temp_u.temp_s.temp_l=receive_cmp[2*j+1];
if(j==0)
{
temp_u.temp_value=((temp_u.temp_value&0x0003)|((temp_u.temp_value&0x00fc)<<4)|((temp_u.temp_value&0x0300)>>6)|((temp_u.temp_value&0x3c00)<<2)|((temp_u.temp_value&0xc000)>>10));
}
s_buffer[7]=temp_u.temp_s.temp_h;
s_buffer[8]=temp_u.temp_s.temp_l;
crc_n(9);
s_buffer[9]=crc_c.crc_w.crc_l;
s_buffer[10]=crc_c.crc_w.crc_h;
frame_send(11);
comm_len=11;
ctrl_change[j]=0;
comm_flag=1;
RCAP2H=RCAP2H_VALUE;
RCAP2L=RCAP2L_VALUE;
TR2=1;
}
void ctrl_mult(void)
{
for(j=0;j<8;j++)
{
if((ctrl_change[j]==1)&&(comm_flag==0)) //控制從機運行
{
ctrl_single();
}
}
}
void read_state(unsigned char m)
{
read_mode=1;
s_buffer[0]=SLAVE_ADDR;
s_buffer[1]=FUN_READ;
if((m==0)||(m==2))
{
s_buffer[2]=read_mode02_addr[2*rstate_num];
s_buffer[3]=read_mode02_addr[2*rstate_num+1];
}
if(m==1)
{
s_buffer[2]=read_mode1_addr[2*rstate_num];
s_buffer[3]=read_mode1_addr[2*rstate_num+1];
}
s_buffer[4]=0x00;
s_buffer[5]=0x01;//讀取寄存器個數
crc_n(6);
s_buffer[6]=crc_c.crc_w.crc_l;
s_buffer[7]=crc_c.crc_w.crc_h;
frame_send(8);
comm_len=8;
comm_flag=1;
RCAP2H=RCAP2H_VALUE;
RCAP2L=RCAP2L_VALUE;
TR2=1;
rstate_num++;
if(rstate_num>=rstate_max[mode])
{
rstate_num=0;
}
}
void func_run(unsigned char m)
{
if((func_change==1)&&(comm_flag==0)) //操作功能碼
{
s_buffer[0]=SLAVE_ADDR;
if(m==1) //mode=1;32字節輸入輸出
{
s_buffer[1]=receive_cmp[16];
s_buffer[2]=receive_cmp[17];
s_buffer[3]=receive_cmp[18];
if(receive_cmp[16]==FUN_READ) //讀功能碼
{
read_mode=2;
s_buffer[4]=0x00;
s_buffer[5]=receive_cmp[19]/2;//讀取寄存器個數
comm_len=6;
}
if(receive_cmp[16]==FUN_WRITE) //寫功能碼
{
write_mode=2;
s_buffer[4]=0;
s_buffer[5]=receive_cmp[19]/2; //寄存器個數
s_buffer[6]=receive_cmp[19]; //數據字節數
for(i=0;i<receive_cmp[19];i++)
{
s_buffer[7+i]=receive_cmp[20+i];//設定的值
}
comm_len=7+receive_cmp[19];
}
if(receive_cmp[16]==FUN_TEST) //測試回路功能碼
{
s_buffer[2]=TEST_ADDRH;//receive_cmp[17]
s_buffer[3]=TEST_ADDRL;//receive_cmp[18]
s_buffer[4]=TEST_DATAH;//receive_cmp[20]
s_buffer[5]=TEST_DATAL;//receive_cmp[21]
comm_len=6;
}
}
if(m==2) //mode=2;12字節輸入輸出
{
s_buffer[1]=receive_cmp[4];
s_buffer[2]=receive_cmp[5];
s_buffer[3]=receive_cmp[6];
if(receive_cmp[4]==FUN_READ) //讀功能碼
{
read_mode=2;
s_buffer[4]=0x00;
s_buffer[5]=0x01; //讀取寄存器個數固定為1
comm_len=6;
}
if(receive_cmp[4]==FUN_WRITE) //寫功能碼
{
write_mode=2;
s_buffer[4]=0x00;
s_buffer[5]=0x01; //寄存器個數固定為1
s_buffer[6]=0x02; //數據字節數
s_buffer[7]=receive_cmp[8];//設定的值
s_buffer[8]=receive_cmp[9];
comm_len=9;
}
if(receive_cmp[4]==FUN_TEST) //測試回路功能碼
{
s_buffer[2]=TEST_ADDRH;//receive_cmp[5]
s_buffer[3]=TEST_ADDRL;//receive_cmp[6]
s_buffer[4]=TEST_DATAH;//receive_cmp[8]
s_buffer[5]=TEST_DATAL;//receive_cmp[9]
comm_len=6;
}
}
crc_n(comm_len);
s_buffer[comm_len]=crc_c.crc_w.crc_l;
s_buffer[comm_len+1]=crc_c.crc_w.crc_h;
comm_len=comm_len+2;
frame_send(comm_len);
func_change=0;
comm_flag=1;
RCAP2H=RCAP2H_VALUE;
RCAP2L=RCAP2L_VALUE;
TR2=1;
}
}
//*****************************************************************************
void uart_run(void)
{
if(mode==0)
{
ctrl_mult(); //控制從機運行
if(comm_flag==0)//讀取變頻器信息
{
read_state(mode);
}
}
if((mode==1)||(mode==2))
{
ctrl_mult(); //控制從機運行
func_run(mode);
if(comm_flag==0)//讀取變頻器狀態和故障信息
{
read_state(mode);
}
}
if(timer2_num>=20)//400ms
{
timer2_num=0;
comm_error=1;
timer2_num1++;
}
if(timer2_num2>=100)// 1.6s發送多次收不到回應時,發數據的間隔加大
{
timer2_num2=0;
timer2_num=0;
comm_error=1;
}
if(comm_error==1)
{
comm_enum++;
comm_error=0;
RI=0;
ES=1;
uart_number=0;
uart_complete=0;
if(comm_enum==5)
{
comm_enum=0;
comm_flag=0;
}
else frame_send(comm_len);
}
if(uart_complete==UART_COMPLETE)
{
uart_analyze();
}
}
//串形中斷,接收CIMR發來的數據
void uart_int(void) interrupt 4 using 2
{
unsigned char data u;
u=SBUF;
r_buffer[uart_number]=u;
RI=FALSE;
TH0=TH0_VALUE; //裝入初始值
TL0=TL0_VALUE; //裝入初始值
TR0=TRUE;
uart_number++;
if((uart_number==1)&&(u!=SLAVE_ADDR))
{
uart_number=0;
}
}
//收到一個字節的數據后35mS,沒有再收到數據,則證明該數據幀已經接收完
void timer0_int(void) interrupt 1 using 3
{
TR0=FALSE;
TF0=FALSE;
ES=FALSE;
RI=FALSE;
uart_complete =UART_COMPLETE;
}
void timer2_int(void) interrupt 5 using 0
{
TF2=FALSE;
RCAP2H=RCAP2H_VALUE;
RCAP2L=RCAP2L_VALUE;
if(timer2_num1<=0x03)
timer2_num++;
else
{
timer2_num=0;
timer2_num2++;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -