OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5672|回复: 2

遇到三个问题类型 165 167 147-D,不知道怎么搞

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2021-1-9
在线时间
1 小时
发表于 2021-5-29 01:01:23 | 显示全部楼层 |阅读模式
2金钱
本帖最后由 Aspreat 于 2021-5-29 01:05 编辑

..\LWIP\lwip_app\tcp_client_demo\tcp_client_demo.c(163): error:  #165: too few arguments in function call
          es=(struct tcp_client_struct*)mem_malloc(sizeof(struct tcp_client_struct));  //申请内存
..\LWIP\lwip_app\tcp_client_demo\tcp_client_demo.c(302): error:  #167: argument of type "struct tcp_client_struct *" is incompatible with parameter of type "u8"
      if(es)mem_free(es);
..\LWIP\lwip_app\tcp_client_demo\tcp_client_demo.c(302): error:  #165: too few arguments in function call
      if(es)mem_free(es);
..\LWIP\lwip_app\tcp_client_demo\tcp_client_demo.c: 0 warnings, 3 errors
compiling tcp_server_demo.c...
..\LWIP\lwip_app\tcp_server_demo\tcp_server_demo.c(131): error:  #165: too few arguments in function call
      es=(struct tcp_server_struct*)mem_malloc(sizeof(struct tcp_server_struct)); //分配内存
..\LWIP\lwip_app\tcp_server_demo\tcp_server_demo.c(205): error:  #147-D: declaration is incompatible with "void tcp_server_error(void *, err_t)"  (declared at line 50 of "..\LWIP\lwip_app\tcp_server_demo\tcp_server_demo.h")
  void tcp_server_error(u8 *arg,err_t err)
..\LWIP\lwip_app\tcp_server_demo\tcp_server_demo.c(209): error:  #167: argument of type "u8 *" is incompatible with parameter of type "u8"
      if(arg!=NULL)mem_free(arg);//释放内存
..\LWIP\lwip_app\tcp_server_demo\tcp_server_demo.c(209): error:  #165: too few arguments in function call
      if(arg!=NULL)mem_free(arg);//释放内存
..\LWIP\lwip_app\tcp_server_demo\tcp_server_demo.c(213): error:  #147-D: declaration is incompatible with "err_t tcp_server_poll(void *, struct tcp_pcb *)"  (declared at line 51 of "..\LWIP\lwip_app\tcp_server_demo\tcp_server_demo.h")
  err_t tcp_server_poll(u8 *arg, struct tcp_pcb *tpcb)   




















  1. #include "tcp_client_demo.h"

  2. //////////////////////////////////////////////////////////////////////////////////         
  3. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  4. //ALIENTEK STM32F407开发板
  5. //TCP Client 测试代码          
  6. //正点原子@ALIENTEK
  7. //技术论坛:www.openedv.com
  8. //创建日期:2014/8/15
  9. //版本:V1.0
  10. //版权所有,盗版必究。
  11. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  12. //All rights reserved                                                                          
  13. //*******************************************************************************
  14. //修改信息
  15. //无
  16. //////////////////////////////////////////////////////////////////////////////////           

  17. //TCP Client接收数据缓冲区
  18. u8 tcp_client_recvbuf[TCP_CLIENT_RX_BUFSIZE];       
  19. //TCP服务器发送数据内容
  20. const u8 *tcp_client_sendbuf="Explorer STM32F407 TCP Client send data\r\n";

  21. //TCP Client 测试全局状态标记变量
  22. //bit7:0,没有数据要发送;1,有数据要发送
  23. //bit6:0,没有收到数据;1,收到数据了.
  24. //bit5:0,没有连接上服务器;1,连接上服务器了.
  25. //bit4~0:保留
  26. u8 tcp_client_flag;         

  27. //设置远端IP地址
  28. void tcp_client_set_remoteip(void)
  29. {
  30.         u8 *tbuf;
  31.         u16 xoff;
  32.         u8 key;
  33.         LCD_Clear(WHITE);
  34.         POINT_COLOR=RED;
  35.         LCD_ShowString(30,30,200,16,16,"Explorer STM32F4");
  36.         LCD_ShowString(30,50,200,16,16,"TCP Client Test");
  37.         LCD_ShowString(30,70,200,16,16,"Remote IP Set");  
  38.         LCD_ShowString(30,90,200,16,16,"KEY0:+  KEY2:-");  
  39.         LCD_ShowString(30,110,200,16,16,"KEY_UP:OK");  
  40.         tbuf=mymalloc(SRAMIN,100);        //申请内存
  41.         if(tbuf==NULL)return;
  42.         //前三个IP保持和DHCP得到的IP一致
  43.         lwipdev.remoteip[0]=lwipdev.ip[0];
  44.         lwipdev.remoteip[1]=lwipdev.ip[1];
  45.         lwipdev.remoteip[2]=lwipdev.ip[2];
  46.         sprintf((char*)tbuf,"Remote IP:%d.%d.%d.",lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2]);//远端IP
  47.         LCD_ShowString(30,150,210,16,16,tbuf);
  48.         POINT_COLOR=BLUE;
  49.         xoff=strlen((char*)tbuf)*8+30;
  50.         LCD_ShowxNum(xoff,150,lwipdev.remoteip[3],3,16,0);
  51.         while(1)
  52.         {
  53.                 key=KEY_Scan(0);
  54.                 if(key==WKUP_PRES)break;
  55.                 else if(key)
  56.                 {
  57.                         if(key==KEY0_PRES)lwipdev.remoteip[3]++;//IP增加
  58.                         if(key==KEY2_PRES)lwipdev.remoteip[3]--;//IP减少
  59.                         LCD_ShowxNum(xoff,150,lwipdev.remoteip[3],3,16,0X80);//显示新IP
  60.                 }
  61.         }
  62.         myfree(SRAMIN,tbuf);
  63. }


  64. //TCP Client 测试
  65. void tcp_client_test(void)
  66. {
  67.         struct tcp_pcb *tcppcb;          //定义一个TCP服务器控制块
  68.         struct ip_addr rmtipaddr;          //远端ip地址
  69.        
  70.         u8 *tbuf;
  71.         u8 key;
  72.         u8 res=0;               
  73.         u8 t=0;
  74.         u8 connflag=0;                //连接标记
  75.        
  76.         tcp_client_set_remoteip();//先选择IP
  77.         LCD_Clear(WHITE);        //清屏
  78.         POINT_COLOR=RED;         //红色字体
  79.         LCD_ShowString(30,30,200,16,16,"Explorer STM32F4");
  80.         LCD_ShowString(30,50,200,16,16,"TCP Client Test");
  81.         LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");  
  82.         LCD_ShowString(30,90,200,16,16,"KEY0:Send data");  
  83.         LCD_ShowString(30,110,200,16,16,"KEY_UP:Quit");  
  84.         tbuf=mymalloc(SRAMIN,200);        //申请内存
  85.         if(tbuf==NULL)return ;                //内存申请失败了,直接退出
  86.         sprintf((char*)tbuf,"Local IP:%d.%d.%d.%d",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);//服务器IP
  87.         LCD_ShowString(30,130,210,16,16,tbuf);  
  88.         sprintf((char*)tbuf,"Remote IP:%d.%d.%d.%d",lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);//远端IP
  89.         LCD_ShowString(30,150,210,16,16,tbuf);  
  90.         sprintf((char*)tbuf,"Remote Port:%d",TCP_CLIENT_PORT);//客户端端口号
  91.         LCD_ShowString(30,170,210,16,16,tbuf);
  92.         POINT_COLOR=BLUE;
  93.         LCD_ShowString(30,190,210,16,16,"STATUS:Disconnected");
  94.         tcppcb=tcp_new();        //创建一个新的pcb
  95.         if(tcppcb)                        //创建成功
  96.         {
  97.                 IP4_ADDR(&rmtipaddr,lwipdev.remoteip[0],lwipdev.remoteip[1],lwipdev.remoteip[2],lwipdev.remoteip[3]);
  98.                 tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected);  //连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数
  99.         }else res=1;
  100.         while(res==0)
  101.         {
  102.                 key=KEY_Scan(0);
  103.                 if(key==WKUP_PRES)break;
  104.                 if(key==KEY0_PRES)//KEY0按下了,发送数据
  105.                 {
  106.                         tcp_client_flag|=1<<7;//标记要发送数据
  107.                 }
  108.                 if(tcp_client_flag&1<<6)//是否收到数据?
  109.                 {
  110.                         LCD_Fill(30,230,lcddev.width-1,lcddev.height-1,WHITE);//清上一次数据
  111.                         LCD_ShowString(30,230,lcddev.width-30,lcddev.height-230,16,tcp_client_recvbuf);//显示接收到的数据                       
  112.                         tcp_client_flag&=~(1<<6);//标记数据已经被处理了.
  113.                 }
  114.                 if(tcp_client_flag&1<<5)//是否连接上?
  115.                 {
  116.                         if(connflag==0)
  117.                         {
  118.                                 LCD_ShowString(30,190,lcddev.width-30,lcddev.height-190,16,"STATUS:Connected   ");//提示消息               
  119.                                 POINT_COLOR=RED;
  120.                                 LCD_ShowString(30,210,lcddev.width-30,lcddev.height-190,16,"Receive Data:");//提示消息               
  121.                                 POINT_COLOR=BLUE;//蓝色字体
  122.                                 connflag=1;//标记连接了
  123.                         }
  124.                 }else if(connflag)
  125.                 {
  126.                         LCD_ShowString(30,190,190,16,16,"STATUS:Disconnected");
  127.                         LCD_Fill(30,210,lcddev.width-1,lcddev.height-1,WHITE);//清屏
  128.                         connflag=0;        //标记连接断开了
  129.                 }
  130.                 lwip_periodic_handle();
  131.                 delay_ms(2);
  132.                 t++;
  133.                 if(t==200)
  134.                 {
  135.                         if(connflag==0&&(tcp_client_flag&1<<5)==0)//未连接上,则尝试重连
  136.                         {
  137.                                 tcp_client_connection_close(tcppcb,0);//关闭连接
  138.                                 tcppcb=tcp_new();        //创建一个新的pcb
  139.                                 if(tcppcb)                        //创建成功
  140.                                 {
  141.                                         tcp_connect(tcppcb,&rmtipaddr,TCP_CLIENT_PORT,tcp_client_connected);//连接到目的地址的指定端口上,当连接成功后回调tcp_client_connected()函数
  142.                                 }
  143.                         }
  144.                         t=0;
  145.                         LED0=!LED0;
  146.                 }               
  147.         }
  148.         tcp_client_connection_close(tcppcb,0);//关闭TCP Client连接
  149.         myfree(SRAMIN,tbuf);
  150. }
  151. //lwIP TCP连接建立后调用回调函数
  152. err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
  153. {
  154.         struct tcp_client_struct *es=NULL;  
  155.         if(err==ERR_OK)   
  156.         {
  157.                 es=(struct tcp_client_struct*)mem_malloc(sizeof(struct tcp_client_struct));  //申请内存
  158.                 if(es) //内存申请成功
  159.                 {
  160.                         es->state=ES_TCPCLIENT_CONNECTED;//状态为连接成功
  161.                         es->pcb=tpcb;  
  162.                         es->p=NULL;
  163.                         tcp_arg(tpcb,es);                                //使用es更新tpcb的callback_arg
  164.                         tcp_recv(tpcb,tcp_client_recv);          //初始化LwIP的tcp_recv回调功能   
  165.                         tcp_err(tpcb,tcp_client_error);         //初始化tcp_err()回调函数
  166.                         tcp_sent(tpcb,tcp_client_sent);                //初始化LwIP的tcp_sent回调功能
  167.                         tcp_poll(tpcb,tcp_client_poll,1);         //初始化LwIP的tcp_poll回调功能
  168.                         tcp_client_flag|=1<<5;                                 //标记连接到服务器了
  169.                         err=ERR_OK;
  170.                 }else
  171.                 {
  172.                         tcp_client_connection_close(tpcb,es);//关闭连接
  173.                         err=ERR_MEM;        //返回内存分配错误
  174.                 }
  175.         }else
  176.         {
  177.                 tcp_client_connection_close(tpcb,0);//关闭连接
  178.         }
  179.         return err;
  180. }
  181. //lwIP tcp_recv()函数的回调函数
  182. err_t tcp_client_recv(void *arg,struct tcp_pcb *tpcb,struct pbuf *p,err_t err)
  183. {
  184.         u32 data_len=0;
  185.         struct pbuf *q;
  186.         struct tcp_client_struct *es;
  187.         err_t ret_err;
  188.         LWIP_ASSERT("arg != NULL",arg != NULL);
  189.         es=(struct tcp_client_struct *)arg;
  190.         if(p==NULL)//如果从服务器接收到空的数据帧就关闭连接
  191.         {
  192.                 es->state=ES_TCPCLIENT_CLOSING;//需要关闭TCP 连接了
  193.                 es->p=p;
  194.                 ret_err=ERR_OK;
  195.         }else if(err!= ERR_OK)//当接收到一个非空的数据帧,但是err!=ERR_OK
  196.         {
  197.                 if(p)pbuf_free(p);//释放接收pbuf
  198.                 ret_err=err;
  199.         }else if(es->state==ES_TCPCLIENT_CONNECTED)        //当处于连接状态时
  200.         {
  201.                 if(p!=NULL)//当处于连接状态并且接收到的数据不为空时
  202.                 {
  203.                         memset(tcp_client_recvbuf,0,TCP_CLIENT_RX_BUFSIZE);  //数据接收缓冲区清零
  204.                         for(q=p;q!=NULL;q=q->next)  //遍历完整个pbuf链表
  205.                         {
  206.                                 //判断要拷贝到TCP_CLIENT_RX_BUFSIZE中的数据是否大于TCP_CLIENT_RX_BUFSIZE的剩余空间,如果大于
  207.                                 //的话就只拷贝TCP_CLIENT_RX_BUFSIZE中剩余长度的数据,否则的话就拷贝所有的数据
  208.                                 if(q->len > (TCP_CLIENT_RX_BUFSIZE-data_len)) memcpy(tcp_client_recvbuf+data_len,q->payload,(TCP_CLIENT_RX_BUFSIZE-data_len));//拷贝数据
  209.                                 else memcpy(tcp_client_recvbuf+data_len,q->payload,q->len);
  210.                                 data_len += q->len;         
  211.                                 if(data_len > TCP_CLIENT_RX_BUFSIZE) break; //超出TCP客户端接收数组,跳出       
  212.                         }
  213.                         tcp_client_flag|=1<<6;                //标记接收到数据了
  214.                         tcp_recved(tpcb,p->tot_len);//用于获取接收数据,通知LWIP可以获取更多数据
  215.                         pbuf_free(p);          //释放内存
  216.                         ret_err=ERR_OK;
  217.                 }
  218.         }else  //接收到数据但是连接已经关闭,
  219.         {
  220.                 tcp_recved(tpcb,p->tot_len);//用于获取接收数据,通知LWIP可以获取更多数据
  221.                 es->p=NULL;
  222.                 pbuf_free(p); //释放内存
  223.                 ret_err=ERR_OK;
  224.         }
  225.         return ret_err;
  226. }
  227. //lwIP tcp_err函数的回调函数
  228. void tcp_client_error(void *arg,err_t err)
  229. {  
  230.         //这里我们不做任何处理
  231. }
  232. //lwIP tcp_poll的回调函数
  233. err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb)
  234. {
  235.         err_t ret_err;
  236.         struct tcp_client_struct *es;
  237.         es=(struct tcp_client_struct*)arg;
  238.         if(es!=NULL)  //连接处于空闲可以发送数据
  239.         {
  240.                 if(tcp_client_flag&(1<<7))        //判断是否有数据要发送
  241.                 {
  242.                         es->p=pbuf_alloc(PBUF_TRANSPORT, strlen((char*)tcp_client_sendbuf),PBUF_POOL);        //申请内存
  243.                         pbuf_take(es->p,(char*)tcp_client_sendbuf,strlen((char*)tcp_client_sendbuf));        //将tcp_client_sentbuf[]中的数据拷贝到es->p_tx中
  244.                         tcp_client_senddata(tpcb,es);//将tcp_client_sentbuf[]里面复制给pbuf的数据发送出去
  245.                         tcp_client_flag&=~(1<<7);        //清除数据发送标志
  246.                         if(es->p)pbuf_free(es->p);        //释放内存
  247.                 }else if(es->state==ES_TCPCLIENT_CLOSING)
  248.                 {
  249.                         tcp_client_connection_close(tpcb,es);//关闭TCP连接
  250.                 }
  251.                 ret_err=ERR_OK;
  252.         }else
  253.         {
  254.                 tcp_abort(tpcb);//终止连接,删除pcb控制块
  255.                 ret_err=ERR_ABRT;
  256.         }
  257.         return ret_err;
  258. }
  259. //lwIP tcp_sent的回调函数(当从远端主机接收到ACK信号后发送数据)
  260. err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
  261. {
  262.         struct tcp_client_struct *es;
  263.         LWIP_UNUSED_ARG(len);
  264.         es=(struct tcp_client_struct*)arg;
  265.         if(es->p)tcp_client_senddata(tpcb,es);//发送数据
  266.         return ERR_OK;
  267. }
  268. //此函数用来发送数据
  269. void tcp_client_senddata(struct tcp_pcb *tpcb, struct tcp_client_struct * es)
  270. {
  271.         struct pbuf *ptr;
  272.         err_t wr_err=ERR_OK;
  273.         while((wr_err==ERR_OK)&&es->p&&(es->p->len<=tcp_sndbuf(tpcb))) //将要发送的数据加入到发送缓冲队列中
  274.         {
  275.                 ptr=es->p;
  276.                 wr_err=tcp_write(tpcb,ptr->payload,ptr->len,1);
  277.                 if(wr_err==ERR_OK)
  278.                 {  
  279.                         es->p=ptr->next;                        //指向下一个pbuf
  280.                         if(es->p)pbuf_ref(es->p);        //pbuf的ref加一
  281.                         pbuf_free(ptr);                                //释放ptr
  282.                 }else if(wr_err==ERR_MEM)es->p=ptr;
  283.                 tcp_output(tpcb);                //将发送缓冲队列中的数据立即发送出去
  284.         }
  285. }
  286. //关闭与服务器的连接
  287. void tcp_client_connection_close(struct tcp_pcb *tpcb, struct tcp_client_struct * es)
  288. {
  289.         //移除回调
  290.         tcp_abort(tpcb);//终止连接,删除pcb控制块
  291.         tcp_arg(tpcb,NULL);  
  292.         tcp_recv(tpcb,NULL);
  293.         tcp_sent(tpcb,NULL);
  294.         tcp_err(tpcb,NULL);
  295.         tcp_poll(tpcb,NULL,0);  
  296.         if(es)mem_free(es);
  297.         tcp_client_flag&=~(1<<5);//标记连接断开了
  298. }






















复制代码





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2021-5-29 10:10:58 | 显示全部楼层
函数使用的参数少了?检查一下函数的使用 看看错误提示的地方有没有?
日常敲键--头秃一片
回复

使用道具 举报

13

主题

250

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2248
金钱
2248
注册时间
2019-8-7
在线时间
364 小时
发表于 2021-5-29 10:32:18 | 显示全部楼层
你的释放函数用的形参估计有问题,怎么会是个u8类型的值呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 17:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表