arduino-libraries / WiFi

WiFi Library for Arduino
http://arduino.cc/
115 stars 58 forks source link

read(buf, len) bug....Found error in code... #27

Open agdl opened 8 years ago

agdl commented 8 years ago

From @glennkreisel on December 21, 2013 6:29

UPDATE*\ I have fixed this code in the udp_dev version..

in ard_utils.c

bool getTcpData(uint8_t sock, void** payload, uint16_t* len)
{
        tData* p = NULL;
        p = get_pBuf(sock);
        if (p != NULL)
        {
                *payload = p->data;
                *len = p->len;
                return true;
        }
        return false;
}

This function should return only the unread contents but instead the whole buffer of old and new data is returned. Even though the read(buf, len) from arduino only asks for 10 bytes. This should accept a LENGTH var and return the data at the current p->idx location up to end of buffered data or LENGTH reached... This makes the WiFi code on arduino fail for wificlient.read(buf, len)..
So currently you can ONLY read one byte at a time and it is very slow with all the SPI traffic for each byte.

This is called in: ard_spi.c This routine should accept another param of LENGTH from the arduino and only read that many bytes in the call to GetTcpData.

cmd_spi_state_t get_databuf_tcp_cmd_cb(char* recv, char* reply, void* ctx, uint16_t* count) {

        uint8_t* data;
        uint16_t len;

    CHECK_ARD_NETIF(recv, reply, count);

    if ((recv[3]==1)&&(recv[4]>=0)&&(recv[4]<MAX_SOCK_NUM))
    {
            if (getTcpData((uint8_t)recv[4], (void**)&data, &len))
            {
                    CREATE_HEADER_REPLY(reply, recv, PARAM_NUMS_1);
                    PUT_BUFDATA_INT(data, len, reply, 3);
                    END_HEADER_REPLY(reply, 3+len+2+1, *count);
                    freeTcpData((uint8_t)recv[4]);
            }else{
                    CREATE_HEADER_REPLY(reply, recv, PARAM_NUMS_0);
                    END_HEADER_REPLY(reply, 3, *count);
            }
    }
    return SPI_CMD_DONE;
}

Copied from original issue: arduino/Arduino#1752

agdl commented 8 years ago

From @fpoto on December 27, 2013 16:56

Is this related to https://github.com/arduino/Arduino/issues/1644 ?

agdl commented 8 years ago

From @glennkreisel on December 27, 2013 19:34

Yes! the function was not implemented practically. I've submitted code but have not heard a word from anyone. I do not have the AVR32 compiler to compile HEX file.. etc.. Any help getting my modified code in?

agdl commented 8 years ago

From @q2dg on August 27, 2015 18:40

Well...I don't know if it is relate to this or not (it's more a complaint about documentation), but looking at https://www.arduino.cc/en/Reference/EthernetUDPRead it isn't very clear there are (well, should be) two "modes" in read() method: -Without parameters: returns only one byte -With (array,length) parameters: doesn't return anything because the data read is already in array??

Moreover, in example code appears the UDP_TX_PACKET_MAXSIZE constant which isn't explained anywhere (shouldn't it be UDPRX_PACKET_MAX_SIZE instead?????) . Little details that make life harder to newcomers...