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

共5条 1/1 1 跳转至

ENC28J60 发送缓冲区的写入?

助工
2013-05-27 22:17:47     打赏
利用单片机和ENC28J60实现TCP数据发送,现在有个问题是数据太长,我是存在EEPROM的,直接读取,再发送回有问题,需要将数据分N次读出,然后存到ENC28J60的发送缓冲区,然后再一次性发送出去,我在驱动中试了改几下,不能实现,望有高人指教啊!下面是发送的程序。我是结合uip0.9进行的。
  1. #define ETHERNET_MIN_PACKET_LENGTH 0x3C
  2. #define ETHERNET_HEADER_LENGTH 0x0E
  3. #define IP_TCP_HEADER_LENGTH 40
  4. #define TOTAL_HEADER_LENGTH (IP_TCP_HEADER_LENGTH+ETHERNET_HEADER_LENGTH)
  5. void enc28j60PacketSend(u16_t len, u8_t* packet)
  6. {
  7. // Set the write pointer to start of transmit buffer area
  8. enc28j60Write(EWRPTL, TXSTART_INIT);
  9. enc28j60Write(EWRPTH, TXSTART_INIT>>8);
  10. // Set the TXND pointer to correspond to the packet size given
  11. enc28j60Write(ETXNDL, (TXSTART_INIT+len));
  12. enc28j60Write(ETXNDH, (TXSTART_INIT+len)>>8);
  13. // write per-packet control byte
  14. enc28j60WriteOp(ENC28J60_WRITE_BUF_MEM, 0, 0x00);
  15. // TODO, fix this up

  16. if( uip_len <= TOTAL_HEADER_LENGTH )
  17. {
  18. // copy the packet into the transmit buffer
  19. enc28j60WriteBuffer(len, packet);
  20. }
  21. else
  22. {
  23. len -= TOTAL_HEADER_LENGTH;
  24. enc28j60WriteBuffer(TOTAL_HEADER_LENGTH, packet);
  25. enc28j60WriteBuffer(len, (unsigned char *)uip_appdata);
  26. }
  27. // Errata workaround #12, reset TX logic
  28. // send the contents of the transmit buffer onto the network
  29. enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRTS);
  30. }



关键词: ENC28J60     发送     缓冲区     写入    

助工
2013-05-28 21:57:38     打赏
2楼
这是我的代码,这是TCP服务器的 IP为 192.168.1.14 端口8000 串口波特是 9600
当TCP客户端连接上时,TCP客户端发送‘C’,服务器就会返回一串信息,我现在想让 TCP服务器接收到‘C’后,不是发送那一串数据,而是发送里一个很长的数据,而此时单片机的RAM不够用,需要将这个数据先存入 ENC28J60的发送缓冲中,最后再一次发送。有高人指点说是可以在网卡驱动中编写边发送,但是我还是不知道这么修改啊,现在代码都弄上来了,有人有空给看看啊,呵呵~~多谢了~~~~

助工
2013-05-31 21:28:23     打赏
3楼
我开始有改过,但是不行。就是在发送函数,开始的时候有个申请缓冲空间大小,这个和len有关,如果在后面轻易修改,最后会出错额。
还有一个疑问就是,我们发送数据的时候,对方的TCP客户端,是要返回信息的,如果我在这里吧这个enc28j60writebuffer(...)里的长度,内容改了,那返回的信息和大程序中的会不会对不上,导致发送失败啊······
问题有点乱额·····

助工
2013-06-05 20:51:51     打赏
4楼
我想您说的要修改的函数应该是关键的,但是好像还有许多其他的地方需要修改的额···
关于IP和TCP头的格式的类型、数据长度、·····

 


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

当接收到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........”数据后,就没有返回了,卡住了好像·················额··············

共5条 1/1 1 跳转至

回复

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