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

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

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-29 22:28:33     打赏
3楼

你刚才说道:“这是我的代码,这是TCP服务器的 IP为 192.168.1.14 端口8000 串口波特是 9600
当TCP客户端连接上时,TCP客……”

 

我的意见如下:

改这一行
enc28j60WriteBuffer(len, (unsigned char *)uip_appdata);


助工
2013-05-30 07:25:20     打赏
4楼
利用单片机和ENC28J60实现TCP数据发送,现在有个问题是数据太长,我是存在EEPROM的,直接读取,再发送回有问题,需要将数据分N次读出,然后存到ENC28J60的发送缓冲区,然后再一次性发送出去,我在驱动中试了改几下,不能实现,望有高人指教啊!下面是发送的程序。我是结合uip0.9进行的。


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

院士
2013-05-31 21:39:53     打赏
6楼
九哥在加班啊

助工
2013-06-03 21:14:08     打赏
7楼
是啊,版主辛苦啦

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

 


高工
2013-06-06 20:12:45     打赏
9楼
改驱动,将这一函数
void enc28j60PacketSend(u16_t len, u8_t* packet)
分解成三个函数,比如:
void enc28j60PacketSendBegin(u16_t len)//开始发送,填充报头等
void enc28j60PacketSendBuffer(u16_t len, u8_t* packet)//填充数据,可多次调用
void enc28j60PacketSendEnd(u16_t crc)//报文准备完毕,填充CRC并发送

高工
2013-06-09 07:14:19     打赏
10楼
1.我在example0.c中的代码,判断如果收到的是'C'那么就会调用一次 uip_send()我看了那个uip_send函数就是把数据、长度这两个的值赋给uip_appdata、以及uip_len。这个时候是如何进行发送的呢?难道是当uip_send函数将数据指针设置后(此时uip_len就大于0了),然后通过uip_periodic()这个来发送数据的?还是另有途径呢?

2.如果我现在想在uip收到数据后,然后发送一串很长的数据,由于受单片机的RAM限制,我只能在网卡驱动函数中修改,在里面不断的读取EEPROM中的数据并送到网卡的缓冲中,当把所需要的数据读取到网卡的缓冲中后,再执行发送命令。这样就可以将数据发送出去了。但是有一个问题,在发送的数据中有IP头、TCP头之类的东东,这些东东放在哪里了?那些里面包含了数据的类型、数据长度等,这个我在哪里修改?我才是在packet里面,packet是uip_buf映射过来的,我分析了下uip_buf的结构发现前40字节好像是头信息,现在就是搞不明白这40字节里面那几个字节是数据长度的信息,希望指点下,这40个字节是如何分布的。我看了IP TCP协议,但是还是没有弄明白啊··

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

回复

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