Проблема в не правильном указании адреса начало и конца чтения данных. У вас и на 100 байтах будут проблемы когда вы достигните конца выделенной памяти под сокет, после чего w5100 пошлет в сеть все что находится в выделенной памяти под другие сокеты а затем вернется на начало и все будет норм пока не достигнет опять конца выделенной памяти. В указании адреса нужно было накладывать
битовую маску. Ниже рабочий код передачи, посмотрите в чем отличия у вас и сделайте как у меня. И все будет ОК. Кстати такая же проблема у вас будет и при приеме данных, поэтому нужно сделать аналогичные изменения и для функции приема данных.
Код
void transmit(unsigned char socket_no,unsigned char get_size,unsigned char *packet)
{
unsigned int get_offset,fi,get_start_address,i8,;
unsigned int get_free_size;
unsigned char hi,low;
do
{
get_free_size=check_TX_buffer(2,Sock0);
}
while(get_free_size < get_size);
hi=wiz_rd(0x0424);
get_offset=hi;
low=wiz_rd(0x0425);
get_offset=(get_offset<<8)|low;
fi=(get_offset&0x07ff);
get_start_address =0x4000+ fi;
for(i8=0;i8<get_size;++i8)
{ if (get_start_address==0x4800){get_start_address=0x4000;}
wiz_wr( get_start_address++,packet[TCP_data+i8]);
++get_offset;
}
wiz_wr(Sn_TX_WR0(socket_no),(make8(get_offset,1)));
wiz_wr(Sn_TX_WR1(socket_no),(make8(get_offset,0)));
wiz_wr(Sn_CR(socket_no),Sn_CR_SEND);
while(wiz_rd(Sn_CR(socket_no)));
}
У меня теперь другая проблема с w5100. wireshark показывает что в обмене данных присутствует TCP Dup ACK и TCP Out-Of-Order пакеты
w5100 является клиентом(TCP) в сети и шлет на сервер PC пакет данных 107 байт , после чего сервер шлет ему ответ 17 байт. Почему в обмене присутствуют TCP Dup ACK и TCP Out-Of-Order? Проверялось в таких условиях - PC(сервер) свич w5100(клиент)
, поэтому проблем с сетью быть не может.
В принципе эта проблема не сильно напрягает но люди у которых к одному серверу подключено более 100 клиентов жалуются что на сервер идет лишняя нагрузка из за этих пакетов. Получается что w5100 не отсылает вовремя АСК пакет и сервер шлет повторно TCP Dup ACK. Что то я в регистрах напутал или это такая особенность W5100. Кто что скажет по этому поводу?
Вот какой лог обмена данными показывает программа wireshark. 172.17.226.3 (клиент w5100)
172.17.229.94(сервер ПК)
Код
56 3.717 172.17.226.3 172.17.229.94 TCP commplex-main > commplex-main [PSH, ACK] Seq=1 Ack=1 Win=2048 Len=107
58 3.886 172.17.229.94 172.17.226.3 TCP commplex-main > commplex-main [ACK] Seq=1 Ack=108 Win=64679 Len=0
59 3.886 172.17.229.94 172.17.226.3 TCP [TCP Dup ACK 58#1] commplex-main > commplex-main [ACK] Seq=1 Ack=108 Win=64679 Len=0
60 4.015 172.17.229.94 172.17.226.3 TCP commplex-main > commplex-main [PSH, ACK] Seq=1 Ack=108 Win=64679 Len=17
61 4.015 172.17.229.94 172.17.226.3 TCP [TCP Out-Of-Order] commplex-main > commplex-main [PSH, ACK] Seq=1 Ack=108 Win=64679 Len=17
64 4.217 172.17.226.3 172.17.229.94 TCP commplex-main > commplex-main [ACK] Seq=108 Ack=18 Win=2048 Len=0