轻松实现Lua脚本控制W5500

Uncategorized, 博客, 应用, 物聯網
※已刊登在“无线电”12月刊上轻松实现Lua脚本控制W5500 作者:孔东明,张博 1、引言 Lua是巴西里约热内卢天主教大学里的一个研究小组于1993年基于标准C开发的一个轻量级的嵌入式脚本语言,其设计目的是为了将传统嵌入式程序“编写→编译→链接→运行”的复杂过程简化为“编写→运行”两个环节,从而为嵌入应用程序提供灵活的扩展和定制功能。 Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。一个完整的Lua解释器不过200K,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。 2、项目背景 随着物联网的快速发展,传统的工控、电力、银行机、闸机甚至家电等设备也纷纷加入了连接互联网大军。工厂的车床需要把运行数据实时上传至PLC,水表、电表、燃气表实现了远程抄录,点验钞机可以实时将RMB的冠字号上传至银行数据库,停车场无人值守,家里的窗帘用某猫精灵很方便的进行语音控制…… 小编在一家做网络通信设备的公司上班,领导要求基于现有的串口转以太网模块开发出一款支持用户使用Lua语言进行二次开发的串口转以太网模块,项目工期1个月。小编刚刚毕业4个月,没有多少项目经验,只是在学校玩过ARM M3的开发板,C语言自我感觉勉强及格,以太网技术基本小白一枚,对如何实现用户使用Lua语言“二次开发”更是一窍不通。但是任务时间紧迫,再难也要搞定,要不然没有奖金就要勒紧裤腰带了。 接到项目当晚就去找度娘商讨对策。经过一番搜索,方才大致了解了什么是Lua,什么是脚本语言,为什么客户要二次开发。用户在使用串口转以太网模块时,由于应用场景的不同及嵌入式产品资源的限制,需要灵活的调用模块的各项功能去实现差异化应用,而传统的模块只能实现既定的功能,因此支持二次开发的产品应用范围将大为拓展。而用户二次开发输入的代码肯定是无法执行传统的“编写→编译→链接→运行”这整个过程,脚本语言将这个过程简化为“编写→运行”就可以完美的解决了这个问题,Lua便是一款最佳的嵌入式脚本语言。 原理理顺了,如何落实便成了当务之急,我需要先做一个Demo来模拟整个过程。我找来了之前开发串口转以太网模块用到的以太网开发板W5500EVB,如下图。W5500EVB是由ST的STM32F103RC+W5500网络芯片构成,STM32F103内部256K的Flash足以容纳最大200K的Lua驱动。W5500是一颗以太网接口芯片,它用全硬件逻辑门电路搭建了一整套全硬件TCP/IP协议栈,发送数据时单片机只需将用户数据通过SPI发送至W5500,W5500内部会自动完成数据TCP/IP封包,并发送至网口,接收数据时W5500内部自动完成解包,仅将MCU关心的用户数据提交。W5500内含8路完全独立的硬件Socket,这意味着W5500可以同时运行8个上层应用程序,而且传输速率互不影响,不会像软件协议栈那样线程增加,速度明显降下来。W5500内部还集成了MAC和PHY,符合了接入以太网的所有条件,对于刚刚接触以太网的攻城狮来说,是一款简单易上手的网络接口芯片。 图 1 W5500EVB 我想象中的Demo是这样的:用户通过Web网页向W5500EVB提交一段能让W5500EVB连接到TCP服务器的Lua脚本代码,W5500EVB解析出来这段代码后通过已经运行的Lua虚拟机中的Lua接口函数来解释用户代码要实现的功能,最后 W5500EVB按照用户代码中的参数连接到一个指定的TCP服务器实现以太网数据通信。这个过程可以参考W5500官网提供的HTTP Server和TCP Client的例程。 图 2 实施方案原理图 3、准备工作 (1)安装编译环境:Keil V5.11 (2)硬件:W5500EVB、Jlink调试器 (3)驱动:Lua最新驱动V5.3.2 4、宿主C部分 4.1 加载驱动 驱动包括STM32F103RC的单片机驱动、W5500以太网部分驱动以及Lua驱动。STM32F103RC驱动不必多说,W5500驱动和Lua驱动如下图所示,均可以在对应官网下载到。                                           图 3 W5500驱动                                                                                    图 4 Lua驱动-V5.3.2 4.2 初始化部分 初始化部分包括STM32初始化及W5500初始化,Lua在用的时候才需要初始化。 01 /******* STM32初始化********/ 02 Systick_Init(72); 03 RCC_Configuration(); 04 GPIO_Configuration(); 05 Timer_Configuration(); 06 NVIC_Configuration(); 07 USART1_Init(); 08 at24c16_init(); 09 10 /******* W5500初始化********/ 11 printf("W5500 Config....\r\n"); 12 Reset_W5500();                  //重启W5500 13…
Read More

郑重声明

博客, 新闻
郑 重 声 明 Statement 近期,我司发现有公司冒充我司代理销售WIZnet 产品。在此,我司郑重声明:WIZnet 所有产 品仅通过官方代理进行销售,有关代理信息可在我司网站上查询,望广大客户正确识别。 Recently, we have been informed that there were businesses pretending to be WIZnet’s distributor and selling counterfeiting items with our trademark on. Hereby we declared that the only source of WIZnet goods is sourcing through our official distributors which are listed in our website. 经我司调查,市面上有不法经销商销售翻新或伪造的WIZnet 芯片产品,严重损害了客户的利益。 为确保用户利益,我司强烈建议客户通过我司官方代理渠道采购WIZnet 产品,任何使用非我司官方 渠道之产品造成的一切问题,我司不承担任何责任。同时,我司法律部门已采取法律途径,严厉打击 销售伪造WIZnet 产品之不法公司或个人,以保护广大WIZnet 客户利益。 Through our investigation, there were illegal businesses remarking and resurfacing ICs with counterfeit WIZnet logos on the market, which severely prejudice the interests of our customers. Therefore, we strongly recommend our customers purchase WIZnet products through our official distributors, since we assume no responsibility for any problem caused if the products are not from our authorized distributing channels. At the same time, in order to protect the interest of…
Read More

RT-Thread SAL+W5500,带你走进全硬件TCP/IP协议栈世界

博客, 新闻
原文链接:HTTPS://mp.weixin.qq.com/s/we8GZS-P4_GmqUxL3egfGw场景= 25#wechat_redirect 随着嵌入式系统功能的多样化以及网络在各个领域中的广泛应用,具备网络功能的嵌入式设备拥有更高的使用价值和更强的通用性。我们在嵌入式开发中常用的网络接入方式为软件TCP / IP协议栈接入方式,如lwIP协议栈。今天,为大家介绍一种全新的网络接入方式,基于SAL的全硬件TCP / IP协议栈接入方式。 SAL 介绍 SAL,即套接字抽象层,位于网络硬件层于应用层之间,用于抽象,统一多种网络协议栈接口,并且应用层提供标准的BSD套接字APIs.SAL可以让RT-Thread系统目前SAL支持的网络接入方式主要有三种:软件TCP / IP协议栈(lwIP),自定义串口网络实现(ATSocket),以及下面带来的第三种接入方式,全硬件TCP / IP协议栈(W5500)。 W5500介绍 W5500是WIZnet 推出的高性能以太网接口芯片系列之一,内部实现了全硬件TCP/IP 协议栈+MAC+PHY,芯片有如下几个特点: 8 个独立的硬件 Socket,各路通信互不影响 32K bytes 片上缓冲用于处理收发数据 集成 802.3 以太网MAC 主机接口为 SPI 高速串行外设接口(最高 80 Mhz) 什么是全硬件TCP/IP 协议栈? 传统的单片机(MCU)实现网络功能,需要连接外设物理层以太网控制芯片(MAC+PHY),还要主控芯片中移植软件TCP/IP 协议代码实现通信及上层应用。 所谓全硬件TCP/IP 协议栈是将传统的软件协议TCP/IP 协议栈用硬件化的逻辑门电路来实现。芯片内部完成TCP、UDP、ICMP等多种应用层协议,以及IP 、ARP等网络层协议,并且实现了物理层以太网控制(MAC+PHY)、内存管理等功能,完成了一整套硬件化得以太网解决方案。 相比于lwIP 软件协议栈的资源占用(RAM50K+,ROM80K+),在MCU 上使用硬件协议栈芯片(例如:W5500)的资源占用(RAM1K,ROM20K)得到了很大程度的降低。 另一方面,硬件协议栈芯片将会降低MCU 对于庞大网络数据的负荷,使MCU 可以高效的处理其他业务逻辑。同时也避免了MCU 主程序受到网络攻击的危险,大大优化了MCU 的网络连接功能。 WIZnet软件包介绍 WIZnet软件包是RT-Thread 基于WIZnet 官方 ioLibrary_Driver 设备驱动代码库的移植实现,支持W5500 芯片。原官方代码库虽然实现了多种网络协议支持,并且提供自定义Socket 接口用于网络编程,但是其接口并不是标准BSD 接口,这样不利于兼容多种网络软件包,增加了网络开发的难度。 RT-Thread推出的WIZnet 软件包在原代码库功能的基础上,封装实现一套标准 BSD Socket APIs,并且对接RT-Thread SAL 套接字抽象层,完成SAL 对全硬件协议栈的支持。 WIZnet 软件包特点如下: 1、极简的设备接入方式 传统WIZnet 设备接入,需要实现 SPI 设备初始化、网络初始化、寄存器配置、中断处理等多个功能,才能正常连接网络。使用 WIZnet 软件包,只需要在 ENV 中正确配置 SPI 设备名称、复位引脚号和中断引脚号并下载软件包,即可快速初始化设备并接入网络。 2、提供标准网络编程接口 相比于原官方代码库,WIZnet 软件包提供标准 BSD Socket APIs,可以完美的兼容 RT-Thread 系统中多种网络软件包或者网络功能实现,如 MQTT、HTTP、NTP、MbedTLS、Iperf 等,极大的简化了开发者网络接入和网络协议移植的过程。 3、自定义网络接入参数设置 软件包提供动态和静态两种获取 IP 地址的方式,静态模式下可以在 ENV 中自定义配置设备 IP 地址、网关、子网掩码等网络参数。对于 MAC 地址,软件包提供设置 MAC 地址接口,用于设置设备唯一的 MAC 地址,防止网络冲突。 4、提供网络状态查询方式 软件包提供wiz_ifconfig 命令用于查询当前网络参数,提供 wiz_ping 命令用于查询网络连接状态。 WIZnet的软件包的推出,使得RT-主题SAL支持的更加全面,这也进一步提升了RT-线程系统在物联网领域对于不同网络软硬件的兼容性,简化了用户网络接入的流程。当前WIZnet的软件包已经完成对W5500的移植,其他热门WIZnet设备,RT-Thread将会根据用户反馈优先选择支持。 WIZnet的软件包获取 使用WIZnet软件包需要在RT-Thread的包管理中选中它,具体路径如下:RT-Thread在线包→物联网 - 物联网→WIZnet:WIZnet TCP / IP芯片SAL框架实现 可通过一下二维码查看更详细信息: 也可通过外部链接打开: https://github.com/RT-Thread-packages/wiznet/blob/master/README.md
Read More

W5100S与其他产品差异对比

应用, 新闻, 物聯網
W5100S ,W5500,W5100差异对比         型号 参数 W5500 W5100 W5100S  内部架构 全硬件TCP / IP协议栈+ MAC + PHY 全硬件TCP / IP协议栈+ MAC + PHY 全硬件TCP / IP协议栈+ MAC + PHY MCU交互接口 高速SPI SPI,并行总线 SPI,并行总线 SOCKET数 8 4 4 收发缓存 32KB 16KB 16KB MAX速率(Mbps)的 15 25 25 掉电模式 √ X √ 混合模式 Ø Ø Ø 工作温度 -40℃-85℃ -40℃-85℃ -40℃-85℃ 自动极性转换 X √ √ 内置的全硬件TCP \ IP协议 TCP,UDP,IPv4中,ARP,ICMP,IGMP版本/ V2,PPPOE WOL √ X √ 封装工艺 48LQFP 7×7(毫米) 80 LQFP 10×10(毫米) 48 LQFP 7×7(mm) 48 QFN 7×7(mm) W5100S相比于W5500各有千秋,两者都具有很高的性价比,具体对比详情如下。 内部架构:均为全硬件TCP / IP协议栈+ MAC + PHY MCU交互接口:W5100S支持并行总线+高速SPI接口/ W5500仅支持高速SPI接口 插座数:W5100S 4个独立插座/ W5500 8个独立插座 收发缓存:W5100S共16KB收发缓存/ W5500共32KB收发缓存 工作温度:均为工业级以太网芯片-40℃〜85℃ MAX速率:W5100S MAX 25Mbps / W5500 MAX 15Mbps 性能功耗:W5100S采取全新工艺,相比W5500功耗更低 极性转换:W5100S支持自动极性转换/ W5500不支持自动极性转换 封装工艺:W5100S 48引脚LQFP和QFN无铅封装/ W5500 48引脚LQFP无铅封装                       结论: W5100S在使用并行总线接口时,其性能比W5500更优秀。 在保证需求在4个插座之内时,W5100S的选择要优于W5500。 而在对速率要求不是特别高的情况下,且对插槽要求高于4个,建议选择W5500使用 W5100S的详细信息可参考以下链接:https ://www.iwiznet.cn/products/network-chip/w5100s/
Read More

WIZnet—W5100S震撼来袭

新闻, 物聯網
概述: W5100S是一款高性能的单芯片网络接口芯片,内部集成全硬件的TCP / IP协议栈,以太网MAC和10BASE-T / 100BASE-TX以太网控制器。主要应用于高集成,高稳定,高性能和低成本的嵌入式系统中。 使用W5100S,用户MCU可以方便的处理IPv4的TCP,UDP,ICMP,IGMP,ARP,PPPOE等各种TCP / IP协议.W5100S分别拥有8KB的发送缓存和接收缓存,可以最大限度地减少MCU的开销。主机还可以同时使用W5100S的4个独立的硬件插座,并基于每个硬件套接字开发独立的互联网应用。 W5100S支持SPI接口和并行系统总线接口。它还提供低功耗/低热量设计,WOL(Wake On LAN),以太网PHY掉电模式等。 W5100S使基于W5100改进的低成本网络接口芯片。引脚封装,方便产品小型化。 引脚图: 结构图: 特点 支持全硬件TCP / IP协议: TCP,UDP,WOL,ICMP,IGMPv1 / v2,IPv4,ARP,PPPoE 支持4个独立的插座 支持SOCKET-less指令:        ARP-请求,PING-请求 支持以太网掉电模式和主时钟选通节能模式 支持基于UDP的网络唤醒(WOL)功能 支持SPI和并行总线接口 高速SPI接口(MODE 0/3) 系统总线接口(2位地址线和8位数据线) 内置共计16K字节的发送/接收缓存 集成10Base-T / 100Base-TX以太网PHY 支持以太网自动协商(全/半双工,10 Base-T / 100 Base-TX) 支持自动MDIX功能(只在以太网自动协商模式下支持) 不支持IP分片功能 工作电压:3V(I / O兼容5V信号电压) 网络指示灯(全/半双工,链接指示,10Mb / 100Mb指示,传输指示) 48管脚LQFP封装和QFN封装(无铅,7x7mm,0.5mm间距) 应用 W5100S可用于多种嵌入式应用产品,包括: -   原基于W5100开发的各种应用,无需更改固件 -   家用网络设备:机顶盒,PVRs,数字媒体适配器 -   串口转以太网:访问控制,LED显示器,无线AP等 -   并口转以太网:POS/金融打印机,复印机 -   USB转以太网:存储设备,网络打印机 -   GPIO转以太网:家用网络传感器 -   安防系统:DVRs,网络照相机,终端机 -   工业和楼宇自动化 -   医用检测设备 -   嵌入式服务器 -   物联网IOT应用及IOT云应用  
Read More

W5500问题集锦

博客, 应用
        1、 如何确认W5500网络芯片物理连接是否正常? 使用W5500网络协议芯片,对其进行可靠的硬件复位(网络协议芯片的RESET或RST引脚)后可能出现下列现象: (1)  芯片的LINKLED引脚输出低电平,LINKLED指示灯会被点亮(未接,接错或灯坏除外). (2)  如果是通过网线直连电脑,电脑上本地连接显示本地连接已连接状态。如果是网线连到路由等设备,路由等相应指示灯提示连接成功。 如果出现上述现象,表明物理连接已经成功并且芯片工作,否则需要排查相关问题。   2、 如何检测W5500物理连接是否成功与芯片是否工作及相关线路是否正常有关系? (1)   因芯片焊反或关键位置虚焊,短路等问题导致芯片不能正常工作。 (2)   因芯片的供电,接地等不正常或连接芯片,导致芯片不能正常工作。 (3)   因芯片引脚外接的用于隔离数字电源与模拟电源的1uH电感损坏开路,导致不能工作。 (4)  因芯片的晶振不按要求连接,而导致芯片不能工作。使用有源振荡器的,线路连接错误,或者有源振荡器的电压不是1.8V,请参考原理图进行正确设计 。 (5)  因复位引脚连接错误,使得芯片不能完成可靠复位。 (6)  因线路中RXIP、RXIN、TXOP、TXON与变压器的连接错误,导致与电脑等无法建立连接。 (7)  因采用与线路不匹配的或坏的RJ45模块和变压器导致与电脑等无法连接。这里需要特别补充一下的是,W5500变压器连接上与W5100、W5200、W5300大不一样,如直接把他们的连接照搬过来可能不能工作,具体参考原理图。 (8)  因网线或电脑路由器等不正常而无法连接。 (9)  因某些MCU只需电压2.7V就可工作,MCU在电压还未上升到3V就对需要3V以上才能运行的网络协议芯片进行复位操作必然失败,最终导致不能连接。(可程序解决) (10) 如果是使用的W5300芯片,当不使用外部PHY时,TEST_MODE[3:0](19~22引脚),必须全部为低电平,可全接地,否则可能因没有PHY导致不能连接。   3、 W5500连接正常却PING不通,怎么办? W5500芯片是否可以ping通,不仅与物理连接等有关系,还和相关电路以及网关、子网掩码、MAC地址、IP地址配置有关系,可以从以下方面进行排除: (1)  W5500的EXRES1引脚(10脚)所接12.4K参考电阻,均接地且要求误差必须控制在1%以内。 (2)  RXIP、RXIN、TXOP、TXON接口,信号长度必须小于 25cm,越短越好,且尽量走等 长线,各差分信号相差不能超过2.5cm。RXIP,RXIN应尽量靠近,TXOP,TXON应尽量靠 近,有条件的应走平行线。 (3)  必须保证被操作的寄存器地址配置正确。 (4)  可以对寄存器进行读写操作,判断读写是否一样,采用SPI接口的可以以此判断SPI部分的程序以及电路有无问题。使用并行接口的,则可以判断程序以及地址线、数据线的连接有无问题。 (5)  MAC地址的第一个字节必须为偶数。 (6)  必须正确设置子网掩码,且电脑IP地址与网络芯片的IP地址必须设置在同一个子网。   4、 为什么W5500芯片可以PING通,但无法发送数据? W5500芯片可以ping通,说明相关电路以及网关、子网掩码、MAC地址、IP地址配置均正常, 如果不能建立连接发送接收数据,需要从从SOCKET配置,SOCKET状态,中断寄存器,发送接收程序,或是上位机软件的设置等进行排查 。 具体配置参考W5500数据手册   5、 W5500在配置时需要检查网关吗?为什么? 其实只要不访问外网,完全可以不做这个检测,如果要访问外网,必须经过网关,做这步就是为提前知道网关是否存在,是否正常工作。   6、 为什么检测网关时要将目的IP地址每位加‘1’? 在正确设置网关的情况下,去连接一个不在同一子网(外网)的目的IP,就可找到网关,而将目的IP每位加1,正好造就一个不在同一子网的目的IP,如果愿意你加2加3都可以。   7、 为什么检测网关要判断目的MAC地址首位不为0xff? 因为未找到网关以前,读出目的MAC地址所有位全为0xff, 至于为什么判断首位,因为找到的目的MAC地址首位应该是偶数,因此绝不可能是0xff(255)   8、 WIZnet网络芯片TCP模式下的客户端与服务器有什么异同? 不同点: 客户端起启动连接(CONNECT)的作用,主动连接必须要知道连接目标,因此要正确设置SOCKET的目的(服务器)IP和目的(服务器)端口号。 服务器则是侦听的作用(LISTEN),等待连接不需要设置目的IP 和目的端口号,客户端来连接时,服务器自然知道客户端的IP地址与端口号。   相同点: 客户端服务器SOCKET 分片长度最大均为1460字节,即每次发送最大为1460字节 客户端服务器均要先配置为TCP模式 客户端服务器连接成功均为SOCK_ESTABLISHED状态(Sn_SR 寄存器) 详细内容可查看各芯片的《数据手册》   9、 TCP模式下,通过路由器,对方拔掉网线后,再插上后不能建立通讯怎么办? WIZnet芯片可以在发送过数据后,空闲既未发送也未接收达的情况,到一定时间(3秒,5秒,10秒自定义)后,发送SEND_KEEP命令,如对方正常就保持连接,如果对方在一定时间内未回应,则发出超时中断,自动关闭SOCKET端口,就可以自动重新连接,这样就能连接上了。但此命令只能用于TCP模式,如果是UDP模式下如果也想查看对方状态就需要从程序想办法了。   10、    请问,官方例程为什么不提供中断模式控制W5500的数据收发呢 因为中断读了数据后,然后还是要去读寄存器,去判断是什么中断,有可能在判断的过程中又来了N 个中断,增加中断就增加了很多不确定因素。 中断必然有响应时间,当上次中断还没结束,又产生新的中断甚至连续产生多次新的中断时,或者中断标志未及时清除,必然不能响应所有中断,此时以中断标志位来判断是否该接收,必然丢失数据。   11、    同一块芯片,同时使用多个SOCKET工作,应该注意什么问题 WIZnet目前每款网络协议芯片都可以支持多个SOCKET同时工作,但每个SOCKET可以且必须以不同的端口号做为区分。   12、    多块网络协议芯片同时使用,端口号可以设置成一样吗? 多块网络协议芯片在同一个子网中使用,应具备唯一的MAC地址,唯一的IP地址,因为不在同一块网络芯片,IP地址、MAC地址不一样,因此可以设置成一样的端口号。   13、    W5500设备,在同一网段存在多台设备的情况,运行不正常 问题描述:单个设备在局域网中的时候能够正常Ping通,而且TCP连接也使用正常没有任何问题; 解答:首先检查程序中IP地址、MAC地址是否有冲突,如果地址都没有冲突,可检查程序中配置的问题。   14、    同一块网络芯片的多个SOCKET,可以同时设置成客户端去连接电脑服务器的一个端口吗,怎么实现? 当然可以,WIZnet每款网络协议芯片都可以支持多个SOCKET同时工作,只需将芯片内每个SOCKET设置成不同端口号,分别设置成客户端去连接服务器就行, 前提是服务器的上位机软件需支持多任务,否则不能成功。   15、    用dhcp模式,插在电脑上能捕捉到discover,一插到路由器上就捕捉不到了,更别提offer了,是为什么? 首先,需要检查discover的内容,最简单的就是,你把电脑设置成固定IP,再设置成DHCP,抓一下电脑的内容,然后再对比一下   16、    将w5500的RST引到电源上面 这样软件就不用配置RST了 可行吗? 这样是不可行的,复位必须有可靠操作,让芯片满足工作条件; RST那里只是保险,但绝大多数问题是其他原因造成的,如果没有反应,先看一下W5500回的信息,有没有正确的初始化,再去找其他问题的原因。  …
Read More

基于W5500实现的考勤系统

WIZnet 产品应用小例全系列, 博客, 物聯網
概述 工具:W5500EVB,RC-522射频模块,蜂鸣器模块 编译环境:keil5 目的:通过W5500EVB讲读取到的IC卡信息上传到后台数据库,后台处理后实现浏览器端登录浏览用户打卡信息。 后台接收到相应的数据后开始处理数据并实现在浏览器端显示IC卡的ID以及绑定客户的用户名,打卡时间,签到状态等信息。该系统还添加有用户注册,登录,密码找回等功能。 过程 整个系统的实现主要分为以下两部分: 如图1所示,模块驱动及数据上传; 2,后台数据处理及前端显示; 整个系统的前端显示可通过浏览器注册,登录,添加和查询用户信息,密码找回,生产用户的Excel表格等。下面分别介绍两个部分的实现过程。   模块驱动及数据上传 该部分的实现相对简单,网上有很多关于RC-522的驱动代码,我就不在赘述了。这里主要说一下读取到卡的ID以后的操作。在这之前还要先讲一下单片机的网络连接方案。 网络连接方案有很多,例如传统的软件TCP / IP协议栈方案;较新的硬件的TCP / IP协议栈方案;软件协议栈代码量较大,对工程师来说工作量也相对较大硬件协议栈较为简单,只需要将要发送的数据交给网络芯片处理就行了。数据的发送和接收都有该芯片来实现。我们只需在应用层传输/读取数据就行了。 硬件协议栈的方案是由WIZnet的首次提出,并成功推出以太网芯片系列.W5500EVB就是采用以STM32RCT6为主控芯片加W5500以太网芯片的方案来实现网络接入的功能。 设备在读取到卡的ID以后将ID数据封装打包以后交给W5500,W5500将数据通过HTTP协议将数据发送给后台服务器并接收服务器返回的响应报文。成功发送和响应后蜂鸣器会发出50ms的响声来提示数据上传成功。如不成功则会发出100ms的响声来提示数据上传错误。数据上传的代码如下: 其中post_data_to_server()函数是将ID数据打包成HTTP报文的格式。Send函数是W5500的官方库函数用来执行数据的发送。getSn_RX_RSR()函数是读取SOCKET的接收缓存来判断是否有数据需要接收,这里是来接收HTTP服务器的响应报文。 以上就实现了IC卡数据读取和上传的功能,下面说一下后台服务器和前端实现的部分。   后台数据处理及前端显示  2、后台数据处理及前端显示 该系统的后台服务器的环境搭建采用的是 该系统的后台服务器的环境搭建采用的是Apache + php+ MySQL组合,该组合非常适合开发中小型的web应用,开发的速度比较快。本系统中在硬件设备将卡的ID数据上传到服务器以后,服务器接收并将数据与数据库中的数据进行对比,然后更新与此ID对应的用户信息。浏览器再向服务器发出请求报文,服务器将数据库中的数据发送给浏览器并显示。 根据上面说的在设备上传数据之前我们需要先将卡的ID插入到数据库中,而且还要在已登录的状态下插入、查看、删除数据。再加上权限设置,这样才算是一个相对较完整的系统设置。 首先我们在phpMyAdmin中新建自己的数据库,如图: 其中company是注册用户是所填写的用户信息; Record是用来存储用户所添加的员工打卡签到的信息; Register是用来存储用户添加的员工信息; Test是存储用户员工的签到状态; Time是存储签到时间; Uaccount是存储用户的账户信息; 以上字段是用来存储用户的各项数据和信息的,浏览器在向服务器请求数据的时候服务器会从这里将对应的数据取出交给浏览器并显示。 服务器部分的功能是由服务器脚本语言PHP来编写实现的。首先我们要写一个系统注册和登陆的页面,然后将注册信息存储在数据库,这样下次登陆就可以直接比对数据库来判断是否为有效用户。如图为注册登陆界面: 注册登陆成功以后就可进入签到信息列表界面,该界面用来显示用户所添加的员工信息的签到状态。因为刚注册所以我们要先添加员工信息。 如图点击用户管理中心进入员工信息界面: 在该界面我们可查看、添加、修改、删除员工信息以及添加上下班时间。在完善这些信息后浏览器将这些数据信息发送给服务器,服务器再将这些数据插入到数据库中。上图中的信息列表、员工列表都是在完善员工信息和签到信息以后服务器从数据库中拿出发送到浏览器显示的结果。 这些工作完成以后服务器就可以接受来自设备上传的卡ID数据并将改数据与数据库中的已记录数据进行对比进而执行相应的操作。 此外该系统还有密码找回、生产Excel报表、用户搜索等功能。关于密码找回在登陆界面点击忘记密码然后填写注册时的邮箱就可通过邮件来重新设置自己的登陆密码;如图: 关于生产报表点击了信息列表页面的生成报表就可以直接下载系统自动生成的员工信息列表;该过程是由服务器自动完成,服务器向数据库索要用户员工信息然后生成Excel表格;如图: 关于用户搜索是在浏览器部分输入用户员工姓名信息,浏览器将这些数据提交给服务器,服务器再将这些数据与数据库中的数据进行对比然后将该员工的信息以表格的形式显示在浏览器页面,如图: 以上就是关于后台处理数据及前端浏览器显示的全部过程,到此整个系统的后台处理就完成了,我们可以通过浏览器登陆查看相关数据信息。 关于考勤系统的总结: 该系统主要有注册,登陆,密码找回,添加员工信息,设置签到时间,查看/修改/删除员工信息,查看员工签到信息以及搜索的功能。在实现这些功能的开发过程中主要运用PHP服务器脚本语言和MySQL的数据库语言以及HTML浏览器脚本语言来完成数据在数据库和服务器以及浏览器之间的传输。在浏览器显示的代码中还添加了CSS代码来修改HTML标签的样式以增强浏览器端显示的可视性。
Read More

FAE常见问题及解决方案-TOP10

应用, 物聯網
Q1: 在芯片处于TCP_Server模式下,在交换机/路由器网络中无法ping通也无法通讯。 R: WIZnet芯片是硬件协议栈芯片,有别于软件协议栈,如果芯片不主动往网络中发包,在TCP_Server模式下是不会有任何数据包发送的,这样会造成路由ARP表中无法形成IP和MAC设备的对应关系。 A:解决方案: 在芯片上电时往任意IP发送一个UDP数据包,从而更新路由的ARP表,形成匹配关系,后续通讯就正常了。 关键词:交换机/路由器网络无法ping通 Q2: 芯片在TCP_Client模式下,断电重启之后无法立即连接到服务器。 R:这是由于客户端没有主动发送断开请求,造成服务器并不知道Socket已发生异常断开; 重新上电之后,芯片以相同的IP和端口连接服务器,而服务器还认为此Socket链接存在,所以拒绝芯片的立即连接。 A:解决方案: 在芯片使用KEEP_ALIVE机制,一段时间内发送呼吸包,如果芯片没有给服务器回复,服务器则判断链接已断开,并释放Socket资源,这时就可以成功连接。如果对客户端的本地端口没有要求的话,也可以在初始化Socket的部分让端口自动+1处理。两种方式根据具体应用分析采用。 注: 有的场景不能采用端口自动+1的方式,比如电力104规约,只允许采用2404端口连接。 关键词:重启才能连接/ 链接原先正常,后来连接不上/服务器重启才能恢复/更换IP或端口才能重连 Q3: 网线忽然断开,服务器的Socket已经断开,但是芯片不知道Socket已经断开,并没有重建链接,此时怎么处理 A:解决方案: 可以在主循环中加入判断PHYCFGR状态的处理流程,如果PHY状态发生异常,释放所有的socket资源,并重新初始化socket。相关寄存器如下: 关键词:拔网线,链接不恢复 Q4:如果芯片作为TCP_Server,最多可以链接几 个Client,应该如何操作? A:解决方案: 芯片作为TCP_Server,最多可以与8个客户端建立连接。不能初始一个Socket对应多个连接。可以将芯片的8个socket全部初始化,这样就可以与8个不同的TCP_Client建立通讯链接。 Q5:W5200进入Power Down模式后,长时间以后唤醒不能恢复正常,如何解决? A: 解决方案: W5200的Power Down模式是通过在一定时间内关闭W5200的内置PHY电路的工作来实现的,但是有一定几率PHY在休眠之后无法唤醒,需要在软件上做处理来唤醒芯片。经过测试验证发现,W5200芯片在3s极限值内快速唤醒一次再进入Power Down,当芯片需要唤醒正常工作时就不会出现以上问题。 Q6:WIZnet芯片进行公网通讯或者芯片间通讯的话怎么抓包? A: 解决方案: 芯片和PC通讯的话可以直接通过Wireshark抓包,如果芯片和公网直接通讯或者通讯是发生在芯片之间,则没有办法直接抓包,这需要借助于“可以抓包的交换机”,这种交换机多数是二手产品,而且是10M的网络,比如TP-LINK TL-HP5MU。把芯片和抓包计算机的网线分别插上交换机就可以运行抓包工具抓包 Q7: W5300 TCP连接以后,Socket0数据收发正常,其它Socket有数据丢失是什么问题? A:解决方案: W5300是总线方式操作,在确保地址总线和数据总线连接正确的情况下,还有一个很重要的问题,就是保持总线时序统一,经过验证MCU总线地址保持时间至少是W5300总线操作时间的2倍以上,否则可能会导致W5300来不及处理数据而导致数据丢失。如下图介绍。 (more…)
Read More

教你如何通过MCU配置S2E为TCP Client的工作模式

串口转以太网, 博客, 物聯網
在上两篇文章中分别讲述了通过MCU配置S2E为UDP、TCP Server的工作模式”,相信小伙伴们已经对S2E的基本功能了解了一些,现在就让我们再接再厉、更上一层楼吧: 首先我们先了解一下MCU与S2E的接线方式: 1、接线方式: 2、例程说明: 打开“通过MCU配置S2E为TCP Client例程”,主程序中第一部分TIM3_Init();是设定一个帧中断的时间定时器,这是因为该例程MCU的串口是通过帧中断来接收AT命令配置S2E后返回的数据的。 第二部分USARTX_Init();初始化MCU用到的串口,这里用USART1_Config();是printf功能,用于查看调试信息。USART2_Config();用于配置S2E,需要注意的是该串口的配置参数需要同S2E的串口配置参数一致,否则配置失败。 第三部分主循环中的TCP_Client_Mode();用于配置S2E为TCP Client模式。S2E的AT命令列表详见各个S2E型号的用户手册AT命令章节介绍。配置成功,串口打印“TCP Client Config Success!”,配置失败串口打印“TCP Client Config Fail!”。 /**************************************************** 函数名:TCP_Client_Mode 形参:无 返回值:无 函数功能:通过串口发送AT命令配置S2E模块 ****************************************************/ volatile uint8_t SendFlag = 0; void TCP_Client_Mode(void) { uint8_t RecvFlag = 1; char *state; switch (SendFlag) { case 0: { Usart_Send(USART2, "AT\r\n"); //终端检测命令 while (RecvFlag) { if (RX2_Point & FRAME_LEN) { //如果接收到数据 state = strstr((char*) RecvBuff, "OK"); //判断回复的数据中是否有“OK” if (state != NULL) { //有 RX2_Point = 0; //接收缓冲区指针置零 RecvFlag = 0; //接收标致位置零 SendFlag = 1; //发送标志位置零 printf("Recv:%s\r\n", RecvBuff); memset(RecvBuff, 0, RECV_LEN); //接收缓存清零 } else { //无 SendFlag = 100; //配置失败 RecvFlag = 0; } } } } break; case 1: { Usart_Send(USART2, "AT+ECHO=0\r\n"); //开启(1)/关闭(0)回显命令 RecvFlag = 1; while (RecvFlag) { if (RX2_Point & FRAME_LEN) { state = strstr((char*) RecvBuff, "OK"); if (state != NULL) { RX2_Point = 0;…
Read More

教你如何通过MCU配置S2E为TCP Server的工作模式

串口转以太网, 博客, 物聯網
在上一篇文章中讲了“如何通过MCU配置S2E为UDP模式”,相信小伙伴们已经了解了S2E的基本功能,在这一篇中,我们再接再厉,继续学习一下“如何通过MCU配置S2E为TCP Server的工作模式”,无论是配置UDP模式还是配置TCP模式,都是通过串口转以太网的方式实现的: 1、接线方式 2、例程说明 打开“通过MCU配置S2E为TCP Server例程”,主程序中第一部分TIM3_Init();是设定一个帧中断的时间定时器,这是因为该例程MCU的串口是通过帧中断来接收AT命令配置S2E后返回的数据的。 第二部分USARTX_Init();初始化MCU用到的串口,这里用USART1_Config();是printf功能,用于查看调试信息。USART2_Config();用于配置S2E,需要注意的是该串口的配置参数需要同S2E的串口配置参数一致,否则配置失败。 第三部分主循环中的TCP_Server_Mode();用于配置S2E为TCP Server模式。S2E的AT命令列表详见各个S2E型号的用户手册AT命令章节介绍。配置成功,串口打印“TCP Server Config Success!”,配置失败串口打印“TCP Server Config Fail!”。 /**************************************************** 函数名: TCP_Server_Mode 形参: 无 返回值: 无 函数功能: 通过串口发送AT命令配置S2E模块 ****************************************************/ volatile uint8_t SendFlag = 0; void TCP_Server_Mode(void) { uint8_t RecvFlag = 1; char * state; switch (SendFlag) { case 0: { Usart_Send(USART2, "AT\r\n"); //终端检测命令 while (RecvFlag) { if (RX2_Point & amp; FRAME_LEN) { //如果接收到数据 state = strstr((char * ) RecvBuff, "OK"); //判断回复的数据中是否有“OK” if (state != NULL) { //有 RX2_Point = 0; //接收缓冲区指针置零 RecvFlag = 0; //接收标致位置零 SendFlag = 1; //发送标志位置零 printf("Recv:%s\r\n", RecvBuff); memset(RecvBuff, 0, RECV_LEN); //接收缓存清零 } else { //无 SendFlag = 100; //配置失败 RecvFlag = 0; } } } } break; case 1: { Usart_Send(USART2, "AT+ECHO=0\r\n"); //开启(1)/关闭(0)回显命令 RecvFlag = 1; while (RecvFlag) { if (RX2_Point & amp; FRAME_LEN) { //如果接收到数据 state = strstr((char *…
Read More