STM32的tcp_echoserver例程解说

1.C/S网络程序的工作流程,如图:

2.ST关于TCP的例程分为client和server,根据字面意思,可以知道tcp_echoserver例程是将STM32作为server来用。而例程的第一步呢,便是初始化,调用的是tcp_echoserver_init()函数。

    在tcp_echoserver_init()函数里,主要做了这么几件事情:
     1. 创建一个新的TCP协议控制块
     2. 绑定地址和端口号(port)
     3. 开始监听(listen)
     4. 设置accept的回调函数

    其完整代码如下:

void tcp_echoserver_init(void)  
{  
  //创建一个新的TCP控制块  
  tcp_echoserver_pcb = tcp_new();  
  
  if (tcp_echoserver_pcb != NULL)  
  {  
    err_t err;  
      
    //绑定到端口7  
    err = tcp_bind(tcp_echoserver_pcb, IP_ADDR_ANY, 7);  
      
    if (err == ERR_OK)  
    {  
      //开始监听  
      tcp_echoserver_pcb = tcp_listen(tcp_echoserver_pcb);  
        
      //设置tcp_echoserver_accept为accept的回调函数  
      tcp_accept(tcp_echoserver_pcb, tcp_echoserver_accept);  
    }  
    else   
    {  
      printf("Can not bind pcb\n");  //norains 2011-7-4 comment  
    }  
  }  
  else  
  {  
    printf("Can not create new pcb\n");   //norains 2011-7-4 comment  
  }  
}  

当客户端开始连接之后,那么被设置的tcp_echoserver_accept()回调函数就会被调用。该函数主要是创建一个新的数据结构,并且将该数据结构传递给底层的TCP,最后分别是设置receive,error和poll这三个回调函数。
  
  tcp_echoserver_accept()代码如下所示:

static err_t tcp_echoserver_accept(void *arg, struct tcp_pcb *newpcb, err_t err)  
{  
  err_t ret_err;  
  struct tcp_echoserver_struct *es;  
  
  LWIP_UNUSED_ARG(arg);  
  LWIP_UNUSED_ARG(err);  
  
  ///给新的连接设置优先级  
  tcp_setprio(newpcb, TCP_PRIO_MIN);  
  
  //分配一个结构体空间以保持TCP的连接  
  es = (struct tcp_echoserver_struct *)mem_malloc(sizeof(struct tcp_echoserver_struct));  
  if (es != NULL)  
  {  
    es->state = ES_ACCEPTED;  
    es->pcb = newpcb;  
    es->p = NULL;  
      
    //传递新分配的结构体数据给新的pcb  
    tcp_arg(newpcb, es);  
      
    //为新的连接设置receive回调函数   
    tcp_recv(newpcb, tcp_echoserver_recv);  
      
    //为新的连接设置error回调函数  
    tcp_err(newpcb, tcp_echoserver_error);  
      
    //为新的连接设置poll回调函数  
    tcp_poll(newpcb, tcp_echoserver_poll, 1);  
      
    ret_err = ERR_OK;  
  }  
  else  
  {  
    /* return memory error */  
    ret_err = ERR_MEM;  
  }  
  return ret_err;    
}  

接下来便是tcp_echoserver_recv()这个回调函数,因为该函数比较大,这里就不再全部罗列代码了。对于使用者来说,只需要知道相应的判定条件来代表什么意思就足够了,如:

static err_t tcp_echoserver_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)  
{  
  struct tcp_echoserver_struct *es;  
  err_t ret_err;  
  
  LWIP_ASSERT("arg != NULL",arg != NULL);  
    
  es = (struct tcp_echoserver_struct *)arg;  
  
  if (p == NULL)  
  {  
   //如果接收到空的帧,则释放连接  
   ...  
  }     
  else if(err != ERR_OK)  
  {  
   //接收到一个非空的帧,但可能某些原因出错,导致返回值不为ERR_OK,故在此释放缓存  
   ...  
  }  
  else if(es->state == ES_ACCEPTED)  
  {  
   //连接成功,在这里需要设置sent回调函数  
   ...  
  }  
  else if (es->state == ES_RECEIVED)  
  {  
   //从客户端收到数据  
   ...  
  }  
  else  
  {  
   //当连接关闭时,还收到了数据  
   ...  
  
  }  
    
  return ret_err;  
}  

 

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 中景园电子是一家专业生产OLED显示屏的公司,他们的0.96寸OLED显示屏适用于STM32 ZET系列开发板,并且可以通过SPI接口连接。下面我将简要介绍如何在STM32开发板上使用该OLED显示屏。 首先,我们需要在STM32开发板上连接OLED显示屏。可以将OLED的VCC引脚连接STM32的3.3V电源引脚,GND引脚连接到GND,SDA引脚连接STM32的SPI MOSI引脚,SCL引脚连接到SPI SCK引脚,RES引脚连接到任意GPIO引脚,DC引脚连接到SPI CS引脚。另外,为了保证数据传输的稳定性,可以在VCC和GND之间加入一个电容。 接下来,在STM32的代码中引入OLED的库函数,并初始化SPI接口。可以使用STM32提供的标准库函数来实现SPI的初始化,包括初始化SPI的时钟源、引脚、速率等参数。然后,利用库函数对OLED进行初始化,设置其工作模式、亮度、对比度等参数。 在完成初始化之后,我们可以通过库函数来控制OLED显示屏的操作。例如,通过设置点亮的像素来显示图形和字符,可以在屏幕的指定位置绘制线条、矩形和圆等图形,也可以显示文字,甚至可以进行动画的显示。 通过以上步骤,我们可以在STM32开发板上通过SPI接口使用中景园电子的0.96寸OLED显示屏。可以根据实际需求编写相应的代码,实现各种丰富的显示效果。希望以上的回答对您有所帮助。 ### 回答2: 中景园电子0.96oled显示屏是一款高清显示屏,采用了0.96英寸的OLED屏幕,具有显示效果优良、显示画面清晰等特点。该显示屏可以通过SPI总线与STM32ZET系列微控制器进行通信。 在使用中景园电子0.96oled显示屏时,我们可以使用STM32ZET系列微控制器提供的SPI外设来与显示屏进行通信。SPI是一种同步串行通信协议,通过传输时钟、数据、以及控制信号来实现数据的传输。我们可以通过配置SPI外设的寄存器来实现与显示屏的通信。 在使用SPI来控制中景园电子0.96oled显示屏时,我们需要先配置SPI的时钟分频因子、数据传输位序、数据传输模式等参数。然后,可以通过向SPI发送特定命令来控制显示屏的初始化、设置显示位置、写入数据等操作。 例如,可以使用SPI向显示屏发送指令0xAE来关闭显示,使用指令0xAF来开启显示。可以使用指令0x20和0x21来设置显示位置等。 此外,为了简化编程的过程,我们可以参考STM32ZET系列微控制器的SPI例程进行开发。例程中会提供一些用于配置SPI的代码和一些操作显示屏的示例代码。我们可以根据自己的需求进行修改和扩展,以实现更丰富的显示功能。 综上所述,中景园电子0.96oled显示屏与STM32ZET系列微控制器的SPI外设结合使用,可以实现高清、清晰的显示效果。通过合理配置SPI参数和使用相关指令,我们可以实现对显示屏的初始化、控制和数据操作等功能。通过参考SPI例程,我们可以快速上手并进行开发。 ### 回答3: 中景园电子的0.96 OLED显示屏与STM32ZET系列芯片的SPI接口可以通过以下例程进行操作。 首先,需要在STM32ZET系列芯片的开发环境中导入相关的库文件。然后,在主函数中进行初始化设置,包括引脚设置、SPI初始化和OLED显示屏的初始化等。 接下来,在主循环中,可以通过SPI接口与0.96 OLED显示屏进行通信。在传输数据之前,先向OLED发送指令以选择相应的显示模式或设置参数。然后,根据需要调用相应的函数发送数据到OLED显示屏上。例如,可以使用spi_transfer函数将需要显示的数据传输到OLED显示屏的缓冲区中。最后,调用更新显示函数,将缓冲区中的数据显示在屏幕上。 需要注意的是,SPI传输是通过片选信号进行控制的。通过拉低片选信号(选通OLED显示屏),可以与OLED进行通信;反之,拉高片选信号(非选通OLED显示屏),可以与其他SPI设备进行通信。 此外,还可以根据需要添加其他功能,如图形绘制、文字显示等。 总结来说,中景园电子的0.96 OLED显示屏与STM32ZET系列芯片的SPI接口可以通过适当的库文件和例程进行初始化和通信设置,让开发者能够实现自定义的显示内容和功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值