0
【前言】CH32V307拥有网卡,通过网络控制板载的外设是非常的方便,下面演示如何通过TCP通信来控制板载的LED1的亮跟灭。
1、选取ETH的TcpClient作为基础进行修改。打开例程:
2、加入PA0的初始化函数:
- /*********************************************************************
- * @fn LED1_BLINK_INIT
- *
- * [url=home.php?mod=space&uid=2666770]@Brief[/url] LED1通过直接调用底层驱动
- *
- * [url=home.php?mod=space&uid=1141835]@Return[/url] none
- */
- void LED1_BLINK_INIT(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure={0};
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
复制代码 3、修改TCP接收函数:主要是判断接收到的数据中有没有LED_ON、LED_OFF,如果有做出相应的判断,如果没有就返回错误信息:
- void WCHNET_HandleSockInt(u8 sockeid,u8 initstat)
- {
- u32 len,len_error,len_led_on,len_led_off ;
- uint8_t send_buf[] = "COMMAD ERROR:";
- uint8_t led_on_buf[] = "LED_ON!rn";
- uint8_t led_off_buf[] = "LED_OFF!rn";
- len_error = sizeof(send_buf);
- len_led_on = sizeof(led_on_buf);
- len_led_off = sizeof(led_off_buf);
- if(initstat & SINT_STAT_RECV) /* socket接收中断*/
- {
- len = WCHNET_SocketRecvLen(sockeid,NULL); /* 获取socket缓冲区数据长度 */
- printf("WCHNET_SocketRecvLen %d rn",len);
- WCHNET_SocketRecv(sockeid,MyBuf,&len); /* 获取socket缓冲区数据 */
- if (strstr(MyBuf,"LED_ON" )!= NULL)
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_0);
- WCHNET_SocketSend(sockeid,led_on_buf,&len_led_on);
- }
- else if (strstr(MyBuf,"LED_OFF" )!= NULL)
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_0);
- WCHNET_SocketSend(sockeid,led_off_buf,&len_led_off);
- }
- else {
- {
- WCHNET_SocketSend(sockeid,send_buf,&len_error);
- WCHNET_SocketSend(sockeid,MyBuf,&len); /* 演示回传数据 */
- }
- }
- }
- if(initstat & SINT_STAT_CONNECT) /* socket连接成功中断*/
- {
- printf("TCP Connect Successrn");
- }
- if(initstat & SINT_STAT_DISCONNECT) /* socket连接断开中断*/
- {
- printf("TCP Disconnectrn");
- }
- if(initstat & SINT_STAT_tiM_OUT) /* socket连接超时中断*/
- {
- printf("TCP Timoutrn"); /* 延时200ms,重连*/
- Delay_Ms(200);
- WCHNET_CreatTcpSocket();
- }
- }
复制代码 4、修改IP地址:
- u8 MACAddr[6]; /*Mac地址*/
- u8 IPAddr[4] = {192,168,3,10}; /*指定本机IP地址*/
- u8 GWIPAddr[4] = {192,168,3,1}; /*网关:路由器IP*/
- u8 IPMask[4] = {255,255,255,0}; /*子网掩码*/
- u8 DESIP[4] = {192,168,3,192}; /*需要连接服务器IP地址*/
- u8 SocketId; /*socket id号*/
- u8 SocketRecvBuf[WCHNET_MAX_SOCKET_NUM][RECE_BUF_LEN]; /*socket缓冲区*/
- u8 MyBuf[RECE_BUF_LEN];
- u16 desport=1000; /*目的端口号*/
- u16 srcport=1000; /*源端口号*/
复制代码 5、打开TcpServer工具、端口为1000,并打开server监听。
:
6、下载固件后,串口打印出网络连接信息:
7、TCP工具发送LED_ON,LED_OFF,开发板上的灯就会相应的状态改变,并返回服务器信息:
【总结】做为tcpclient网络控制外设非常方便。强大的网络,相比串口方便许多。还等什么,快来玩CH32V307吧!!
TCPLED
|
|