针对沁恒家以太网程序常见问题列举及解决方法
问题1:为什么在定时器中断中利用心跳包交互的操作,在使用一段时间后会出现通讯掉线的情况呢?
以太网程序中的一条基本原则:中断不要调用库操作函数,除了库里单独做的中断函数(譬如定时器、网络中断等),建议此类操作放至主函数中调用;如果使用蓝牙加以太网,可以将该类操作单独开启一项TMOS任务调度使用;
问题2:我单片机这端做TCP_Client客户端,与服务器通讯一段时间后,突然出现了掉线的情况,为什么一直重连不上呢?
①查看WCHNET_HandleGlobalInt函数中对应SINT_STAT_DISCONNECT中有没有写WCHNET_CreateTcpSocket();,也就是disconnected断连之后有没有重新创建socket;
②如果确实重新创建了socket,接下来看下WCHNET_CreateTcpSocket函数定义中的sourceport(也就是单片机端的port端口号)是不是没有改变的操作,原因就是:单片机这边客户端掉线了,服务器那边需要释放端口,而这个释放端口是需要一定时间的,如果不更改端口号就一直重连,服务器端会一直把单片机当做陌生设备,从而耽误释放端口(重连一次就会重置一次释放端口时间,如此恶性循环,导致永远回连不上),最简单的做法就是,每次重新创建TCPsocket的时候给sourceport+1即可;如果限定只能使用一个端口的话,可以先在程序中运行TCP_Createsocket 使其端口号加1,之后再调用TCP_CloseSocket,再次调用TCP_Createsocket ,将端口号减1改回去;
问题3:主程序中的KEEPLIVE_ENABLE/WCHNET_ConfigKeepLive是什么,有什么作用?这个和ping有什么区别?
这个就是所谓的心跳包监测,相当于心跳监视器,检测单片机端是否有一段时间没有心跳信号并且如果发生这种情况则应用"紧急CPR"(即重新启动服务),它类似于硬件中的看门狗定时器;
心跳包服务的对象为身为客户端的单片机,客户端可以通过心跳包判断TCP服务是否还在进行;而ping操作服务对象为服务器端,通过ping ip的方式可以让服务器了解到服务是否在进行,两者相辅相成;
问题4:待更新