📄 commint1.h
字号:
//和MODBUS相关的中断程序
// 1/2个串口对应的中断程序,和MODBUS相关的定时器中断
// ABOUTCOMM程序,和硬件相关,和有无LED相关
/**********************************************************************************************/
//因为资源非常有限,不可能同时存在多个协议
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;//标志的名称沿用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为主
{
//作为主的时候接收的分析程序,可能不与理睬
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))
{
//需要分析,来的数,是上次呼叫的命令
//可用uc_Mod_Master_OP_Point指向的结构数组的信息
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为主
{
//作为主的时候接收的分析程序,可能是准备好应答,需要发确认命令
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]);
// 接收的长度,而非下标
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]);
//此函数
if((uc_sendarray_num[i])< 0xfe)//返回的是下标,有时却只发一个字节,可能为零,所以修改和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]);
//此函数
if((uc_sendarray_num[i])!= 0)//返回的是下标
{
uc_send_status[i] |= BIT(is_need_send);
}
}
#endif
#endif
#endif
}//is_modbus_master
point_uchar[i]=0;//为下次接收做准备
}//(uc_is_have_new_modbus)
}//end for
#ifdef PROGRAME_FOR_MODBUS
if(is_mod_master_need_send)//is_mod_master_need_send=1,则必是MASTER,这是当计时器到时的发送.
{
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);
//发送的顺序:发请求,收到E5后,发命令,然后收到结果后分析结果
if(uc_sendarray_num[i] < 0xfe)//有可能不发了,休息一下
{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);}//纯粹耽误些时间
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);}//纯粹耽误些时间
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;//指向的是下一个,队列中没包含头,头对MODBUS来说是":"
}
}
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;//这样,就不可能进入主发程序,而只能进入接收程序了
#else
#ifdef PROGRAME_FOR_ADAM
if((now_buf1=='#') || (now_buf1=='$') || (now_buf1=='@'))//ADAM asc 头
{
point_uchar[1] = 0;//指向的是下一个,队列中没包含头
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);在发送启动的时候做
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函数中做
}
//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;//这样,就不可能进入主发程序,而只能进入接收程序了
#else
#ifdef PROGRAME_FOR_ADAM
if((now_buf0=='#') || (now_buf0=='$') || (now_buf0=='@'))//ADAM asc 头,ADAM是固定的8,N,1
{
point_uchar[0] = 0;//指向的是下一个,队列中没包含头
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);在发送启动的时候做
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函数中做
}
//大于uc_sendarray_num后,所以不会无限制地加
//character has been transmitted,最后=uc_sendarray_num+1
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -