• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Передача массива через tcp обрывается, если есть пустой байт

de1m

New member
Всем привет!
К примеру я передаю такой массив [inline]
\xFB\xFB\xFB\x00\x02\x01\x02\xFA\xFA\xFA
[/inline]
Та часть, которая идёт до "x00" приходит, а остальное нет. Если я заменяю \x00", то весь массив приходит.
Я так понимаю, что получение идёт до того момента пока байт не будет равен нулю. Я в принципе передаю длину массива, можно как-то сказать, сколько он должен получить и чтобы не обрывался если приходит "\x00"?

Код:
#include "ets_sys.h"
#include "osapi.h"
#include "os_type.h"
#include "user_interface.h"
#include "espconn.h"
#include "mem.h"
#include "gpio.h"
#include "user_config.h"
#include "../driver/uart.h"
#include<string.h>


static struct espconn httpconfig_conn;
static esp_tcp httpconfig_tcp_conn;

void user_init(void){

    uart_init(BIT_RATE_115200,BIT_RATE_115200);

    //connect wifi
    connect_wifi();
    httpconfig_conn_init();

}

void ICACHE_FLASH_ATTR httpconfig_conn_init() {

        httpconfig_conn.type=ESPCONN_TCP;
        httpconfig_conn.state=ESPCONN_NONE;
        httpconfig_tcp_conn.local_port=4040;
        httpconfig_conn.proto.tcp=&httpconfig_tcp_conn;

        espconn_regist_connectcb(&httpconfig_conn, httpconfig_connected_cb);
        espconn_accept(&httpconfig_conn);
}

static void ICACHE_FLASH_ATTR httpconfig_recv_cb(void *arg, char *data, unsigned short len) {
  struct espconn *conn=(struct espconn *)arg;

  os_printf("Data: %s\n",data);

  espconn_disconnect(conn);
}

static void ICACHE_FLASH_ATTR httpconfig_recon_cb(void *arg, sint8 err) {
}

static void ICACHE_FLASH_ATTR httpconfig_discon_cb(void *arg) {
    char info[] = "Client disconnected\r\n";
    uart0_tx_buffer(info,strlen(info));
}

static void ICACHE_FLASH_ATTR httpconfig_sent_cb(void *arg) {
}

static void ICACHE_FLASH_ATTR httpconfig_connected_cb(void *arg) {
  struct espconn *conn=arg;

  espconn_regist_recvcb  (conn, httpconfig_recv_cb);
  espconn_regist_reconcb (conn, httpconfig_recon_cb);
  espconn_regist_disconcb(conn, httpconfig_discon_cb);
  espconn_regist_sentcb  (conn, httpconfig_sent_cb);
}

static void ICACHE_FLASH_ATTR connect_wifi(){
    struct station_config stationConf;

    wifi_set_opmode( STATION_MODE );

    //wifi config
    const char ssid[20] = SSID;
    const char password[30]  = SSID_PASSWORD;

    if(wifi_get_opmode() == STATION_MODE){
        os_printf("STATION_MODE is set\r\n");

        os_memcpy(&stationConf.ssid, ssid, 30);
        os_memcpy(&stationConf.password, password,30);

        os_printf("Wifi info: %s, %s\r\n", SSID, SSID_PASSWORD);

        wifi_station_set_config(&stationConf);
        wifi_station_connect();

        os_printf("Connected...\r\n");
    }
    else
    {
        os_printf("Err: STATION_MODE not set\r\n");
    }
}
 
Последнее редактирование:
Сверху Снизу