This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C129ENCPDT:使用 memcpy 函数发送缺失的数据

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1009359/tm4c129encpdt-sending-missing-data-using-memcpy-function

器件型号:TM4C129ENCPDT

大家好、

我想使用以太网将792字节数据从网关发送到服务器。 我将所有792数据取至内部网关.tcp_message、大小为1024。 在将此数据发送到服务器之前、我将所有数据放入数据缓冲区中、以便使用 memcpy 函数。 然后 发送到服务器。 但是、当我检查服务器时 、每次只有前5个字节的数据出现。 其他787数据丢失。 原因可能是什么。 您认为解决此问题的方法是什么?

gateway.tcp_message_length=1024;

U8_t  DATA[1024];

memcpy (data、Gateway.tcp_message、Gateway.tcp_message_length);

谢谢你

BR、

Bekir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题与 databasuffer[6]= 0有关。 因此、当它 遇到6时、当尝试发送数据时。 字节。 它只是停止发送。 这就是丢失其他数据的原因。 如何避免这个问题?因为0值应该在缓冲区内。 如果您有建议或想法、请告诉我

    谢谢你

    Bekir

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     您只是展示了一个通用 C 库函数  memcpy。 如何通过未显示的以太网发送数据。 本应用手册中提供了几个以太网客户端示例供您参考。  https://www.ti.com/lit/pdf/spna248

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    static err_t tcp_echoclient_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
    {
        struct echoclient *es = NULL;
        uint16_t index2;
        if (err == ERR_OK)
        {
            /* allocate structure es to maintain tcp connection informations */
            es = (struct echoclient *)mem_malloc(sizeof(struct echoclient));
    
            if (es != NULL)
            {
                es->state = ES_CONNECTED;
                es->pcb = tpcb;
    
                if(ETH_Ctrl.connectTYPE == ETHERNET_POST)
                {
                    memcpy(data,Gateway.tcp_message,Gateway.tcp_message_length);
    
                    es->p_tx = pbuf_alloc(PBUF_TRANSPORT, 792 , PBUF_POOL);
    
                    if (es->p_tx)
                    {
                        /* copy data to pbuf */
                        pbuf_take(es->p_tx, (char*)data, strlen((char*)data));
    
                        /* pass newly allocated es structure as argument to tpcb */
                        tcp_arg(tpcb, es);
    
                        /* initialize LwIP tcp_recv callback function */
                        tcp_recv(tpcb, tcp_echoclient_recv);
    
                        /* initialize LwIP tcp_sent callback function */
                        tcp_sent(tpcb, tcp_echoclient_sent);
    
                        /* initialize LwIP tcp_poll callback function */
                        tcp_poll(tpcb, tcp_echoclient_poll, 1);
    
                        /* send data */
                        tcp_echoclient_send(tpcb,es);
    
                        return ERR_OK;
                    }
                }
                else if(ETH_Ctrl.connectTYPE == NTP_CONNECT)
                {
                    memset(data,0,sizeof(data));
    
                    /* allocate pbuf */
                    es->p_tx = pbuf_alloc(PBUF_TRANSPORT, strlen((char*)data) , PBUF_POOL);
    
                    if (es->p_tx)
                    {
                        /* copy data to pbuf */
                        pbuf_take(es->p_tx, (char*)data, strlen((char*)data));
    
                        /* pass newly allocated es structure as argument to tpcb */
                        tcp_arg(tpcb, es);
    
                        /* initialize LwIP tcp_recv callback function */
                        tcp_recv(tpcb, tcp_echoclient_recv);
    
                        /* initialize LwIP tcp_sent callback function */
                        tcp_sent(tpcb, tcp_echoclient_sent);
    
                        /* initialize LwIP tcp_poll callback function */
                        tcp_poll(tpcb, tcp_echoclient_poll, 1);
    
                        /* send data */
                        tcp_echoclient_send(tpcb,es);
    
                        ETH_Ctrl.status = ETH_STATUS_NTP_CONNECTED;
    
                        return ERR_OK;
                    }
                }
            }
            else
            {
                /* close connection */
                tcp_echoclient_connection_close(tpcb, es);
    
                /* return memory allocation error */
                return ERR_MEM;
            }
        }
        else
        {
            /* close connection */
            tcp_echoclient_connection_close(tpcb, es);
        }
        return err;
    }

    我想在 es->p_tx = pbuf_alloc (PBUF_transport、792、PBUF_pool)中会发生什么。

    当我使用调试模式进行检查时、在传递 pbuf_alloc 命令后、通常为792字节的 to_len 变为779字节。 当我查看数据缓冲区时,我看到779。 字节为零、如下所示。  因此、当遇到零时、我认为程序理解为空。 因此、它停止将数据放入新缓冲区。 因此,新缓冲区的长度变为779。 我想这是在 pbuf_alloc 函数中发生的。 但我无法找到它发生的地方

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    > pbuf_take (es->p_tx、(char*) data、strlen (((char*) data));

    也许这应该是这样的

    > pbuf_take (es->p_tx、(char*) data、Gateway.tcp_message_length);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

     感谢您的见解。  strlen 函数将 仅计算字符串的长度 、直至、但不包括终止空字符、这是正确的。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。 没错。