今天给大家介绍的是以太网控制网络单片机W7100A的应用笔记之如何实现TCP通信。
TCP(传输控制协议)是用于控制网络间数据通信的协议。作为组成互联网的主要协议之一,更多的详细内容已经写入IETF(互联网工程任务组)的RFC 793中。TCP是运行于IP层上的协议,它保证了数据的有效传输并且可以按照数据的发送顺序依次进行接收。
因为W7100A单片机支持传输层的TCP协议,所以用户不需要做任何整合就可以直接使用TCP/IP协议。
下面一一给大家做阐述。
1 TCP SOCKET
用户可以在W7100A提供的所有8个SOCKET中使用TCP协议,但是必须首先创建要使用的SOCKET。在创建SOCKET时,需要用到SOCKET号、协议、端口号以及标志位。这篇文档将会介绍什么是TCP协议,以及在使用TCP协议时如何将Sn_MR(TCPIP核心中的SOCKET n模式寄存器)设置为Sn_MR_TCP(0×01)。SOCKET号表示用户可以选择从0到7这8个SOCKET中的任意一个使用。端口号表示TCP协议下用户指定使用的端口。如果上面需要的这些都已经设定好,那么socket()函数就可以自行分配创建一个SOCKET。
由于W7100A单片机的TCP协议支持服务器模式和客户端模式,用户可以任意选择一个模式实现此应用。服务器模式和客户端模式的不同见下图:
<图1.1> TCP 服务器和TCP 客户端
如图1.1所示,TCP服务器模式和客户端模式的过程大致相同。唯一的区别在于打开SOCKET之后,SOCKET状态是监听还是连接。当TCP协议在服务器模式下运行时,服务器处于监听状态等待来自客户端的连接请求。如果TCP协议运行于客户端模式下,客户端将会在连接状态下请求连接服务器。一旦成功建立连接,SOCKET的状态将会变成建立(SOCK_ESTABLISHED,0×17)。SOCKET在点对点建立连接之后仍然可以保持连接状态,从而进行数据交换直到SOCKET关闭。
服务器模式下的SOCKET循环周期是由打开、监听、发送、接收、断开和关闭组成。客户端模式的SOCKET循环周期则是由打开、连接、发送、接收、断开和关闭组成。
1.1 打开(OPEN)
无论是在服务器模式或是客户端模式下,在创建SOCKET时第一步都是打开SOCKET。利用SOCKET()函数设置SOCKET号、协议、端口号以及标志位来创建一个SOCKETn(取第n-1个SOCKET值)。由于使用的是TCP协议,需要将协议设置为Sn_MR_TCP(0×01)。而端口号的设置则取决于是在服务器模式还是客户端模式下。如果是在服务器模式下,服务器会根据当前用户所使用的端口来设置源端口号。但是如果是在客户端模式下,因为目的端口号正在被使用,最好随机选择一个端口号,并每次增加一个数字,直到SOCKET被连接为止。TCP协议的标志位表示‘无延时确认标志位’,一般来说,将该位设置为0。更多关于协议类型、标志位等信息,将会在‘TCPIPCore.h’文件下的‘Sn_MR value’中介绍。
在所有的设置完成之后,通过检查Sn_SR(n)寄存器来查看SOCKETn的状态是否变成SOCK_INIT(0×13)。用户可以通过getSn_SR(SOCKETn)函数来完成Sn_SR(N)寄存器的检查过程。如果SOCKET的状态为SOCK_INIT(0×13),表示SOCKET创建成功;如果没有成功,用户需要重新创建SOCKET。
例1.1 打开SOCKET
1.2 监听(LISTEN)
监听过程只能在服务器模式下使用。在SOCKETn创建完成后,为了能与客户端连接,需要将SOCKET的状态从SOCK_INIT(0×13)变成监听。用户可以直接将Sn_CR(n)寄存器设置为Sn_CR_LISTEN(0×02)或者可以直接使用’SOCKET.c’文件中的LISTEN()函数。在变成监听状态之后,SOCKET将会改变为SOCK_LISTEN(0×14)。然后,SOCKET等待客户端发出连接请求。一旦与客户端建立连接,SOCKET的状态将会重新变成SOCK_ESTABLISHED(0×17)。此时,便可以与客户端之间进行数据传输。
例 1.2 设置监听状态
1.3 连接(CONNECT)
连接过程发生在客户端模式连接到服务器时。在连接SOCKET时需要用到SOCKET号、目的IP以及目的端口号这些参数。用户可以通过CONNECT()函数进行设置;一旦成功建立连接,SOCKET的状态将会变成SOCK_ESTABLISHED(0×17)。
例 1.3 设置连接状态
1.4 发送(SEND)
在使用TCP协议时,与对端的连接在发送数据前就已经完成。用户可以通过SEND()函数查看设置的SOCKET号、将要发送数据的地址、数据的大小等参数。将要发送的数据的地址通常由选择的区域确定,输入数据,并且通过指针设定区域。
例1.4 发送数据
1.5 接收(RECEIVE)
接收过程和发送过程基本相同,唯一不同的是接收(RECEIVE)过程需要检查的是Sn_RX_RSR(n)。接收过程是指将来自接收缓存器的数据移动到用户数据存储区。因此,用户必须在接收之前检查Sn_RX_RSR(n)的值是否大于0。如果大于0,表示数据已经保存在接收缓存器中。用户必须通过getSn_RX_RSR(n)函数在此过程之前确认数据是否被接收。
例1.5 接收数据
1.6 断开(DISCONNECT)
关闭SOCKET的方法通常有两种:第一种方法是通过DISCONNECT(n)函数。DISCONNECT(n)函数不能用来直接关闭SOCKET。它先向对端发送断开连接请求(FIN数据包),然后等待回复信息(FIN/ACK数据包),之后才能将SOCKET的状态变成SOCK_CLOSED(0×00),最后关闭SOCKET。当收到断开连接请求时,W7100A发送一个FIN/ACK数据包表示允许对端关闭SOCKET。如果在发送断开连接请求之后没有收到对端的回复,将会发生TCP超时,SOCKET的状态将会变成SOCKET_CLOSED(0×00)。当用户需要断开连接时,通过DISCONNECT()函数,选择合适的SOCKET号,然后发送断开连接请求。
例1.6 设置断开连接
1.7 关闭(CLOSE)
和断开的过程不同,关闭过程可以直接将SOCKET变成SOCK_CLOSED(0×00)。用户通过CLOSE(n)函数选择合适的端口号,然后无论对端有没有做出响应都将关闭SOCKET。如果RST数据包来自对端,SOCKET将会无条件变成SOCK_CLOSED(0×00)。一旦SOCKET变成为SOCK_CLOSED(0X00), SOCKET将不再可用除非重新打开它。
例1.7 设置关闭
2 TCP回路测试(LOOPBACK)
2.1 服务器模式
TCP回路测试可以通过回送来自于对端的数据从而检测TCP协议的性能。这一章节将会介绍服务器模式下回路测试的例子。程序范例如下:
例2.1 设置回路测试(LOOPBACK)服务器
如上面的例子所示,在SOCKET循环周期内除了connect()函数,其他所有函数都可以使用。首先利用getSn_SR(s)函数检测SOCKET状态,在W7100A复位后,所有的SOCKET全都变成SOCK_CLOSED(0×00)状态。然后利用close()函数完全关闭SOCKET,再通过socket(s,Sn_MR_TCP,port,0×00)函数来创建一个新的SOCKET。如果SOCKET创建成功,状态将会变成SOCK_INIT,再通过listen(s)函数将SOCKET的状态变成监听。一旦与对端建立连接,SOCKET的状态将变成SOCK_ESTABLISHED,并且等待数据。所有接收到的数据都保存在接收缓存器中,recv(s,data_buf,len)函数中的data_buf变量定义为接收到的数据的长度。最后再通过send(s,data,len)函数将数据回送到客户端。客户端会比较数据交换前后的差异来检测数据通信是否正常。
2.2 客户端模式
本章节将会介绍客户端模式下回路测试的例子。程序范例如下:
例2.2 设置回路测试(LOOPBACK)客户端
TCP客户端的程序例子和TCP服务器的例子基本相同。唯一的区别在于SOCK_INIT状态下,是通过connect()函数而不是listen()函数与服务器连接。
3 回路测试服务器演示
这一章将会介绍TCP回路测试程序运行的例子。在下载完成TCP回路测试应用的二进制文件后,运行iMCUW7100单片机内的数据包实现回路测试的演示过程。更多的详细信息,请参阅文档‘如何在W7100A中创建工程’,‘WizISP程序指南’以及‘W7100A Debugger指南’。
对TCP串行回路,用户按照下面的步骤进行设定:
● 确认测试环境。请参考‘iMCU7100EVB用户指南’
直接利用UTP线连接PC机与iMCU7100EVB
直接利用串口线连接PC机与iMCU7100EVB
使能iMCU7100EVB的5V电源适配器
● 添加下面测试PC机的网络信息
- IP地址 : 192.168.1.xxx (‘xxx’ 为用户PC机的IP地址,在客户端模式下此IP地址也是服务器的IP地址,即我们之前在TCP客户端代码中设置在destip[4]的IP地址)。 在本文档中,IP设置为192.168.1.69,但是用户可以进行修改。
- 网关IP地址 : 192.168.1.1
- 子网掩码 : 255.255.255.0
● 运行超级终端机程序以及AX1程序
3.1 超级终端机程序
<图3.1> 超级终端机程序选项
在超级终端机程序行完成之后,如图4.1设置串行通信的选项。超级终端机程序将会显示串行通信时iMCU7100EVB的运行状态。
3.2 AX1 设置
想了解更多关于AX1程序的信息,请参考AX1用户手册。
3.2.1 TCP服务器模式下的iMCU7100EVB
当iMCU7100EVB运行于服务器模式时,PC作为TCP客户端利用AX1程序连接到iMCU7100EVB。在AX1程序中,选择TCP => CONNECT 菜单来实现与iMCU7100EVB的连接,此时对端的IP地址为192.168.1.2,端口号为5000。
一旦连接成功,如图4.2选择TCP => SEND 菜单发送数据。因为此时iMCU7100EVB作为服务器,AX1程序窗口将会显示客户端的状态。
<图3.2> AX1 发送数据
3.2.2 TCP客户端模式下的iMCU7100EVB
当iMCUW7100EVB运行于客户端模式下时,PC机作为TCP服务器使用AX1程序将iMCU7100EVB连接到服务器端口。如果在AX1程序中打开的服务器端口号是5000(监听状态),iMCU7100EVB将会连接到服务器IP地址以及服务器端口(192.168.1.xxx,5000)。需要注意的是IP地址必须是打开AX1程序的PC机上的IP地址。
一旦连接成功,选择TCP =>SEND菜单, 然后发送数据,如图4.2。因为iMCU7100EVB作为客户端,AX1程序窗口将会显示服务器的状态。
<图3.3> AX1监听
3.3 TCP回路测试结果
3.3.1 TCP服务器结果
在设置完成TCP服务器之后,点击TCP发送。然后AX1程序将会显示PC机客户端的处理进程。如图4.4所示,图中显示了发送/接收的数据大小,而超级终端机程序将会显示iMCU7100EVB服务器的处理情况。
<图3.4> TCP服务器的结果
3.3.2 TCP客户端结果
在TCP客户端所有的设置完成后,点击TCP发送。AX1将会显示PC机服务器的处理情况。如图4.5所示,图中显示了发送/接收数据的大小,而超级终端机程序将会显示iMCU7100EVB客户端的处理情况。
<图3.5> TCP客户端结果
更多参考资料请访问官网,有任何问题请随时联系我们。谢谢阅读!