Как получить массив int со стороны клиента (написано на C) на сервер (написано на python)

Я просто хочу отправить массив adc_array=[w, x, y, z] с клиента на сервер. Ниже приведен код на стороне клиента, тогда как мой сервер работает на python, который принимает только json. Я не получаю ошибок при компиляции кода, однако получаю 2 предупреждения: 1- предупреждение: цели указателя при передаче аргумента 2 «UDPWrite» отличаются подписанием. 2- предупреждение: нет новой строки в конце файла.

Но на стороне сервера я не могу получить весь массив, вместо этого я просто получаю первый символ массива, т.е. [ .

Я новичок в программировании на C. Буду очень признателен за любую помощь.

// Main function
void FlyportTask()
{
// Flyport connects to default network
WFConnect(WF_DEFAULT);
while(WFGetStat() != CONNECTED);
vTaskDelay(25);
UARTWrite(1,"Flyport Wi-fi connected...hello world!\r\n");

BOOL UdpSocketOpenRequest=TRUE;
BYTE UdpSocket=0;


// openinging UDP socket
if (UdpSocketOpenRequest) //open socket
{
    UdpSocketOpenRequest=FALSE;
    if (UdpSocket!=0) //if this is not equals to zero
    {
        UDPClientClose(UdpSocket);
    }   
    UARTWrite(1,"OpenSocket\r\n");
    UdpSocket= UDPClientOpen("10.0.0.106", "8000"); //Client socket opening 
}


while(1)
{
    //defining pointer
    int *array_pointer;
    int adc_array[4];
    int j;
    char buf[10];       //buffer to print 

    // I have made a separate function to get adc values which returns the pointer to the array.
    array_pointer = get_adcval();

    UARTWrite (1, "ADC Array\r\n");

    for (j = 0; j < 4; j++)
    {
        adc_array[j] = *(array_pointer + j);
        sprintf (buf, "%d", adc_array[j]);
        UARTWrite (1, buf);
        UARTWrite (1, "\n");
    }


    //if UDP socket is open, send the data 
    if ((UdpSocket!=0))
    {
        // defining pointer of serial_out
        char *s_out;
        int size;

        // creating a JSON array from adc_array with 4 elements
        cJSON * int_array = cJSON_CreateIntArray(adc_array,4);

        // Serializing the array
        s_out = cJSON_Print(int_array);

        //Writing to the serial output/monitor
        UARTWrite(1, "\r\narray to be sent\r\n");
        UARTWrite(1, s_out);
        UARTWrite(1,"\r\n");

                    // Assume adc_array=[1021, 1022, 1023, 1024]
                    // I get output [1021, 1022, 1023, 1024]

        //compose message
        size = strlen(s_out);
        UDPWrite (UdpSocket, s_out, size);

                    // at the server side, i just receive only first character i.e. [

        /*to free the memory */
        free(s_out);

    }



    //
    // remember to add delay vTaskDelay(50) 50ms
    //remember to close the socket


}


}

person Myz    schedule 23.09.2013    source источник


Ответы (2)


Вы не выделили память для s_out. даже если он выводит правильный результат на UART, но все же он может быть перезаписан любой из функций UARTWrite или функцией strlen() в следующих строках. Если он будет перезаписан, то переменная "size" получит количество байтов, начиная с первого байта до первого нулевого символа в памяти (так работает функция strlen()). следовательно, значение «размер» может быть совершенно случайным. это может быть 0, 1 или 1000. Если размер неверен, вы получите только «размер» в байтах. В вашем случае возможно, что размер один. попробуйте напечатать размер перед UDPWrite. устраните эту проблему, добавив вызов malloc перед сериализацией массива.

Если и это не работает, проверьте сторону приемника. Ваш приемник работает нормально, если вы отправляете фиктивные данные из проверенного клиента Python (или любого другого проверенного или надежного клиента)? если нет, то проблема с вашим ресивером.

person Kanwar Saad    schedule 23.09.2013

Распечатайте то, что возвращает strlen(s_out), а также распечатайте возвращаемое значение UDPWrite (я предполагаю, что, как и любая функция записи, она будет возвращать размер данных, которые записываются в сокет).

Читая имена функций, я предполагаю, что вы используете передачу UDP, которая ненадежна.

person buksy    schedule 23.09.2013