上位机图像处理和嵌入式模块部署(f407 mcu中的udp server开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

既然lwip已经port到407上面了,接下来其实就可以做一些测试了。本身lwip支持tcp、udp,也支持client和server,既然我们选择了无os版本,那么功能上可以简单一点也行,这里我们就以udp server作为范例,看看407怎么和上位机配合进行测试。

1、测试代码逻辑

测试的逻辑不复杂,就是开发板上有两个按钮。按钮1按下去的时候,启动udp server;按钮2按下去的时候,结束udp server。其他报文处理逻辑没有发生改变。

	while(1)
	{
		if(Key_Scan(KEY1_GPIO_PORT,KEY1_PIN)==KEY_ON&&(flag==0))
		{
			LED1_ON;
			if (EthLinkStatus == 0)
			{
                printf("create udp server\n");
				/* Initialize the server application */ 
				udp_echoserver_init();
				flag=1;
			}
		}

		if(Key_Scan(KEY2_GPIO_PORT,KEY2_PIN)==KEY_ON&&(flag==1))
		{
			LED1_OFF;
			udp_echoserver_Stop();
			flag=0;
		}

		/* check if any packet received */
        if (ETH_CheckFrameReceived())
        { 
          /* process received ethernet packet */
          LwIP_Pkt_Handle();
        }

        /* handle periodic timers for LwIP */
        LwIP_Periodic_Handle(LocalTime);
	}

2、udp server的初始化

初始化比较简单,主要就是创建一个udp_pcb,把这个udp_pcb和对应的ip、port绑定在一起。如果没有问题,继续注册一个报文接收的回调函数。当然,如果出错的话,就删除这个udp_pcb。

void udp_echoserver_init(void)
{
   err_t err;
   
   /* Create a new UDP control block  */
   upcb = udp_new();
   
   if (upcb)
   {
     /* Bind the upcb to the UDP_PORT port */
     /* Using IP_ADDR_ANY allow the upcb to be used by any local interface */
      err = udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
      
      if(err == ERR_OK)
      {
        /* Set a receive callback for the upcb */
        udp_recv(upcb, udp_echoserver_receive_callback, NULL);
				#ifdef SERIAL_DEBUG
				printf("Start the server application\n");
				#endif
      }
      else
      {
        udp_remove(upcb);
        printf("can not bind pcb");
      }
   }
   else
   {
     printf("can not create pcb");
   } 
}

3、udp server的报文接收

如果有client端给udp server发送报文了,那么这个接收函数就会被调用到。毕竟,它也是在udp_echoserver_init函数中刚刚被注册上去的。首先,upcb会和client端的addr、port连接在一起,主要是为了发送报文用的。接着,打印一下接收到的内容。然后,把这些内容发送回去。最后,upcb会再次和addr、port分开。最后,收到的报文缓存p也会被释放掉。

原示例代码中的UDP_CLIENT_PORT要改成port。

void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
{
  char recdata[100]={0};
  /* Connect to the remote client */
  //udp_connect(upcb, addr, UDP_CLIENT_PORT);
	udp_connect(upcb, addr, port);
   
	#ifdef SERIAL_DEBUG
	memcpy((char *)recdata,p->payload,p->len);
	printf("upd_rec:%s\r\n",recdata);
	#endif	

  /* Tell the client that we have accepted it */
  udp_send(upcb, p);
	
  /* free the UDP connection, so we can accept new clients */
  udp_disconnect(upcb);
	
  /* Free the p buffer */
  pbuf_free(p);
   
}

4、udp server的停止

相比较前两个函数,udp server的停止就简单很多。直接调用udp_remove即可。

void udp_echoserver_Stop(void)
{
	#ifdef SERIAL_DEBUG
	printf("Stop the server application\n");
	#endif	

	udp_remove(upcb);
}

5、pc客户端准备

因为407开发板上面是一个udp server端,所以pc这边也要写一个udp client端。本着简单、方便的原则,我们用python写了一个udp客户端。

#!/usr/bin/python
import socket
import time

def send_udp_message(host, port, message):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        sock.sendto(message.encode(), (host, port))
        print(f"UDP message sent to {host}:{port}: {message}")
    except Exception as e:
        print(f"Error: {e}")
    
    time.sleep(0.05)

    response, server = sock.recvfrom(1024)
    print(f"Response received from server: {response.decode('utf-8')}")

if __name__ == '__main__':
    host = '192.168.0.122' 
    port = 5000        
    num = 0
    
    message = "Hello, this is a UDP message, "
    while True:
        send_udp_message(host, port, message + str(num))
        time.sleep(0.05) 
        num += 1

6、测试和验证

**按照之前的做法,需要把固件的ip改成192.168.0.122,网关改成192.168.0.1,pc的ip改成192.168.0.240。下面就是常规操作。**首先编译keil代码,烧录。接着复位启动,确认有打印,而且网口灯有闪烁。这个时候,按下按键1,在串口上确认udp server开启。后续的话,就可以用python启动udp client脚本。这样,开发板上的打印就是这样的,

而pc侧的打印就是这样的,有兴趣的同学可以自己测试下。

当然这个时候,大家可以按下2,看看打印会不会停止。

相关推荐
scan15 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
Qingniu015 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
深圳市青牛科技实业有限公司7 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比8 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie8 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
西瓜籽@9 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^1382879887211 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张12 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
千天夜12 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
m0_7393128715 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件