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.

[参考译文] MSP432E401Y:TCP/IP Lwip echo 示例 nortos 如何发送数据

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/954601/msp432e401y-tcp-ip-lwip-echo-example-nortos-how-to-send-data

器件型号:MSP432E401Y

您好!

我正在使用 lwip 库创建一个从以太网接收 TCP 数据包的程序。 我的代码基于回波示例(nortos)。 该函数用于接收来自 TCP 的数据、并通过 UART 串行发送数据、反之亦然。 我成功地使用了回显示例并对其进行了微调、以接收数据包、处理数据包并通过 UART 发送数据、但是我在使用 TCP 写入函数将数据发送到同一 TCP 端口时遇到了问题。 将一串数据发送到同一 TCP 端口的最简单方法是什么? 我所做的唯一调整是对 ECHO_recv 函数进行的、在该函数中、我接收传入的数据包、对其进行处理、然后清除缓冲区。

ERR_t
ECHO_recv (void *arg、struct tcp_pcb、struct pbuf *p、err_t err)

struct echo_state * es;
ERR_t RET_ERR;

LWIP_assert ("arg!= NULL"、arg!= NULL);
ES =(struct echo_state *) arg;
如果(p = NULL)

/*远程主机已关闭连接*/
ES->state = ES_Closing;
if (es->p ==空)

//我们已完成发送,关闭它*/
echo _close (tpcb、es);

其他

/*我们尚未完成*/
tcp_sent (tpcb、echo_sent);
ECHO_SEND (tpcb、es);

RET_ERR = ERR_OK;

否则、如果(err!= ERR_OK)

/*由于未知原因进行清理*/
if (p!= NULL)

ES->p = NULL;
pbuf_free (p);

RET_ERR =错误;

否则,如果(es->state == ES_Accepted)

/* p->payload 中的第一个数据块*/
ES->state = ES_Received;
字符串1[10];
memcpy (string1、p->payload、p->len);
int i = 0;

for (i = 0;i <= 10;i++){
Coordinator.modemManager.buffer.push (string1[i]);


tcp_recved (tpcb、p->t_t_len);
ES->p = NULL;
pbuf_free (p);
RET_ERR = ERR_OK;


/*存储对传入 pbuf (chain)的引用*/
// es->p = p;
/*安装发送完成通知*/
// tcp_sent (tpcb、echo_sent);
// echo_send (tpcb、es);
// ret_err = ERR_OK;

否则(es->state == ES_received)

/*阅读更多数据*/
if (es->p ==空)

ES->p = p;
// tcp_sent (tpcb、echo_sent);
// echo_send (tpcb、es);
字符串2[10];
memcpy (string2、p->payload、p->len);
int i = 0;

for (i = 0;i <= 10;i++){
Coordinator.modemManager.buffer.push (string2[i]);


tcp_recved (tpcb、p->t_t_len);
ES->p = NULL;
pbuf_free (p);
RET_ERR = ERR_OK;

其他

struct pbuf *ptr;

/*将 pbufs 链接到我们先前所述内容的末尾*/
ptr = es->p;
pbuf_chain (ptr、p);

RET_ERR = ERR_OK;

否则,如果(es->state == ES_Closing)

/*奇数情况、遥控侧关闭两次、垃圾数据*/
tcp_recved (tpcb、p->t_t_len);
ES->p = NULL;
pbuf_free (p);
RET_ERR = ERR_OK;

其他

/*未知 es->state、trash data */
tcp_recved (tpcb、p->t_t_len);
ES->p = NULL;
pbuf_free (p);
RET_ERR = ERR_OK;

返回 RET_ERR;

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

    您好!

    您说在向 TCP 端口发送数据时遇到问题。 您是否可以 阻止所有其他函数、只保留通过 TCP 的发送数据函数并查看其是否正常工作?

    此致、

    现金 Hao

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

    您好!  

    因此、我设法通过 TCP 来写入数据、但它仅在 回波接受函数内部工作、当我将写入函数放在主循环中时、它不会发送、

    ERR_t
    ECHO_ACCEPT (void *arg、struct tcp_pcb * newpcb、err_t err)

    ERR_t RET_ERR;
    struct echo_state * es;

    LWIP_unused_arg (arg);
    LWIP_Unused_ARG (错误);

    /*通常观察到的脊医调用 tcp_setprio(),为什么? *
    tcp_setprio (newpcb、tcp_PRIO_min);

    ES =(struct echo_state *) mem_malloc (sizeof (struct echo_state));
    if (es!= NULL)

    ES->state = ES_Accepted;
    ES->PCB = newpcb;
    ES->重试次数= 0;
    ES->p = NULL;
    /*将新分配的调用传递给我们的回调*/
    tcp_arg (newpcb、es);
    tcp_recv (newpcb、eco_recv);
    tcp_err (newpcb、echo_error);
    tcp_sent (newpcb、echo_sent);

    char modemtest[3]={'a'、'C'、'K'};
    char *ptrdata = modemtest;
    tcp_write (newpcb、ptrdata、3、1);

    RET_ERR = ERR_OK;

    其他

    RET_ERR = ERR_MEM;

    返回 RET_ERR;

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

    是的、我似乎可以解决这个问题、通过 Accept 回调函数创建的 PCB 与我要写入的 PCB 不同。 我现在遇到了一个问题、在尝试执行 tcp_write 函数时、我的代码将进入默认处理程序。 因为 TCP 写入正在调用一个没有处理程序的中断、所以它将进入该状态。 我的主代码是 C++、因此我必须在中断处理程序上使用 extern C。 我想知道是否必须将 extern C 添加到回显代码中的另一个函数、以便允许注册 tcp_write 设置的中断的中断处理程序。 带有中断处理程序的启动文件位于 C 语言中、这就是我必须添加 extern C 的原因

    谢谢