问大家一个小问题,请大家帮忙解答一下,关于LWIP的TCP

[复制链接]
2085|0
 楼主| onbluesun 发表于 2012-11-2 15:11 | 显示全部楼层 |阅读模式
lwIP, TCP, ST, TE, pc
我现在已经比较清楚如何建立TCP连接,发送TCP数据了,但是现在我想,如果PA0由高电平变化到低电平,那么单片机就向电脑不停地发送十六进制1,这段代码怎么加在程序里面呢?下面贴出我原来的代码,这段代码原本是用于TELNET上面,但是我只要有TCP数据就可以了。

  1. #include "ziji.h"

  2. #include "stm3210c_eval_lcd.h"

  3. #include "lwip/tcp.h"

  4. #include <string.h>

  5. #include <stdio.h>

  6. #define GREETING "欢迎进入8001端口\n\r\n\r"

  7. extern const uint8_t STM32F10x_STR[];

  8. #define HELLO "回答:"

  9. #define MAX_NAME_SIZE 32


  10. extern const uint8_t STM32F10x_STR[];

  11. {

  12.   int length;

  13.   char bytes[MAX_NAME_SIZE];

  14. };


  15. static err_t ziji_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err);

  16. static err_t ziji_accept(void *arg, struct tcp_pcb *pcb, err_t err);

  17. static void ziji_conn_err(void *arg, err_t err);

  18. static err_t ziji_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)

  19. {

  20.   struct pbuf *q;

  21.   struct name *name = (struct name *)arg;

  22.   int done;

  23.   char *c;

  24.   int i;


  25.   if (p != NULL)
  26.   {        

  27.         tcp_recved(pcb, p->tot_len);

  28.         if(!name)
  29.     {

  30.       pbuf_free(p);

  31.       return ERR_ARG;

  32.     }

  33.     done = 0;

  34.     for(q=p; q != NULL; q = q->next)
  35.     {

  36.       c = q->payload;

  37.       for(i=0; i<q->len && !done; i++)
  38.           {

  39.         done = ((c == '\r') || (c == '\n'));

  40.         if(name->length < MAX_NAME_SIZE)
  41.             {

  42.           name->bytes[name->length++] = c;

  43.         }

  44.       }

  45.     }

  46.     if(done)
  47.     {

  48.       if(name->bytes[name->length-2] != '\r' || name->bytes[name->length-1] != '\n')
  49.           {

  50.         if((name->bytes[name->length-1] == '\r' || name->bytes[name->length-1] == '\n') && (name->length+1 <= MAX_NAME_SIZE))
  51.             {

  52.               name->length += 1;

  53.         }
  54.             else if(name->length+2 <= MAX_NAME_SIZE)
  55.             {

  56.           name->length += 2;

  57.         }
  58.             else
  59.             {

  60.           name->length = MAX_NAME_SIZE;

  61.         }

  62.         name->bytes[name->length-2] = '\r';

  63.         name->bytes[name->length-1] = '\n';

  64.       }

  65.       tcp_write(pcb, HELLO, strlen(HELLO), 1);

  66.       tcp_write(pcb, name->bytes, name->length, TCP_WRITE_FLAG_COPY);

  67.                         
  68.       tcp_write(pcb, "\n\r", strlen("\n\r"), 1);

  69.                         
  70.       name->length = 0;

  71.     }

  72.         
  73.     pbuf_free(p);

  74.   }  

  75.   else if (err == ERR_OK)
  76.   {

  77.     mem_free(name);

  78.     return tcp_close(pcb);

  79.   }

  80.   return ERR_OK;


  81. }

  82. static err_t ziji_accept(void *arg, struct tcp_pcb *pcb, err_t err)

  83. {     

  84.   u32_t IPaddress;

  85.   u8_t iptxt[50];

  86.   volatile u8_t iptab[4];

  87.   

  88.   IPaddress = pcb->remote_ip.addr;

  89.    

  90.   iptab[0] = (u8_t)(IPaddress >> 24);

  91.   iptab[1] = (u8_t)(IPaddress >> 16);

  92.   iptab[2] = (u8_t)(IPaddress >> 8);

  93.   iptab[3] = (u8_t)(IPaddress);

  94.   

  95.   LCD_DisplayStringLine(Line5, iptxt);

  96.   

  97.   tcp_arg(pcb, mem_calloc(sizeof(struct name), 1));        
  98.   

  99.   tcp_err(pcb, ziji_conn_err);

  100.   tcp_recv(pcb, ziji_recv);

  101.   

  102.   tcp_write(pcb, GREETING, strlen(GREETING), 1);
  103.   

  104.   return ERR_OK;

  105. }

  106. void ziji_init(void)

  107. {

  108.   struct tcp_pcb *pcb;                                    
  109.   

  110.   pcb = tcp_new();                                                
  111.   tcp_bind(pcb, IP_ADDR_ANY, 8001);      

  112.   pcb = tcp_listen(pcb);                                
  113.   tcp_accept(pcb, ziji_accept);   

  114.                                                                                 
  115. }

  116. static void ziji_conn_err(void *arg, err_t err)

  117. {

  118.   struct name *name;

  119.   name = (struct name *)arg;

  120.   mem_free(name);

  121. }


请教大家,到底怎么修改呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部