|

楼主 |
发表于 2017-11-6 16:44:59
|
显示全部楼层
15.7 实验例程说明(裸机)
15.7.1 STM32F407开发板实验
配套例子:
V5-1016_RL-TCPnet实验_多个TCP客户端连接(裸机)
实验目的:
1. 学习RL-TCPnet的多个TCP客户端创建和数据收发。
实验内容:
1. 强烈推荐将网线接到路由器或者交换机上面测试,因为已经使能了DHCP,可以自动获取IP地址。
2. 客户端的例子相比服务器的例子稍麻烦些,因为客户端的例子需要用户知道电脑端IP和端口号。并根据实际情况设置IP和端口号的宏定义,这个配置在文件app_tcpnet_lib.c开头,测试的时候板子要连接这个IP和端口(下面是默认配置,一定要根据实际情况重新配置,如果不会配置,看本例程对应的教程即可):
#define IP1 192
#define IP2 168
#define IP3 1
#define IP4 2
#define PORT_NUM 1001
3. 本例程可以创建三个TCP Client,而且使能了局域网域名NetBIOS,用户只需在电脑端ping armfly就可以获得板子的IP地址,三个TCP Client的端口号分别是1024,1025和1026。
4. 用户可以在电脑端用网络调试软件创建TCP Server跟这三个客户端建立连接。执行下面5--10步的操作时,优先将电脑端的TCP Server建立起来!
5. 按键K1按下,创建TCP客户端1,并跟电脑端的TCP服务器建立连接。
6. 按键K2按下,创建TCP客户端2,并跟电脑端的TCP服务器建立连接。
7. 按键K3按下,创建TCP客户端3,并跟电脑端的TCP服务器建立连接。
8. 摇杆上键按下,TCP客户端1给电脑端的TCP服务器发送4096字节数据。
9. 摇杆左键按下,TCP客户端2给电脑端的TCP服务器发送4096字节数据。
10. 摇杆右键按下,TCP客户端3给电脑端的TCP服务器发送4096字节数据。
实验操作:
详见本章节15.6小节。
配置向导文件设置(Net_Config.c):
详见本章节15.3小节。
调试文件设置(Net_Debug.c):
详见本章节15.4小节。
程序设计:
主函数初始化
在main.c文件实现:
- /*
- *********************************************************************************************************
- * 函 数 名: main
- * 功能说明: 标准c程序入口。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- int main (void)
- {
- /* 初始化外设 */
- bsp_Init();
-
- /* 进入RL-TCPnet测试函数 */
- TCPnetTest();
- }
复制代码 硬件外设初始化
硬件外设的初始化是在 bsp.c 文件实现:
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_Init
- * 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_Init(void)
- {
- /*
- 由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
- 启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
-
- 系统时钟缺省配置为168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件
- */
- /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
-
- bsp_InitUart(); /* 初始化串口 */
- bsp_InitKey(); /* 初始化按键变量(必须在 bsp_InitTimer() 之前调用) */
- bsp_InitLed(); /* 初始LED指示灯端口 */
- bsp_InitTimer(); /* 初始化滴答定时器 */
- }
复制代码 三个TCP客户端的实现
三个TCP客户端实现都是一样的,我们这里仅以客户端1为例进行说明:
- #include "bsp.h"
- #include <RTL.h>
- #include <stdio.h>
- #include <Net_Config.h>
-
-
-
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug1 printf
- #else
- #define printf_debug1(...)
- #endif
-
-
- /*
- *********************************************************************************************************
- * 变量
- *********************************************************************************************************
- */
- uint8_t socket_tcp1;
-
-
- /*
- *********************************************************************************************************
- * 函 数 名: tcp_callback
- * 功能说明: TCP Socket的回调函数
- * 形 参: soc TCP Socket类型
- * evt 事件类型
- * ptr 事件类型是TCP_EVT_DATA,ptr指向的缓冲区记录着接收到的TCP数据,其余事件记录IP地址
- * par 事件类型是TCP_EVT_DATA,记录接收到的数据个数,其余事件记录端口号
- * 返 回 值: 主要是TCP_EVT_CONREQ事件使用,返回数值1允许连接,返回数值0禁止连接。
- *********************************************************************************************************
- */
- static U16 tcp_callback1 (U8 soc, U8 evt, U8 *ptr, U16 par)
- {
- char buf[50];
- uint16_t i;
-
- /* 确保是socket_tcp的回调 */
- if (soc != socket_tcp1)
- {
- return (0);
- }
-
- switch (evt)
- {
- /*
- 远程客户端连接消息
- 1、数组ptr存储远程设备的IP地址,par中存储端口号。
- 2、返回数值1允许连接,返回数值0禁止连接。
- */
- case TCP_EVT_CONREQ:
- sprintf(buf, "远程客户端请求连接IP: %d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);
- printf_debug1("IP:%s port:%d\\r\\n", buf, par);
- return (1);
-
- /* 连接终止 */
- case TCP_EVT_ABORT:
- break;
-
- /* Socket远程连接已经建立 */
- case TCP_EVT_CONNECT:
- printf_debug1("Socket is connected to remote peer\\r\\n");
- break;
-
- /* 连接断开 */
- case TCP_EVT_CLOSE:
- printf_debug1("Connection has been closed\\r\\n");
- break;
-
- /* 发送的数据收到远程设备应答 */
- case TCP_EVT_ACK:
- break;
-
- /* 接收到TCP数据帧,ptr指向数据地址,par记录数据长度,单位字节 */
- case TCP_EVT_DATA:
- printf_debug1("TCP客户端1接收到数据长度 = %d\\r\\n", par);
- for(i = 0; i < par; i++)
- {
- printf_debug1("ptr[%d] = %d\\r\\n", i, ptr[i]);
- }
- break;
- }
-
- return (0);
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: TcpConnect_Client1
- * 功能说明: 创建一个TCP Client
- * 形 参: _remip 要访问的远程IP地址
- * _remport 远程端口号
- * _localport 本地端口号
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void TcpConnect_Client1(uint8_t *_remip, uint16_t _remport, uint16_t _localport)
- {
- uint8_t res;
-
- /*
- 创建TCP Socket并连接,客户端连接服务器后,10秒内无数据通信将断开连接。
- 但是由于这里使能了TCP_TYPE_KEEP_ALIVE,会一直保持连接,不受10秒的时间限制。
- */
- socket_tcp1 = tcp_get_socket (TCP_TYPE_CLIENT | TCP_TYPE_KEEP_ALIVE, 0, 10, tcp_callback1);
- if(socket_tcp1 != 0)
- {
- res = tcp_connect (socket_tcp1, _remip, _remport, _localport);
- printf_debug1("TCP Socket创建成功res = %d\\r\\n", res);
- }
- }
复制代码 RL-TCPnet功能测试
这里专门创建了一个app_tcpnet_lib.c文件用于RL-TCPnet功能的测试。
- #include "bsp.h"
- #include <RTL.h>
- #include <stdio.h>
- #include <Net_Config.h>
-
-
-
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug printf
- #else
- #define printf_debug(...)
- #endif
-
-
- /*
- *********************************************************************************************************
- * 外部变量和函数调用
- *********************************************************************************************************
- */
- extern uint8_t socket_tcp1;
- extern void TcpConnect_Client1(uint8_t *_remip, uint16_t _remport, uint16_t _localport);
-
- extern uint8_t socket_tcp2;
- extern void TcpConnect_Client2(uint8_t *_remip, uint16_t _remport, uint16_t _localport);
-
- extern uint8_t socket_tcp3;
- extern void TcpConnect_Client3(uint8_t *_remip, uint16_t _remport, uint16_t _localport);
-
-
- /*
- *********************************************************************************************************
- * 宏定义,远程服务器的IP和端口
- *********************************************************************************************************
- */
- /* 要访问的远程服务器IP和端口配置,也就是电脑端调试助手设置的IP和端口号 */
- #define IP1 192
- #define IP2 168
- #define IP3 1
- #define IP4 2
-
- #define PORT_NUM 1001
-
- /* 这个是本地端口 */
- #define LocalPort_NUM1 1024
- #define LocalPort_NUM2 1025
- #define LocalPort_NUM3 1026
-
-
- /*
- *********************************************************************************************************
- * 变量
- *********************************************************************************************************
- */
- uint8_t Rem_IP[4] = {IP1,IP2,IP3,IP4};
-
- /* TCP状态的返回值 */
- const char * ReVal_Table[]=
- {
- "0: TCP_STATE_FREE",
- "1: TCP_STATE_CLOSED",
- "2: TCP_STATE_LISTEN",
- "3: TCP_STATE_SYN_REC",
- "4: TCP_STATE_SYN_SENT",
- "5: TCP_STATE_FINW1",
- "6: TCP_STATE_FINW2",
- "7: TCP_STATE_CLOSING",
- "8: TCP_STATE_LAST_ACK",
- "9: TCP_STATE_TWAIT",
- "10: TCP_STATE_CONNECT",
- "11: 连接还未创建",
- };
-
- /*
- *********************************************************************************************************
- * 函 数 名: tcpnet_poll
- * 功能说明: 使用TCPnet必须要一直调用的函数
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void tcpnet_poll(void)
- {
- if(bsp_CheckTimer(0))
- {
- bsp_LedToggle(2);
-
- /* 此函数坚决不可以放在中断里面跑 */
- timer_tick ();
- }
-
- main_TcpNet ();
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: TCPnetTest
- * 功能说明: TCPnet应用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void TCPnetTest(void)
- {
- int32_t iCount;
- uint8_t *sendbuf;
- uint16_t maxlen;
- uint8_t ucKeyCode;
- uint8_t TcpState;
-
-
- /* 初始化网络协议栈 */
- init_TcpNet ();
-
- /* 创建一个周期是100ms的软定时器 */
- bsp_StartAutoTimer(0, 100);
-
- while (1)
- {
- /* TCP轮询 */
- tcpnet_poll();
-
- /* 按键消息的处理 */
- ucKeyCode = bsp_GetKey();
- if (ucKeyCode != KEY_NONE)
- {
- switch (ucKeyCode)
- {
- /* K1键按下,TCP客户端1建立连接 */
- case KEY_DOWN_K1:
- TcpState = tcp_get_state(socket_tcp1);
-
- /*
- TCP_STATE_CONNECT是最后一个状态,未创建连接的话,会返回数值255,这里就是专门处理
- 这种状态,将其设置下一个TCP_STATE_CONNECT+1,即我们这里自定义了一个未创建连接的
- 状态。
- */
- if(TcpState > TCP_STATE_CONNECT)
- {
- TcpState = TCP_STATE_CONNECT + 1;
- }
- printf_debug("TCP客户端1状态 = %s\\r\\n", ReVal_Table[TcpState]);
-
- if(TcpState != TCP_STATE_CONNECT)
- {
- TcpConnect_Client1(Rem_IP, PORT_NUM, LocalPort_NUM1);
- }
- break;
-
- /* K2键按下,TCP客户端2建立连接 */
- case KEY_DOWN_K2:
- TcpState = tcp_get_state(socket_tcp2);
-
- /*
- TCP_STATE_CONNECT是最后一个状态,未创建连接的话,会返回数值255,这里就是专门处理
- 这种状态,将其设置下一个TCP_STATE_CONNECT+1,即我们这里自定义了一个未创建连接的
- 状态。
- */
- if(TcpState > TCP_STATE_CONNECT)
- {
- TcpState = TCP_STATE_CONNECT + 1;
- }
- printf_debug("TCP客户端2状态 = %s\\r\\n", ReVal_Table[TcpState]);
-
- if(TcpState != TCP_STATE_CONNECT)
- {
- TcpConnect_Client2(Rem_IP, PORT_NUM, LocalPort_NUM2);
- }
- break;
-
- /* K3键按下,TCP客户端3建立连接 */
- case KEY_DOWN_K3:
- TcpState = tcp_get_state(socket_tcp3);
-
- /*
- TCP_STATE_CONNECT是最后一个状态,未创建连接的话,会返回数值255,这里就是专门处理
- 这种状态,将其设置下一个TCP_STATE_CONNECT+1,即我们这里自定义了一个未创建连接的
- 状态。
- */
- if(TcpState > TCP_STATE_CONNECT)
- {
- TcpState = TCP_STATE_CONNECT + 1;
- }
-
- printf_debug("TCP客户端3状态 = %s\\r\\n", ReVal_Table[TcpState]);
-
- if(TcpState != TCP_STATE_CONNECT)
- {
- TcpConnect_Client3(Rem_IP, PORT_NUM, LocalPort_NUM3);
- }
- break;
-
-
- /* 摇杆上键按下,TCP客户端1向TCP服务器发送4096字节数据 */
- case JOY_DOWN_U:
- TcpState = tcp_get_state(socket_tcp1);
- printf_debug("TCP客户端1状态 = %s\\r\\n", ReVal_Table[TcpState]);
- iCount = 4096;
- /* 保证已经建立连接了才可以发送数据 */
- if(TcpState == TCP_STATE_CONNECT)
- {
- do
- {
- tcpnet_poll();
- if (tcp_check_send (socket_tcp1) == __TRUE)
- {
- maxlen = tcp_max_dsize (socket_tcp1);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- /* 这里仅初始化了每次所发送数据包的前8个字节 */
- sendbuf = tcp_get_buf(maxlen);
- sendbuf[0] = 'a';
- sendbuf[1] = 'b';
- sendbuf[2] = 'c';
- sendbuf[3] = 'd';
- sendbuf[4] = 'e';
- sendbuf[5] = 'f';
- sendbuf[6] = 'g';
- sendbuf[7] = 'h';
-
- /* 测试发现只能使用获取的内存 */
- tcp_send (socket_tcp1, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- }
- break;
-
- /* 摇杆左键按下,TCP客户端2向TCP服务器发送4096字节数据 */
- case JOY_DOWN_L:
- TcpState = tcp_get_state(socket_tcp2);
- printf_debug("TCP客户端2状态 = %s\\r\\n", ReVal_Table[TcpState]);
- iCount = 4096;
- /* 保证已经建立连接了才可以发送数据 */
- if(TcpState == TCP_STATE_CONNECT)
- {
- do
- {
- tcpnet_poll();
- if (tcp_check_send (socket_tcp2) == __TRUE)
- {
- maxlen = tcp_max_dsize (socket_tcp2);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- /* 这里仅初始化了每次所发送数据包的前8个字节 */
- sendbuf = tcp_get_buf(maxlen);
- sendbuf[0] = 'a';
- sendbuf[1] = 'b';
- sendbuf[2] = 'c';
- sendbuf[3] = 'd';
- sendbuf[4] = 'e';
- sendbuf[5] = 'f';
- sendbuf[6] = 'g';
- sendbuf[7] = 'h';
-
- /* 测试发现只能使用获取的内存 */
- tcp_send (socket_tcp2, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- }
- break;
-
- /* 摇杆右键按下,TCP客户端3向TCP服务器发送4096字节数据 */
- case JOY_DOWN_R:
- TcpState = tcp_get_state(socket_tcp3);
- printf_debug("TCP客户端3状态 = %s\\r\\n", ReVal_Table[TcpState]);
- iCount = 4096;
- /* 保证已经建立连接了才可以发送数据 */
- if(TcpState == TCP_STATE_CONNECT)
- {
- do
- {
- tcpnet_poll();
- if (tcp_check_send (socket_tcp3) == __TRUE)
- {
- maxlen = tcp_max_dsize (socket_tcp3);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- /* 这里仅初始化了每次所发送数据包的前8个字节 */
- sendbuf = tcp_get_buf(maxlen);
- sendbuf[0] = 'a';
- sendbuf[1] = 'b';
- sendbuf[2] = 'c';
- sendbuf[3] = 'd';
- sendbuf[4] = 'e';
- sendbuf[5] = 'f';
- sendbuf[6] = 'g';
- sendbuf[7] = 'h';
-
- /* 测试发现只能使用获取的内存 */
- tcp_send (socket_tcp3, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- }
- break;
-
- /* 其他的键值不处理 */
- default:
- break;
- }
- }
- }
- }
复制代码
15.7.2 STM32F429开发板实验
配套例子:
V6-1016_RL-TCPnet实验_多个TCP客户端连接(裸机)
实验目的:
1. 学习RL-TCPnet的多个TCP客户端创建和数据收发。
实验内容:
1. 强烈推荐将网线接到路由器或者交换机上面测试,因为已经使能了DHCP,可以自动获取IP地址。
2. 客户端的例子相比服务器的例子稍麻烦些,因为客户端的例子需要用户知道电脑端IP和端口号。并根据实际情况设置IP和端口号的宏定义,这个配置在文件app_tcpnet_lib.c开头,测试的时候板子要连接这个IP和端口(下面是默认配置,一定要根据实际情况重新配置,如果不会配置,看本例程对应的教程即可):
#define IP1 192
#define IP2 168
#define IP3 1
#define IP4 2
#define PORT_NUM 1001
3. 本例程可以创建三个TCP Client,而且使能了局域网域名NetBIOS,用户只需在电脑端ping armfly就可以获得板子的IP地址,三个TCP Client的端口号分别是1024,1025和1026。
4. 用户可以在电脑端用网络调试软件创建TCP Server跟这三个客户端建立连接。执行下面5--10步的操作时,优先将电脑端的TCP Server建立起来!
5. 按键K1按下,创建TCP客户端1,并跟电脑端的TCP服务器建立连接。
6. 按键K2按下,创建TCP客户端2,并跟电脑端的TCP服务器建立连接。
7. 按键K3按下,创建TCP客户端3,并跟电脑端的TCP服务器建立连接。
8. 摇杆上键按下,TCP客户端1给电脑端的TCP服务器发送4096字节数据。
9. 摇杆左键按下,TCP客户端2给电脑端的TCP服务器发送4096字节数据。
10. 摇杆右键按下,TCP客户端3给电脑端的TCP服务器发送4096字节数据。
实验操作:
详见本章节15.6小节。
配置向导文件设置(Net_Config.c):
详见本章节15.3小节。
调试文件设置(Net_Debug.c):
详见本章节15.4小节。
程序设计:
主函数初始化
在main.c文件实现:
- /*
- *********************************************************************************************************
- * 函 数 名: main
- * 功能说明: 标准c程序入口。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- int main (void)
- {
- /* 初始化外设 */
- bsp_Init();
-
- /* 进入RL-TCPnet测试函数 */
- TCPnetTest();
- }
复制代码 硬件外设初始化
硬件外设的初始化是在 bsp.c 文件实现:
- /*
- *********************************************************************************************************
- * 函 数 名: bsp_Init
- * 功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_Init(void)
- {
- /*
- 由于ST固件库的启动文件已经执行了CPU系统时钟的初始化,所以不必再次重复配置系统时钟。
- 启动文件配置了CPU主时钟频率、内部Flash访问速度和可选的外部SRAM FSMC初始化。
-
- 系统时钟缺省配置为168MHz,如果需要更改,可以修改 system_stm32f4xx.c 文件
- */
- /* 优先级分组设置为4,可配置0-15级抢占式优先级,0级子优先级,即不存在子优先级。*/
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
-
- bsp_InitUart(); /* 初始化串口 */
- bsp_InitKey(); /* 初始化按键变量(必须在 bsp_InitTimer() 之前调用) */
- bsp_InitLed(); /* 初始LED指示灯端口 */
- bsp_InitTimer(); /* 初始化滴答定时器 */
- }
复制代码 三个TCP客户端的实现
三个TCP客户端实现都是一样的,我们这里仅以客户端1为例进行说明:
- #include "bsp.h"
- #include <RTL.h>
- #include <stdio.h>
- #include <Net_Config.h>
-
-
-
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug1 printf
- #else
- #define printf_debug1(...)
- #endif
-
-
- /*
- *********************************************************************************************************
- * 变量
- *********************************************************************************************************
- */
- uint8_t socket_tcp1;
-
-
- /*
- *********************************************************************************************************
- * 函 数 名: tcp_callback
- * 功能说明: TCP Socket的回调函数
- * 形 参: soc TCP Socket类型
- * evt 事件类型
- * ptr 事件类型是TCP_EVT_DATA,ptr指向的缓冲区记录着接收到的TCP数据,其余事件记录IP地址
- * par 事件类型是TCP_EVT_DATA,记录接收到的数据个数,其余事件记录端口号
- * 返 回 值: 主要是TCP_EVT_CONREQ事件使用,返回数值1允许连接,返回数值0禁止连接。
- *********************************************************************************************************
- */
- static U16 tcp_callback1 (U8 soc, U8 evt, U8 *ptr, U16 par)
- {
- char buf[50];
- uint16_t i;
-
- /* 确保是socket_tcp的回调 */
- if (soc != socket_tcp1)
- {
- return (0);
- }
-
- switch (evt)
- {
- /*
- 远程客户端连接消息
- 1、数组ptr存储远程设备的IP地址,par中存储端口号。
- 2、返回数值1允许连接,返回数值0禁止连接。
- */
- case TCP_EVT_CONREQ:
- sprintf(buf, "远程客户端请求连接IP: %d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);
- printf_debug1("IP:%s port:%d\\r\\n", buf, par);
- return (1);
-
- /* 连接终止 */
- case TCP_EVT_ABORT:
- break;
-
- /* Socket远程连接已经建立 */
- case TCP_EVT_CONNECT:
- printf_debug1("Socket is connected to remote peer\\r\\n");
- break;
-
- /* 连接断开 */
- case TCP_EVT_CLOSE:
- printf_debug1("Connection has been closed\\r\\n");
- break;
-
- /* 发送的数据收到远程设备应答 */
- case TCP_EVT_ACK:
- break;
-
- /* 接收到TCP数据帧,ptr指向数据地址,par记录数据长度,单位字节 */
- case TCP_EVT_DATA:
- printf_debug1("TCP客户端1接收到数据长度 = %d\\r\\n", par);
- for(i = 0; i < par; i++)
- {
- printf_debug1("ptr[%d] = %d\\r\\n", i, ptr[i]);
- }
- break;
- }
-
- return (0);
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: TcpConnect_Client1
- * 功能说明: 创建一个TCP Client
- * 形 参: _remip 要访问的远程IP地址
- * _remport 远程端口号
- * _localport 本地端口号
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void TcpConnect_Client1(uint8_t *_remip, uint16_t _remport, uint16_t _localport)
- {
- uint8_t res;
-
- /*
- 创建TCP Socket并连接,客户端连接服务器后,10秒内无数据通信将断开连接。
- 但是由于这里使能了TCP_TYPE_KEEP_ALIVE,会一直保持连接,不受10秒的时间限制。
- */
- socket_tcp1 = tcp_get_socket (TCP_TYPE_CLIENT | TCP_TYPE_KEEP_ALIVE, 0, 10, tcp_callback1);
- if(socket_tcp1 != 0)
- {
- res = tcp_connect (socket_tcp1, _remip, _remport, _localport);
- printf_debug1("TCP Socket创建成功res = %d\\r\\n", res);
- }
- }
复制代码 RL-TCPnet功能测试
这里专门创建了一个app_tcpnet_lib.c文件用于RL-TCPnet功能的测试。
- #include "bsp.h"
- #include <RTL.h>
- #include <stdio.h>
- #include <Net_Config.h>
-
-
-
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug printf
- #else
- #define printf_debug(...)
- #endif
-
-
- /*
- *********************************************************************************************************
- * 外部变量和函数调用
- *********************************************************************************************************
- */
- extern uint8_t socket_tcp1;
- extern void TcpConnect_Client1(uint8_t *_remip, uint16_t _remport, uint16_t _localport);
-
- extern uint8_t socket_tcp2;
- extern void TcpConnect_Client2(uint8_t *_remip, uint16_t _remport, uint16_t _localport);
-
- extern uint8_t socket_tcp3;
- extern void TcpConnect_Client3(uint8_t *_remip, uint16_t _remport, uint16_t _localport);
-
-
- /*
- *********************************************************************************************************
- * 宏定义,远程服务器的IP和端口
- *********************************************************************************************************
- */
- /* 要访问的远程服务器IP和端口配置,也就是电脑端调试助手设置的IP和端口号 */
- #define IP1 192
- #define IP2 168
- #define IP3 1
- #define IP4 2
-
- #define PORT_NUM 1001
-
- /* 这个是本地端口 */
- #define LocalPort_NUM1 1024
- #define LocalPort_NUM2 1025
- #define LocalPort_NUM3 1026
-
-
- /*
- *********************************************************************************************************
- * 变量
- *********************************************************************************************************
- */
- uint8_t Rem_IP[4] = {IP1,IP2,IP3,IP4};
-
- /* TCP状态的返回值 */
- const char * ReVal_Table[]=
- {
- "0: TCP_STATE_FREE",
- "1: TCP_STATE_CLOSED",
- "2: TCP_STATE_LISTEN",
- "3: TCP_STATE_SYN_REC",
- "4: TCP_STATE_SYN_SENT",
- "5: TCP_STATE_FINW1",
- "6: TCP_STATE_FINW2",
- "7: TCP_STATE_CLOSING",
- "8: TCP_STATE_LAST_ACK",
- "9: TCP_STATE_TWAIT",
- "10: TCP_STATE_CONNECT",
- "11: 连接还未创建",
- };
-
- /*
- *********************************************************************************************************
- * 函 数 名: tcpnet_poll
- * 功能说明: 使用TCPnet必须要一直调用的函数
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void tcpnet_poll(void)
- {
- if(bsp_CheckTimer(0))
- {
- bsp_LedToggle(2);
-
- /* 此函数坚决不可以放在中断里面跑 */
- timer_tick ();
- }
-
- main_TcpNet ();
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: TCPnetTest
- * 功能说明: TCPnet应用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void TCPnetTest(void)
- {
- int32_t iCount;
- uint8_t *sendbuf;
- uint16_t maxlen;
- uint8_t ucKeyCode;
- uint8_t TcpState;
-
-
- /* 初始化网络协议栈 */
- init_TcpNet ();
-
- /* 创建一个周期是100ms的软定时器 */
- bsp_StartAutoTimer(0, 100);
-
- while (1)
- {
- /* TCP轮询 */
- tcpnet_poll();
-
- /* 按键消息的处理 */
- ucKeyCode = bsp_GetKey();
- if (ucKeyCode != KEY_NONE)
- {
- switch (ucKeyCode)
- {
- /* K1键按下,TCP客户端1建立连接 */
- case KEY_DOWN_K1:
- TcpState = tcp_get_state(socket_tcp1);
-
- /*
- TCP_STATE_CONNECT是最后一个状态,未创建连接的话,会返回数值255,这里就是专门处理
- 这种状态,将其设置下一个TCP_STATE_CONNECT+1,即我们这里自定义了一个未创建连接的
- 状态。
- */
- if(TcpState > TCP_STATE_CONNECT)
- {
- TcpState = TCP_STATE_CONNECT + 1;
- }
- printf_debug("TCP客户端1状态 = %s\\r\\n", ReVal_Table[TcpState]);
-
- if(TcpState != TCP_STATE_CONNECT)
- {
- TcpConnect_Client1(Rem_IP, PORT_NUM, LocalPort_NUM1);
- }
- break;
-
- /* K2键按下,TCP客户端2建立连接 */
- case KEY_DOWN_K2:
- TcpState = tcp_get_state(socket_tcp2);
-
- /*
- TCP_STATE_CONNECT是最后一个状态,未创建连接的话,会返回数值255,这里就是专门处理
- 这种状态,将其设置下一个TCP_STATE_CONNECT+1,即我们这里自定义了一个未创建连接的
- 状态。
- */
- if(TcpState > TCP_STATE_CONNECT)
- {
- TcpState = TCP_STATE_CONNECT + 1;
- }
- printf_debug("TCP客户端2状态 = %s\\r\\n", ReVal_Table[TcpState]);
-
- if(TcpState != TCP_STATE_CONNECT)
- {
- TcpConnect_Client2(Rem_IP, PORT_NUM, LocalPort_NUM2);
- }
- break;
-
- /* K3键按下,TCP客户端3建立连接 */
- case KEY_DOWN_K3:
- TcpState = tcp_get_state(socket_tcp3);
-
- /*
- TCP_STATE_CONNECT是最后一个状态,未创建连接的话,会返回数值255,这里就是专门处理
- 这种状态,将其设置下一个TCP_STATE_CONNECT+1,即我们这里自定义了一个未创建连接的
- 状态。
- */
- if(TcpState > TCP_STATE_CONNECT)
- {
- TcpState = TCP_STATE_CONNECT + 1;
- }
-
- printf_debug("TCP客户端3状态 = %s\\r\\n", ReVal_Table[TcpState]);
-
- if(TcpState != TCP_STATE_CONNECT)
- {
- TcpConnect_Client3(Rem_IP, PORT_NUM, LocalPort_NUM3);
- }
- break;
-
-
- /* 摇杆上键按下,TCP客户端1向TCP服务器发送4096字节数据 */
- case JOY_DOWN_U:
- TcpState = tcp_get_state(socket_tcp1);
- printf_debug("TCP客户端1状态 = %s\\r\\n", ReVal_Table[TcpState]);
- iCount = 4096;
- /* 保证已经建立连接了才可以发送数据 */
- if(TcpState == TCP_STATE_CONNECT)
- {
- do
- {
- tcpnet_poll();
- if (tcp_check_send (socket_tcp1) == __TRUE)
- {
- maxlen = tcp_max_dsize (socket_tcp1);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- /* 这里仅初始化了每次所发送数据包的前8个字节 */
- sendbuf = tcp_get_buf(maxlen);
- sendbuf[0] = 'a';
- sendbuf[1] = 'b';
- sendbuf[2] = 'c';
- sendbuf[3] = 'd';
- sendbuf[4] = 'e';
- sendbuf[5] = 'f';
- sendbuf[6] = 'g';
- sendbuf[7] = 'h';
-
- /* 测试发现只能使用获取的内存 */
- tcp_send (socket_tcp1, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- }
- break;
-
- /* 摇杆左键按下,TCP客户端2向TCP服务器发送4096字节数据 */
- case JOY_DOWN_L:
- TcpState = tcp_get_state(socket_tcp2);
- printf_debug("TCP客户端2状态 = %s\\r\\n", ReVal_Table[TcpState]);
- iCount = 4096;
- /* 保证已经建立连接了才可以发送数据 */
- if(TcpState == TCP_STATE_CONNECT)
- {
- do
- {
- tcpnet_poll();
- if (tcp_check_send (socket_tcp2) == __TRUE)
- {
- maxlen = tcp_max_dsize (socket_tcp2);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- /* 这里仅初始化了每次所发送数据包的前8个字节 */
- sendbuf = tcp_get_buf(maxlen);
- sendbuf[0] = 'a';
- sendbuf[1] = 'b';
- sendbuf[2] = 'c';
- sendbuf[3] = 'd';
- sendbuf[4] = 'e';
- sendbuf[5] = 'f';
- sendbuf[6] = 'g';
- sendbuf[7] = 'h';
-
- /* 测试发现只能使用获取的内存 */
- tcp_send (socket_tcp2, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- }
- break;
-
- /* 摇杆右键按下,TCP客户端3向TCP服务器发送4096字节数据 */
- case JOY_DOWN_R:
- TcpState = tcp_get_state(socket_tcp3);
- printf_debug("TCP客户端3状态 = %s\\r\\n", ReVal_Table[TcpState]);
- iCount = 4096;
- /* 保证已经建立连接了才可以发送数据 */
- if(TcpState == TCP_STATE_CONNECT)
- {
- do
- {
- tcpnet_poll();
- if (tcp_check_send (socket_tcp3) == __TRUE)
- {
- maxlen = tcp_max_dsize (socket_tcp3);
- iCount -= maxlen;
-
- if(iCount < 0)
- {
- /* 这么计算没问题的 */
- maxlen = iCount + maxlen;
- }
-
- /* 这里仅初始化了每次所发送数据包的前8个字节 */
- sendbuf = tcp_get_buf(maxlen);
- sendbuf[0] = 'a';
- sendbuf[1] = 'b';
- sendbuf[2] = 'c';
- sendbuf[3] = 'd';
- sendbuf[4] = 'e';
- sendbuf[5] = 'f';
- sendbuf[6] = 'g';
- sendbuf[7] = 'h';
-
- /* 测试发现只能使用获取的内存 */
- tcp_send (socket_tcp3, sendbuf, maxlen);
- }
-
- }while(iCount > 0);
- }
- break;
-
- /* 其他的键值不处理 */
- default:
- break;
- }
- }
- }
- }
复制代码 |
|