?? commint1.h
字號(hào):
//和MODBUS相關(guān)的中斷程序
// 1/2個(gè)串口對(duì)應(yīng)的中斷程序,和MODBUS相關(guān)的定時(shí)器中斷
// ABOUTCOMM程序,和硬件相關(guān),和有無(wú)LED相關(guān)
/**********************************************************************************************/
//因?yàn)橘Y源非常有限,不可能同時(shí)存在多個(gè)協(xié)議
void about_comm_pro(void)
{
uchar i;
uchar uc_last_comm_cmd;
if((uc_send_status[0]& BIT(is_sending)) || (uc_send_status[1]& BIT(is_sending)))
{PORT_LED&=~BIT(LED_COMM);}//LED_COMM 亮
else
{PORT_LED|=BIT(LED_COMM);} //LED_COMM 滅
if(!(uc_send_status[0] & BIT(is_sending))){uart_send_disable0;}
if(!(uc_send_status[1] & BIT(is_sending))){uart_send_disable1;}
#ifdef PROGRAME_FOR_MODBUS
if(is_modbus_asc)
{
if(now_buf0 == MB_END_ASCII)
{
now_buf0 = 0;
uc_is_have_new_modbus[0] = 1;
point_uchar[0] -= 2;
}
if(now_buf1 == MB_END_ASCII)
{
now_buf1 = 0;
uc_is_have_new_modbus[1] = 1;
point_uchar[1] -= 2;
}
}
#else
#ifdef PROGRAME_FOR_ADAM
if(is_modbus_asc)
{
if(now_buf0 == MB_END_ASCII)
{
now_buf0 = 0;
uc_is_have_new_modbus[0] = 1;
point_uchar[0] --;
}
if(now_buf1 == MB_END_ASCII)
{
now_buf1 = 0;
uc_is_have_new_modbus[1] = 1;//標(biāo)志的名稱沿用MODBUS的
point_uchar[1] --;//指向的是13
}
}
#endif
#endif
for(i=0;i<2;i++)
{
if(uc_is_have_new_modbus[i]) //receive new string.
{
uc_is_have_new_modbus[i]=0;
#ifdef PROGRAME_FOR_MODBUS
if(is_modbus_master) //modbus為主
{
//作為主的時(shí)候接收的分析程序,可能不與理睬
uc_last_comm_cmd = stMod_Master_OP[uc_Mod_Master_OP_Point].uc_cmd;
if(( uc_last_comm_cmd== 3) || (uc_last_comm_cmd == 1)||(uc_last_comm_cmd == 0x17))
{
//需要分析,來(lái)的數(shù),是上次呼叫的命令
//可用uc_Mod_Master_OP_Point指向的結(jié)構(gòu)數(shù)組的信息
uc_last_comm_cmd = is_modbus_asc > 0?MAKE_HEX_TO_DEC(uc_rec_buf[i][0],uc_rec_buf[i][1]):uc_rec_buf[i][0];
if(uc_last_comm_cmd == uc_mod_plc_add)
{
rtu_reqframe_anlys_master(uc_rec_buf[i],point_uchar[i],uc_Mod_Master_OP_Point);
}
}
}
else //modbus為從
#endif
#ifdef PROGRAME_FOR_PPI
if(is_modbus_master) //PPI為主
{
//作為主的時(shí)候接收的分析程序,可能是準(zhǔn)備好應(yīng)答,需要發(fā)確認(rèn)命令
uc_sendarray_num[i] = ppi_reqframe_anlys_master(i,uc_rec_buf[i],uc_send[i],point_uchar[i],uc_PPI_Master_OP_Point+i,
uc_client[i],uc_mod_plc_add,g_uc_ppi_main_send_count+i);
if(uc_sendarray_num[i] != 0xfe)
{
uc_send_status[i] |= BIT(is_need_send);
}
}
else //PPI為從
#endif
{
#ifdef PROGRAME_FOR_MODBUS
uc_last_comm_cmd = is_modbus_asc > 0?MAKE_HEX_TO_DEC(uc_rec_buf[i][0],uc_rec_buf[i][1]):uc_rec_buf[i][0];
if(uc_last_comm_cmd==uc_client[i])//地址是否相同
{
uc_sendarray_num[i]=rtu_reqframe_anlys_slaver(uc_rec_buf[i],point_uchar[i],uc_send[i]);
// 接收的長(zhǎng)度,而非下標(biāo)
if((uc_sendarray_num[i])!=0)
{
uc_send_status[i] |= BIT(is_need_send);
}
}
#else
#ifdef PROGRAME_FOR_PPI
uc_sendarray_num[i]=ppi_reqframe_anlys_slaver(i,uc_rec_buf[i],point_uchar[i],uc_send[i],uc_client[i]);
//此函數(shù)
if((uc_sendarray_num[i])< 0xfe)//返回的是下標(biāo),有時(shí)卻只發(fā)一個(gè)字節(jié),可能為零,所以修改和MODBUS不同
{
uc_send_status[i] |= BIT(is_need_send);
}
#else
#ifdef PROGRAME_FOR_ADAM
if(uc_get_data(uc_rec_buf[i][0],uc_rec_buf[i][1]) == uc_client[i])
{
uc_sendarray_num[i]=adam_reqframe_anlys_slaver(uc_rec_buf[i],point_uchar[i],uc_send[i],uc_head[i]);
//此函數(shù)
if((uc_sendarray_num[i])!= 0)//返回的是下標(biāo)
{
uc_send_status[i] |= BIT(is_need_send);
}
}
#endif
#endif
#endif
}//is_modbus_master
point_uchar[i]=0;//為下次接收做準(zhǔn)備
}//(uc_is_have_new_modbus)
}//end for
#ifdef PROGRAME_FOR_MODBUS
if(is_mod_master_need_send)//is_mod_master_need_send=1,則必是MASTER,這是當(dāng)計(jì)時(shí)器到時(shí)的發(fā)送.
{
is_mod_master_need_send = 0;
if(++uc_Mod_Master_OP_Point >= OP_TABLE_LENTH){uc_Mod_Master_OP_Point = 0;}
for(i=0;i<2;i++)
{
if(!(uc_send_status[i] & BIT(is_sending)))
{
uc_sendarray_num[i] = rtu_modbus_master_send(uc_Mod_Master_OP_Point,uc_mod_plc_add,uc_send[i]);
uc_send_status[i] |= BIT(is_need_send);
}
}
}
#endif
#ifdef PROGRAME_FOR_PPI
if(is_modbus_master)
{
for(i=0; i < MCU_UART_NUM; i++)
{
if(is_ppi_master_need_send[i])
{
is_ppi_master_need_send[i] = 0;
if(!(uc_send_status[i] & BIT(is_sending)))
{
uc_sendarray_num[i] = ppi_master_send(i,uc_PPI_Master_OP_Point+i,uc_mod_plc_add,uc_send[i],uc_client[i],g_uc_ppi_main_send_count+i);
//發(fā)送的順序:發(fā)請(qǐng)求,收到E5后,發(fā)命令,然后收到結(jié)果后分析結(jié)果
if(uc_sendarray_num[i] < 0xfe)//有可能不發(fā)了,休息一下
{uc_send_status[i] |= BIT(is_need_send);}
}
}
}
}
#endif
if(uc_send_status[0] & BIT(is_need_send))
{
uart_send_enable0;
uc_send_status[0] &=~ BIT(is_need_send);
if(!(uc_send_status[0] & BIT(is_need_send)))
{uc_send_status[0] &=~ BIT(is_need_send);}//純粹耽誤些時(shí)間
uc_send_status[0]|=BIT(is_sending);
UDR0=uc_send[0][0];
uc_send_point[0]=1;
}
if(uc_send_status[1] & BIT(is_need_send))
{
uart_send_enable1;
uc_send_status[1] &=~ BIT(is_need_send);
if(!(uc_send_status[1] & BIT(is_need_send)))
{uc_send_status[1] &=~ BIT(is_need_send);}//純粹耽誤些時(shí)間
uc_send_status[1]|=BIT(is_sending);
UDR1=uc_send[1][0];
uc_send_point[1]=1;
}
}
/**********************/
/**********************/
/******************************************************************/
/******************************************************************/
/******************************************************************/
#pragma interrupt_handler uart1_rx_isr:iv_USART1_RX
void uart1_rx_isr(void)
{
//uart has received a character in UDR
uc_rec_buf[1][point_uchar[1]] = now_buf1 = UDR1;
if(point_uchar[1]<comm_array_max_xb){point_uchar[1]++;}
#ifdef PROGRAME_FOR_MODBUS
if(is_modbus_asc)
{
if(now_buf1 == MB_HEAD_ASCII) //modbus asc 頭
{
point_uchar[1] = 0;//指向的是下一個(gè),隊(duì)列中沒(méi)包含頭,頭對(duì)MODBUS來(lái)說(shuō)是":"
}
}
else
{
uc_modbus_timeout1=uc_modbus_timeout_4bytes1;
}
#else
#ifdef PROGRAME_FOR_PPI
uc_modbus_timeout1=uc_modbus_timeout_4bytes1;//PPImoshi
g_uc_ppi_main_send_count[1] = -1;//這樣,就不可能進(jìn)入主發(fā)程序,而只能進(jìn)入接收程序了
#else
#ifdef PROGRAME_FOR_ADAM
if((now_buf1=='#') || (now_buf1=='$') || (now_buf1=='@'))//ADAM asc 頭
{
point_uchar[1] = 0;//指向的是下一個(gè),隊(duì)列中沒(méi)包含頭
uc_head[1] = now_buf1;
}
#endif
#endif
#endif
}
#pragma interrupt_handler uart1_tx_isr:iv_USART1_TX
void uart1_tx_isr(void)
{
//uc_send_status[1]|=BIT(is_sending);在發(fā)送啟動(dòng)的時(shí)候做
if (uc_send_point[1]<=uc_sendarray_num[1])
{
UDR1=uc_send[1][uc_send_point[1]];
uc_send_point[1]++;
}
else
{
uc_send_over_timer[1]=timer_count_char;
uc_send_status[1]&=~BIT(is_sending);
//uart_send_disable1; //在ABOUTCOM函數(shù)中做
}
//character has been transmitted,最后=uc_sendarray_num+1
}
/**********************/
/**********************/
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RX
void uart0_rx_isr(void)
{
//uart has received a character in UDR
uc_rec_buf[0][point_uchar[0]] = now_buf0 = UDR0;
if(point_uchar[0]<comm_array_max_xb){point_uchar[0]++;}
#ifdef PROGRAME_FOR_MODBUS
if(is_modbus_asc)
{
if(now_buf0 == MB_HEAD_ASCII) //modbus asc 頭
{
point_uchar[0] = 0;
}
}
else
{
uc_modbus_timeout0=uc_modbus_timeout_4bytes0;//uc_modbus_timeout_4bytes[bt[0]];
}
#else
#ifdef PROGRAME_FOR_PPI
uc_modbus_timeout0=uc_modbus_timeout_4bytes0;//PPI是固定的8,E,1
g_uc_ppi_main_send_count[0] = -1;//這樣,就不可能進(jìn)入主發(fā)程序,而只能進(jìn)入接收程序了
#else
#ifdef PROGRAME_FOR_ADAM
if((now_buf0=='#') || (now_buf0=='$') || (now_buf0=='@'))//ADAM asc 頭,ADAM是固定的8,N,1
{
point_uchar[0] = 0;//指向的是下一個(gè),隊(duì)列中沒(méi)包含頭
uc_head[0] = now_buf0;
}
#endif
#endif
#endif
}
#pragma interrupt_handler uart0_tx_isr:iv_USART0_TX
void uart0_tx_isr(void)
{
//character has been transmitted
/*when first coming this fun,uc_send_point=0*/
//uc_send_status[0]|=BIT(is_sending);在發(fā)送啟動(dòng)的時(shí)候做
if (uc_send_point[0]<=uc_sendarray_num[0])
{
UDR0=uc_send[0][uc_send_point[0]];
uc_send_point[0]++;
}
else
{
uc_send_over_timer[0]=timer_count_char;
uc_send_status[0]&=~BIT(is_sending);
//uart_send_disable0;在about_comm函數(shù)中做
}
//大于uc_sendarray_num后,所以不會(huì)無(wú)限制地加
//character has been transmitted,最后=uc_sendarray_num+1
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -