📄 rs232.c
字号:
//#include<w77c32.h>
//#include<intrins.h>
#include "Math.h"
#include "global.h"
/*
void timer0 (void) interrupt 1 using 1
{
m_nTestTimer = m_nTestTimer + 5;
if(m_nTestTimer==1000){
m_nTestTimer=0;
P1_0=0;
}
mE_InputData.mDianTi[0].nJiaSuDu=m_nTestTimer;
}
*/
//void timer0 (void)interrupt 1 using 2 //5ms 定时器
void timer2 (void)interrupt 5 using 2 //5ms 定时器
{
uchar a;
TF2=0;
EA=0;
// TH0=-(0x28B0/256);
// TL0=-(0x28B0/256);
//串口通讯处理(串口在主程序及中断中)
serial_comm();
//监视延迟
m_monitor_delay_count++;
if(m_monitor_delay_count>=SCC_MONITOR_DELAYCOUNT)
m_monitor_delay_count=SCC_MONITOR_DELAYCOUNT;
//---------------------------------04-5-17
can_send_count++;
if(can_send_count>5){
m_state_20ms=~m_state_20ms;
can_send_count=0;
}
if((m_state_20ms>0x7f)&&(can_send_count==3)){
e_out_call_flag=1; //发一组外呼数据
e_lamp_call_flag=0; //发一组外呼灯亮灭
}else if((m_state_20ms<0x7f)&&(can_send_count==3)){
e_lamp_call_flag=1; //发一组外呼灯亮灭
e_out_call_flag=0; //发一组外呼数据
}
//---------群控器连接计时处理04-5-10
//以下程序联机1分钟可为群控,脱机1分钟必为单梯
for(a=0;a<=3;a++){
//can在线计时
if(e_online_time_count[a]<200){ //如1S未接收到群控器的数据,视群控器脱机
e_online_time_count[a]++;
e_1_second_flag[a]=0;
e_online_flag[a]=1; //群控器在线
e_group_comm_count[a]=0; //群控器计时=0
}else if((e_online_time_count[a]>=200)&&(e_1_second_flag[a]==0)){
e_online_flag[a]=0; //群控器不在线
e_1_second_flag[a]=1;
e_group_comm_count[a]=1; //群控器通讯计时
e_single_comm_count[a]=0;
}
if(e_group_comm_count[a]>0) //群控器脱机1分钟,自动改为单梯控制
e_group_comm_count[a]++;
if(e_group_comm_count[a]>=1000){
e_online[a]=0; //单梯运行,初值即为单梯
mE_InputData.mDianTi[a].TongXun.bCanChuShiOK=0; //2004.06.16 added by LHM(改为1分钟通讯)
e_group_comm_count[a]=1000;
}
if(e_online_flag[a]==1) //群控器在线
e_single_comm_count[a]++; //群控器脱机1分钟,自动改为单梯控制
if(e_single_comm_count[a]>=1000){
e_online[a]=1; //群控运行
mE_InputData.mDianTi[a].TongXun.bCanChuShiOK=1; //2004.06.16 added by LHM(改为1分钟通讯)
e_single_comm_count[a]=1000;
}
//关门不到位计时
if(mE_InputData.mDianTi[a].Men.bGuanMenDaoWei==0){ //关门不到位
m_Timer.lChaoShiTimer[a] =m_Timer.lChaoShiTimer[a]+5; //累加5ms
}else{
m_Timer.lChaoShiTimer[a]=0;
}
//2004.11.23
//淘汰标志计时
if(m_MenGuZhang_flg[a]==1)
if(mE_InputData.mDianTi[a].Men.bMenGuZhang==0)
if((m_MenGuZhang_count[a]--)==0){
mE_InputData.mDianTi[a].Men.bMenGuZhang=1;
m_MenGuZhang_count[a]=COUNT_10s;
}
if(m_ManZai_flg[a]==1)
if(mE_InputData.mDianTi[a].ChengZai.bManZai==0)
if((m_ManZai_count[a]--)==0){
mE_InputData.mDianTi[a].ChengZai.bManZai=1;
m_ManZai_count[a]=COUNT_3s;
}
if(m_ChaoZai_flg[a]==1)
if(mE_InputData.mDianTi[a].ChengZai.bChaoZai==0)
if((m_ChaoZai_count[a]--)==0){
mE_InputData.mDianTi[a].ChengZai.bChaoZai=1;
m_ChaoZai_count[a]=COUNT_3s;
}
if(m_JianXiu_flg[a]==1)
if(mE_InputData.mDianTi[a].TeBie.bJianXiu==0)
if((m_JianXiu_count[a]--)==0){
mE_InputData.mDianTi[a].TeBie.bJianXiu=1;
m_JianXiu_count[a]=COUNT_1s;
}
if(m_SiJi_flg[a]==1)
if(mE_InputData.mDianTi[a].TeBie.bSiJi==0)
if((m_SiJi_count[a]--)==0){
mE_InputData.mDianTi[a].TeBie.bSiJi=1;
m_SiJi_count[a]=COUNT_1s;
}
if(m_ZhiShi_flg[a]==1)
if(mE_InputData.mDianTi[a].TeBie.bZhiShi==0)
if((m_ZhiShi_count[a]--)==0){
mE_InputData.mDianTi[a].TeBie.bZhiShi=1;
m_ZhiShi_count[a]=COUNT_1s;
}
if(m_BaoLiu_flg[a]==1)
if(mE_InputData.mDianTi[a].TeBie.bBaoLiu==0)
if((m_BaoLiu_count[a]--)==0){
mE_InputData.mDianTi[a].TeBie.bBaoLiu=1;
m_BaoLiu_count[a]=COUNT_1s;
}
if(m_SuoTi_flg[a]==1)
if(mE_InputData.mDianTi[a].TeBie.bSuoTi==0)
if((m_SuoTi_count[a]--)==0){
mE_InputData.mDianTi[a].TeBie.bSuoTi=1;
m_SuoTi_count[a]=COUNT_1s;
}
if(m_XiaoFang_flg[a]==1)
if(mE_InputData.mDianTi[a].TeBie.bXiaoFang==0)
if((m_XiaoFang_count[a]--)==0){
mE_InputData.mDianTi[a].TeBie.bXiaoFang=1;
m_XiaoFang_count[a]=COUNT_1s;
}
if(m_JiTing_flg[a]==1)
if(mE_InputData.mDianTi[a].TeBie.bJiTing==0)
if((m_JiTing_count[a]--)==0){
mE_InputData.mDianTi[a].TeBie.bJiTing=1;
m_JiTing_count[a]=COUNT_1s;
}
if(m_GuZhang_flg[a]==1)
if(mE_InputData.mDianTi[a].TeBie.bGuZhang==0)
if((m_GuZhang_count[a]--)==0){
mE_InputData.mDianTi[a].TeBie.bGuZhang=1;
m_GuZhang_count[a]=COUNT_1s;
}
if(m_JingGao_flg[a]==1)
if(mE_InputData.mDianTi[a].TeBie.bJingGao==0)
if((m_JingGao_count[a]--)==0){
mE_InputData.mDianTi[a].TeBie.bJingGao=1;
m_JingGao_count[a]=COUNT_1s;
}
}
if(m_IsExistWaiInFlg==0)
m_pTimer->lJingTaiTimer = m_pTimer->lJingTaiTimer +5;
else
m_pTimer->lJingTaiTimer = 0;
if(m_read_time==0)
if((m_read_time_count--)==0){
m_read_time=1;
m_read_time_count=COUNT_5s;
}
if(m_can0_flg==1)
if(m_can0err_flg==0)
if((m_can0_count--)==0){
m_can0err_flg=1;
m_can0_count=COUNT_ERR;
}
if(m_can1_flg==1)
if(m_can1err_flg==0)
if((m_can1_count--)==0){
m_can1err_flg=1;
m_can1_count=COUNT_ERR;
}
if(m_can2_flg==1)
if(m_can2err_flg==0)
if((m_can2_count--)==0){
m_can2err_flg=1;
m_can2_count=COUNT_ERR;
}
if(m_can3_flg==1)
if(m_can3err_flg==0)
if((m_can3_count--)==0){
m_can3err_flg=1;
m_can3_count=COUNT_ERR;
}
//---------------------------------------------------------------------
EA=1;
}
// 串口通信处理
void serial_comm(void)
{
comm_check(); // 上位机通讯检测程序
monitor_rec();
monitor_send();
}
// 串口命令解析
void serial_command_resolve(void)
{
if(m_comm_enable_flg==1){
if(m_resolve_flg==1)
command(m_scc.m_ReadBuf);
}
}
// 串口发送数据作成
void serial_make_senddata(void)
{
if(m_comm_enable_flg==1){
//作成发送缓冲区
if(m_scc.WriteFlg==0){ //完整命令起始
/* if(m_monitor_type[m_active_idx]!=0){ //有效的类型
make_send_buf(); //作成发送数据
}else{ //遇无效类型,尝试监视下一参数
m_active_idx++;
if(m_active_idx>=MORN_PARAM_NUM){
m_active_idx=0;
return;
}
}*/
VALIDE_TYPE:if(m_monitor_type[m_active_idx]!=0){ //有效的类型
make_send_buf(); //作成发送数据
}else{ //遇无效类型,尝试监视下一参数
m_active_idx++;
if(m_active_idx>=MORN_PARAM_NUM){
m_active_idx=0;
return;
}
goto VALIDE_TYPE;
}
}
}
}
//----------------------------------------------------------------------------------------------------------
void comm_check(void) // 上位机通讯检测程序
{
if(RI==1){ // 如接收到数据,通讯标志置1
m_comm_60sover_flg=0;
m_comm_enable_flg=1;
m_comm_data_flg=1;
}else{
m_comm_data_flg=0;
if(m_comm_60sover_flg==1){ // 如计时1分钟到,无接收数据,通讯程序不再执行,标志清零
m_comm_enable_flg=0;
message_quit(); // 串口通信退出(V命令)子程序
}
}
//无串口数据时,开始60s计时
if(m_comm_data_flg==0)
m_ST_60s_count++;
else
m_ST_60s_count=0;
//无串口数据时,60s计时到
if(m_ST_60s_count>=COUNT_60s){
m_ST_60s_count=COUNT_60s;
//60s无串口通信数据,60s计时结束标志置1
m_comm_60sover_flg=1;
}
}
//-------------------------------------------------------------------------------------------------------------------------------
void monitor_rec(void) //上位机通讯程序
{
if(m_comm_enable_flg==1){
if(RI==1){ //有数据输入
sbuf_rec=SBUF;
RI=0;
if(m_host_flg==1){
m_get_senddata_flg=1;
}else{
}
}else{
sbuf_rec=INVALID_ASC2;
}
if((sbuf_rec==REC_COMMAND) || (sbuf_rec==SEND_COMMAND)){ //第1个命令元素ESC/FS,放入数组的第一个元素
if(sbuf_rec==REC_COMMAND){
m_host_flg=0;
m_scc.nReadCount=0;
m_scc.m_ReadBuf[m_scc.nReadCount]=sbuf_rec;
m_scc.nReadCount++;
SBUF=sbuf_rec; //返回接收的数据
//终止监视
message_quit();
}else if(sbuf_rec==SEND_COMMAND){
m_host_flg=1; //移至主动发送处
}
sbuf_rec=INVALID_ASC2;
}else if((m_scc.nReadCount==1) && ((sbuf_rec!=INVALID_ASC2))){ //第2个命令元素
if(m_host_flg==0){
m_scc.m_ReadBuf[m_scc.nReadCount]=sbuf_rec;
m_scc.nReadCount++;
SBUF=sbuf_rec; //返回接收的数据
}else{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -