这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » ENC28J60 发送缓冲区的写入?

共23条 2/3 1 2 3 跳转至
高工
2013-06-13 21:51:05     打赏
11楼
麻烦有空帮看看8#的问题啊~~
谢谢~~~~

助工
2013-06-17 07:44:07     打赏
12楼
kaly_liu 发表于 2013-5-22 10:29
请问这一段代码表示什么意思啊,主要是那个if···

如果有上层数据,则先发送包头,再发送上层数据,否则,直接发送包头。
这段代码与上层有关联,要结合上层去看。。

助工
2013-06-18 06:55:45     打赏
13楼

当接收到TCP数据,执行如下的代码,将受到的TCP数据发回去。

void example0_app(void)

{

u16_ti;//

if(uip_connected()){

printu("example0 is connected!\r\n");

}

if(uip_newdata()|| uip_rexmit()) {

printu("example0is uip_newdata!\r\n");

for(i=0;i<uip_len;i++) {

printuf("%c",uip_appdata); //输出字符串

}

if(uip_appdata[0]=='C'){

uip_send(&uip_appdata[0],uip_len);

}

}

}


我在enc28j60.c的程序中,将驱动添加了如下的红色代码,想如果收到数据的第二位是‘q’就把它换成‘x’然后再发回去的,但是我发现如果我输入数据”Cbcdefg”可以正确的返回的,但是如果我输入”Cqcdefg”就没有返回了,好像卡住了似得,需要重新断开TCP连接,然后再连上,才可以工作(但,还是不可以发送第二个是’q’的数据的)不知道问题出在哪里了?

void enc28j60PacketSend(u16_t len, u8_t*packet)

{

// Set the write pointer to start of transmit buffer area

enc28j60Write(EWRPTL,TXSTART_INIT);

enc28j60Write(EWRPTH, TXSTART_INIT>>8);

// Set the TXND pointer to correspond to the packet size given

enc28j60Write(ETXNDL,(TXSTART_INIT+len));

enc28j60Write(ETXNDH, (TXSTART_INIT+len)>>8);

enc28j60WriteOp(ENC28J60_WRITE_BUF_MEM,0, 0x00);


if( uip_len<= TOTAL_HEADER_LENGTH ){

enc28j60WriteBuffer(len, packet);

}

else

{ len -= TOTAL_HEADER_LENGTH;

enc28j60WriteBuffer(TOTAL_HEADER_LENGTH, packet);

if(uip_appdata[1]=='q') uip_appdata[1]='x';

enc28j60WriteBuffer(len, (unsigned char *)uip_appdata);

}

enc28j60WriteOp(ENC28J60_BIT_FIELD_SET,ECON1, ECON1_TXRTS);

}



我更新了,2#,的代码了··

TCP服务器,ip192.168.1.14 端口是 8000

需要用TCP客户端连上去。开机后,小等一下再连。


客户端TCP发送 “C.......”的数据就会返回元数据,但是当客户端发送“Cq........”数据后,就没有返回了,卡住了好像·················额··············

高工
2013-06-19 06:54:01     打赏
14楼
我就改了一个字符,这个数据的类型、长度什么的都没变,应该是可以发送回来的啊,是什么原因呢?

助工
2013-06-21 06:10:37     打赏
15楼
首先是我的 11#问题要麻烦您看看,我目前还没解决啊。
其次是我另外改了下程序:如果收到一串数据,那么就在程序中将这段数据复制下,然后将这两串数据写入发送缓冲区,再一次性发送出去,结果还是不行···我实在是不知道哪里还可以改了,球指教啊!第二个我修改的代码如下,我把程序改为了三步,第一步写入长度初始化发送缓冲区,并修改数据包头里的长度信息;第二步写入数据,根据数据长度写入数据的头和数据包;第三部发送数据;具体代码如下:
  1. void dev_send(void)
  2. {
  3. if(uip_appdata[1]=='q')
  4. {
  5. uip_len=(uip_len - TOTAL_HEADER_LENGTH)*2;
  6. uip_buf[17]=uip_len>>8;
  7. uip_buf[18]=uip_len;
  8. }
  9. enc28j60Packet_len(uip_len);
  10. enc28j60Packet_data(uip_len, uip_buf);
  11. enc28j60Packet_Send();
  12. }
复制代码
  1. void enc28j60Packet_data(u16_t len,u8_t* packet)
  2. { if( uip_len <= TOTAL_HEADER_LENGTH )
  3. {
  4. enc28j60WriteBuffer(len, packet);
  5. }
  6. else
  7. { len -= TOTAL_HEADER_LENGTH;
  8. enc28j60WriteBuffer(TOTAL_HEADER_LENGTH, packet);
  9. if(uip_appdata[1]=='q')
  10. {
  11. len=len/2;
  12. enc28j60WriteBuffer(len, (unsigned char *)uip_appdata);
  13. enc28j60WriteBuffer(len, (unsigned char *)uip_appdata);
  14. }
  15. else
  16. enc28j60WriteBuffer(len, (unsigned char *)uip_appdata);
  17. }

助工
2013-06-24 17:52:59     打赏
16楼
改了这个,也不行哦~~~~我分析的结果是:uip_buf的第12 13 是length;16 17 是TCP的length。

高工
2013-06-25 06:04:40     打赏
17楼
稍微看了一遍你的代码,感觉不会出现你11#描述的情况。。你尝试跟踪一下看看吧

助工
2013-06-26 06:37:49     打赏
18楼
虽然还是没有解决,但是还是先谢谢各位的热心帮助啊~~~本帖继续等待解答啊~~~~


1.我在example0.c中的代码,判断如果收到的是'C'那么就会调用一次 uip_send()我看了那个uip_send函数就是把数据、长度这两个的值赋给uip_appdata、以及uip_len。这个时候是如何进行发送的呢?程序跑到哪里去了呢??是怎么执行的??

高工
2013-06-27 05:25:52     打赏
19楼
你看看UIP的代码,如果有数据要发送,UIP会自动填充各层包头,将数据发送出去的。

助工
2013-06-28 06:46:45     打赏
20楼
最后发送数据肯定会调用dev_send()所以我想在网卡驱动里面改了··可惜不行哦··,说不定是在修改数据的时候单片机的RAM被用光了,导致跑飞了···纯属自己的猜测额····还是自己在琢磨琢磨!!

共23条 2/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]