timer0.lst
来自「本程序是一个RS232转网口的。是一个透明传输的模块」· LST 代码 · 共 383 行 · 第 1/2 页
LST
383 行
C51 COMPILER V7.06 TIMER0 09/26/2008 13:35:50 PAGE 4
179 1 if (ModelStatu == MODEL_CONFIG_STATU) { //配置状态下不去连接服务器
180 2 return;
181 2 }
182 1
183 1 if (!bConnect){ //每隔1秒去连接一次,直到连上为止
184 2 if (!conxn[IndexOfClient].bUsed) {
185 3 conxn[IndexOfClient].bUsed = TRUE; //标志该套接字已使用
186 3 }
187 2 if (ConnectNum > 0) { //连接10次仍旧连不上更改本地端口号
188 3 ConnectNum--;
189 3 } else {
190 3 ConnectNum = RECONNECT_NUM; //重连填初值
191 3 SocketIndexInit(IndexOfClient); //客户端套接字初始化
192 3 LocalPort++;
193 3 InitArpTable(); //初始化ARP表
194 3 if ((LocalPort < 1024) || (LocalPort > 5000)) {
195 4 LocalPort = 1024; //本地端口填初始值1024
196 4 McuRst(NO_SAVE_EXIT); //如果连到这里还没连上,程序重起
-
197 4 }
198 3 }
199 2 TCPConnect(IndexOfClient,my_ServerIP,Server_PORT.word,OnReceive,OnClose,OnConnect);
200 2 } else { //连上以后
201 2 if (TimerSec[T_SEND_HEART] > 0) { //判断发送心跳包时间到达
202 3 TimerSec[T_SEND_HEART]--;
203 3 } else {
204 3 TimerSec[T_SEND_HEART] = HeartTimeOutBak; //时间初始化
205 3 DebugMsg(53);
206 3 #ifdef PROTOCOL_2004
SendHeart2004(); //发送心跳包 //屏蔽供测试
#else
209 3 SendHeart(); //发送心跳包
210 3 #endif
211 3 SentHeartTime++;
212 3 }
213 2 OnLineTime++; //连续在线时间计时
214 2 }
215 1 }
216
217
218
219 /*
220 *****************************************************************************************************
221 *FUNC:
222 *NOTE:
223 缓冲区里的数据生存时间,超出最大生存时间,放弃
224 *****************************************************************************************************
225 */
226 void Te2NetBuf_Ttl(void)
227 {
228 1 unsigned char i;
229 1 for (i=0; i<MAX_BUF_NUM; i++) {
230 2 if (Te2NetBuf[i].statu > 0) { //有数据
231 3 if (Te2NetBuf[i].ttl > 0) {
232 4 Te2NetBuf[i].ttl--; //生存时间
233 4 } else {
234 4 Te2NetBuf[i].statu = 0; //放弃
235 4 }
236 3 }
237 2 }
238 1 }
239
C51 COMPILER V7.06 TIMER0 09/26/2008 13:35:50 PAGE 5
240
241 /*
242 *****************************************************************************************************
243 *FUNC:
244 *NOTE:
245 缓冲区里的数据生存时间,超出最大生存时间,放弃
246 *****************************************************************************************************
247 */
248 void Net2TeBuf_Ttl(void)
249 {
250 1 unsigned char i;
251 1 for (i=0; i<MAX_BUF_NUM2; i++) {
252 2 if (Net2TeBuf[i].statu > 0) { //有数据
253 3 if (Net2TeBuf[i].ttl > 0) {
254 4 Net2TeBuf[i].ttl--; //生存时间
255 4 } else {
256 4 Net2TeBuf[i].statu = 0; //放弃
257 4 }
258 3 }
259 2 }
260 1 }
261
262 /*
263 *****************************************************************************************************
264 *FUNC: 套接字超时重连
265 *NOTE: 心跳包发出后2分钟没响应重连
266 *****************************************************************************************************
267 */
268 void Socket_Ttl(void)
269 {
270 1 if (SendHeartFlag == FALSE) { //心跳包已发,开始超时计时
271 2 return;
272 2 }
273 1 if (TimerSec[T_SOCKET_TTL] > 0) {
274 2 TimerSec[T_SOCKET_TTL]--;
275 2 } else {
276 2 HintMsg(9,NULL);
277 2 tcp_send(&TCPSend,FLG_RST, 20, IndexOfClient); //这里一定要加RST
278 2 InerClose(IndexOfClient); //关闭该套接字,重连 关闭后SendHeartFlag=FALSE;
279 2 }
280 1 }
281 /*
282 *****************************************************************************************************
283 *FUNC: 10MS周期函数
284 *NOTE: 对发出的数据如果超时,进行重发,每一次隔1S,每二次隔2S,4S,8S,16S,32S,由FINALTIMEOUT决定
285
286 *****************************************************************************************************
287 */
288 void Cycle10ms(void)
289 {
290 1 if (10==D10ms.count) { //10ms定时到
291 2 D10ms.arrived=FALSE;
292 2 initial_sequence_nr += 1280; // 初始序列号加1.
293 2 tcp_retransmit(); //数据超时没响应,重传
294 2 if (initial_sequence_nr == 0xFFFFFFFFL) {
295 3 initial_sequence_nr=1;
296 3 }
297 2 DefaultPin(); //恢复出厂值IO脚电平判断
298 2 }
299 1 }
300
301 /*
C51 COMPILER V7.06 TIMER0 09/26/2008 13:35:50 PAGE 6
302 *****************************************************************************************************
303 *FUNC:
304 *NOTE: 1:2分钟时间到发心跳ARP包,如果没返回,视对方PC不存在,关闭套接字
305 2:对PING的结果状态进行判断,是否PING通
306 3:更新ARP表的生存时间
307 4:当作客户端,连接套接字
308 *****************************************************************************************************
309 */
310 void Cycle1s(void)
311 {
312 1 static unsigned char xdata seconds=0;
313 1 static unsigned char xdata count=0;
314 1
315 1 if ((100 == D1s.count) && D1s.arrived) { //1s定时到
316 2 D1s.arrived = FALSE; //保证D1s=100的时候只进来一次
317 2 if (bConnect) {
318 3 if (++count % 4) {
319 4 LED(RUN_LED,OFF); //连上以后运行LED灭3S
320 4 } else {
321 4 LED(RUN_LED,ON); //连上以后运行LED亮1S
322 4 }
323 3 } else {
324 3 RUN_LED =~RUN_LED;
325 3 }
326 2 if ((bBound == FALSE) && DHCPMode) { //DHCP模式并且IP未绑定
327 3 if (++seconds % 2){ //如果未得到IP,2秒请求DHCP分配一次
328 4 DHCPRequest();
329 4 }
330 3 } else {
331 3 tcp_inactivity(); //在线后,tcp保活心跳定时器,2分钟发一次ARP探测,配合:TCP_ATYARP();
332 3 UpdateArpTab(); //更新ARP表的生存时间
333 3 Client_Connect(); //客户端尝试连接
334 3 Socket_Ttl(); //套接字超时重连
335 3 DHCPTimer(); //DHCP租期计时器
336 3 }
337 2 PingCycle(); //PING结果
338 2
339 2 Updata_Model_Statu(); //配置状态下3分钟分强制进入运行状态
340 2 Te2NetBuf_Ttl(); //数据生存时间判断(终端到网络)
341 2 Net2TeBuf_Ttl(); //数据生存时间判断(网络到终端)
342 2 #ifdef PROTOCOL_2004
ResenBuf_Interval();
#endif
345 2 }
346 1 }
347
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1255 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 14 6
PDATA SIZE = ---- ----
DATA SIZE = 4 5
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?