gpt4 book ai didi

tcp - LwIP Netconn API + FreeRTOS TCP 客户端缓冲区问题

转载 作者:可可西里 更新时间:2023-11-01 02:43:44 24 4
gpt4 key购买 nike

我一直在尝试在 STM32F4DISCOVERY 板中使用 LwIP 修改 tcp 服务器示例。我必须编写一个不一定必须回复服务器响应的发件人。例如,它可以以 100 毫秒的频率发送数据。

首先TCP服务器的例子是这样的:

static void tcpecho_thread(void *arg)
{
struct netconn *conn, *newconn;
err_t err;

LWIP_UNUSED_ARG(arg);

/* Create a new connection identifier. */
conn = netconn_new(NETCONN_TCP);

if (conn!=NULL) {
/* Bind connection to well known port number 7. */
err = netconn_bind(conn, NULL, DEST_PORT);

if (err == ERR_OK) {
/* Tell connection to go into listening mode. */
netconn_listen(conn);

while (1) {
/* Grab new connection. */
newconn = netconn_accept(conn);

/* Process the new connection. */
if (newconn) {
struct netbuf *buf;
void *data;
u16_t len;

while ((buf = netconn_recv(newconn)) != NULL) {
do {
netbuf_data(buf, &data, &len);

//Incoming package
.....

//Check for data
if (DATA IS CORRECT)
{
//Reply
data = "OK";
len = 2;

netconn_write(newconn, data, len, NETCONN_COPY);
}

} while (netbuf_next(buf) >= 0);

netbuf_delete(buf);
}

/* Close connection and discard connection identifier. */
netconn_close(newconn);
netconn_delete(newconn);
}
}
} else {
printf(" can not bind TCP netconn");
}
} else {
printf("can not create TCP netconn");
}
}

我修改了这段代码以获得客户端版本,这是我目前得到的:

static void tcpecho_thread(void *arg)
{
struct netconn *xNetConn = NULL;

struct ip_addr local_ip;
struct ip_addr remote_ip;
int rc1, rc2;

struct netbuf *Gonderilen_Buf = NULL;
struct netbuf *gonderilen_buf = NULL;
void *b_data;
u16_t b_len;

IP4_ADDR( &local_ip, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3 );
IP4_ADDR( &remote_ip, DEST_IP_ADDR0, DEST_IP_ADDR1, DEST_IP_ADDR2, DEST_IP_ADDR3 );

xNetConn = netconn_new ( NETCONN_TCP );
rc1 = netconn_bind ( xNetConn, &local_ip, DEST_PORT );
rc2 = netconn_connect ( xNetConn, &remote_ip, DEST_PORT );

b_data = "+24C"; // Data to be send
b_len = sizeof ( b_data );

while(1)
{
if ( rc1 == ERR_OK )
{
// If button pressed, send data "+24C" to server
if (GPIO_ReadInputDataBit (GPIOA, GPIO_Pin_0) == Bit_SET)
{

Buf = netbuf_new();
netbuf_alloc(Buf, 4); // 4 bytes of buffer
Buf->p->payload = "+24C";
Buf->p->len = 4;

netconn_write(xNetConn, Buf->p->payload, b_len, NETCONN_COPY);
vTaskDelay(100); // To see the result easily in Comm Operator

netbuf_delete(Buf);
}
}
if ( rc1 != ERR_OK || rc2 != ERR_OK )
{
netconn_delete ( xNetConn );
}
}
}

当写操作工作时,netconn_write 发送其缓冲区中的内容。它不关心 b_data 是否为 NULL。我通过添加行 b_data = NULL;

对其进行了测试

所以 Comm Operator 中的结果输出是这样的:

Rec:(02:47:27)+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C+24C

但是,我希望它像这样工作:

Rec:(02:47:22)+24C
Rec:(02:47:27)+24C
Rec:(02:57:12)+24C
Rec:(02:58:41)+24C

当我等待大约 8 秒后再再次按下按钮时,就会发生所需的写入操作。

由于 netconn_write 函数不允许写入缓冲区,我无法清除它。并且 netconn_send 只允许用于 UDP 连接。

我需要一些指导来理解问题并为其生成解决方案。任何帮助将不胜感激。

最佳答案

这只是以正确方式打印结果的问题。

你可以尝试在netbuf数据结构写入之前加入这部分代码:

char buffer[20]; 

sprintf(buffer,"24+ \n");

Buf->p->payload = "+24C";

关于tcp - LwIP Netconn API + FreeRTOS TCP 客户端缓冲区问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21164367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com