📄 scominterrupt.lst
字号:
93 1 uchar UartReg; //UartReg读端口暂存变量Count:临时计数器变量
94 1 uchar Count;
95 1 if(RI) //检测是否是因为接收到数据产生中断
96 1 {
97 2 CloseScom();
98 2 RI=0; //清除中断标志
99 2 UartReg=SBUF; //接收一个字符
100 2 if(RecUpFlg<7) //当帧结构标志RecUpFlg<10时收到数据才有可能为帧头
101 2 {
102 3 if(UartReg==UartHead) //比较是否为帧头,如果此时帧结构标志为0则认为是头否则忽略
103 3 { //eb 90 eb 90 eb 90 ... 7e
104 4 RecUpFlg++; //接收数据各部分标志字节<0x10表示头=0x10表示主机地址0x20表示数据
105 4 Count=(RecUpFlg&0x0f);
106 4 if(Count==0x06) //检测是否收到六个字节的头
107 4 {
108 5 RecUpFlg=0x10; //设定帧数据标志为接收主机地址
109 5 }
110 4 if (UartHead==0x90) //收到0x90就准备接收0xeb
111 4 UartHead=0xeb;
112 4 else
113 4 UartHead=0x90;
114 4 }
115 3 else //不等表示该数据不是头数据而是控制数据
116 3 {
C51 COMPILER V7.20 SCOMINTERRUPT 11/09/2002 21:11:17 PAGE 3
117 4 RecUpFlg=RecUpFlg&0xf0; //把低位清0
118 4 UartHead=0xeb; //恢复通讯模式到初始化模式
119 4 }
120 3 }
121 2 else //0x10之后接收的数据全部为合法数据
122 2 {
123 3 //检测接收通讯有效数据
124 3 switch(RecUpFlg&0xf0) //根据计数器值来判断当前帧的数据类型
125 3 {
126 4 case 0x10: //RecUpFlg=0x10接收主机地址并初始化好接收缓冲器UartRecBuf
127 4 UartRecBuf[0]=UartReg; //UartRecBuf将获取有效数据的第一个字节
128 4 RecUpFlg=0x20; //下一个字节开始为有效数据RecUpFlg=0x20即切换到case 0x20
129 4 break;
130 4
131 4 case 0x20: //RecUpFlg=0x10接收主机地址并初始化好接收缓冲器UartRecBuf
132 4 UartRecBuf[1]=UartReg; //UartRecBuf将获取有效数据的第一个字节
133 4 DataBlockCount=2; //DataBlockCount有效数据计数器初始化为1
134 4 UpLeng=0xff; //数据长度初始化为255
135 4 RecUpFlg=0x30; //下一个字节开始为有效数据RecUpFlg=0x20即切换到case 0x20
136 4 break;
137 4
138 4 case 0x30: //接收真正的通讯数据到缓冲器UartRecBuf[]
139 4 UartRecBuf[DataBlockCount]=UartReg;
140 4 DataBlockCount++; //对有效数据进行计数
141 4 UpLeng=UpLeng-1;
142 4 switch(UpLeng) //根据UpLeng的值确定数据是否收完
143 4 {
144 5 case 0: //当UpLeng为0时表示数据帧接收完毕可以对当前帧响应
145 5 if( ( ( UartRecBuf[0]==MasterAddr )&&( UartRecBuf[1]==SlaveAddr ) )
146 5 ||( ( UartRecBuf[0]==_DEFAULT_PC_IP )&&( UartRecBuf[1]==_DEFAULT_MCU_IP ) ) )
147 5 {
148 6 //if(CRCverify(UartRecBuf,UartRecBuf[3]+_F_RECV_ADD)==0)
149 6 RecReady=1;
150 6 //SendByte(0x30);
151 6 }
152 5 else
153 5 {
154 6 RecReady=0;
155 6 RecUpFlg=0;
156 6 UartHead=0xeb;
157 6 }
158 5 break;
159 5 case 0xfd: //根据协议规定定位到数长字节并将其复制到UpLeng=UartReg;
160 5 UpLeng=UartReg; //收到的第三个有效数据为实际数据长度Len=253+3+UartReg=UartReg
161 5 break;
162 5
163 5 default:
164 5 break;
165 5 } //switch(UpLeng)
166 4 break; //case 0x30
167 4
168 4 default:
169 4 break;
170 4 } //switch(RecUpFlg&0xf0)
171 3 } //if(RecUpFlg<10)
172 2 OpenScom();
173 2 }
174 1 }
175 //#######################################################################################//
176 //#######################################################################################//
177 #endif //#ifdef _SCOM_EN
C51 COMPILER V7.20 SCOMINTERRUPT 11/09/2002 21:11:17 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 172 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -