Как отправить данные TCP Client по FreeRTOS + lwip - PullRequest
0 голосов
/ 03 июля 2018

Я ищу способ отправки данных клиентом TCP по FreeRTOS + lwip.

Я вижу, как отправлять полученную информацию, такую ​​как TCP echo Client, Я не могу найти способ отправки в желаемое время.

Когда я пытался по-разному, я мог улучшить соединение и прием.

Ниже приведен исходный код. • TCP_CET_DAT буферизируется с другой задачей. • Если невозможно установить соединение, он настроен на увеличение порта один за другим.

Спасибо за ваш совет.

static void tcp_client_thread(void *arg)
{
    struct netconn  *conn;
    struct ip_addr  ipaddr;
    unsigned int    port_no = 0xC000;
    err_t           err;

    IP4_ADDR(&ipaddr, 192,168,253,253);                                         // Connection destination IP address

    while (1) {
        conn = netconn_new(NETCONN_TCP);                                        // create new TCP connection handle

        if (conn!= NULL) {
            err = netconn_bind(conn, NULL, port_no);
            if (err == ERR_OK) {
                err = netconn_connect(conn, &ipaddr, 4000);                     // Connection destination port is 4000
                if(err == ERR_OK) {
                    while(1) {
                        tcp_client_serve(conn);
                        if (conn-> pcb.tcp -> state == CLOSE_WAIT) {
                            break;
                        }
                    }
                }
                else {
                    printf("Connect server fail ! \n");
                }
            }
            else {
                printf("can not bind netconn");
            }
        }
        else {
            printf("can not create netconn");
        }
        netconn_delete(conn);                                                   // delete TCP connection handle

        if (port_no < 0xFFFF)   port_no++;                                      // port number is increment
        else                    port_no = 0xC000;
        delaym(1000);
    }
}


void tcp_client_serve(struct netconn *conn)
{
    struct netbuf   *inbuf;
    struct netbuf   *outbuf;
    char            *buf;
    u16_t           buflen;
    int             i;

    // receive
    netconn_recv(conn,&inbuf);
    if (inbuf != NULL) {
        if (netconn_err(conn) == ERR_OK) {
            for (i=0; i<buflen; i++) {
                R_client_buff.buff[R_client_buff.wp] = *buf++;                  // Buffering of received data stored in payload
                if (++R_client_buff.wp > TCP_RBUFF_SIZE)    R_client_buff.wp = 0;
                R_client_buff.count++;
            }
        }
    }
    netbuf_delete(inbuf);

    // send
    outbuf = netbuf_new();
    netbuf_data(outbuf, (void**)&TCP_CET_DAT, &buflen);
    netconn_write(conn, (const unsigned char*)TCP_CET_DAT, (size_t)TCP_CLI_MSG_CNT, NETCONN_NOCOPY);
    netbuf_delete(outbuf);

}
...