ESP32 Hardware Serial - записывайте только 1 байт за раз

я использую

Serial2.begin(9600, SERIAL_8N1, 15, 14,true);
Serial2.write(b,100);

Чтобы записать буфер в последовательный порт из esp32

Но по какой-то причине он не передает полный буфер? Вместо этого он передает по одному байту за раз.

полученные данные

У кого-нибудь есть совет о том, как я могу передать полный буфер вместо 1 байта за раз?

Пример кода:

#include <HardwareSerial.h>

void setup() {
    Serial.begin(9600);
    Serial2.begin(9600, SERIAL_8N1, 15, 14,true); 
}

uint8_t buf[1000];

uint8_t* genBuffer(const char* txt, int* bufSZ)
{
    int index = 0;
    int i = 0;

    buf[index++] = 0x00;
    buf[index++] = 0x00;
    buf[index++] = 0x00;
    buf[index++] = 0x00;
    buf[index++] = 0x00;
    buf[index++] = 0x01;
    buf[index++] = 0x46;
    buf[index++] = 0x46;
    buf[index++] = 0x30;
    buf[index++] = 0x30;
    buf[index++] = 0x02;
    buf[index++] = 0x41;
    buf[index++] = 0x41;
    buf[index++] = 0x43;
    buf[index++] = 0x32;

    for (i = 0; txt[i]; i++) {
        buf[index++] = txt[i];
    }

    *bufSZ = index;

    return buf;
}

void loop()
{
    int sz = 0;
    uint8_t* b = genBuffer("test", &sz);     
    Serial.println(sz); 
    Serial2.write(b,sz);

    for (int i = 0; i < sz; i++) {  
        Serial.print(" ");
        Serial.print(b[i], HEX);
    }
    Serial.println();
    delay(5000);
    // put your main code here, to run repeatedly:
}

person Stweet    schedule 20.04.2020    source источник
comment
какой у вас буфер? это, кстати, C ++, а не C   -  person Piglet    schedule 20.04.2020
comment
Какая скорость передачи установлена ​​для UART, какую скорость передачи вы ожидали? Конечно, вы отправляете буфер по одному байту за раз ...   -  person unwind    schedule 20.04.2020
comment
00 00 00 00 00 01 46 46 30 30 02 41 41 43 32 30 37 46 32 30 30 36 30 31 30 .... @ Пятачок   -  person Stweet    schedule 20.04.2020
comment
предоставьте минимальный воспроизводимый пример, а не только 2 строки кода   -  person Piglet    schedule 20.04.2020
comment
9600baud Я имею в виду, что в последовательном мониторе / busdog он показывает 1 байт длины 1 за раз. При использовании адаптера usb / serial этот буфер показывает все байты при одинаковой передаче и длину и т. Д. 60 @unwind   -  person Stweet    schedule 20.04.2020
comment
@Piglet я добавил код   -  person Stweet    schedule 20.04.2020
comment
Пожалуйста, потратьте немного времени, чтобы понять, как работает c ++ массивы и сколько функций в стандартные библиотеки, такие как cstdlib или в cstring можно использовать в манипуляциях с массивами / строками. Как только вы это поймете, вы сможете решить свою проблему.   -  person hcheung    schedule 22.04.2020


Ответы (1)


Как определено Serial.write(buf,len)

Serial: serial port object. See the list of available serial ports for each board on the Serial main page.
val: a value to send as a single byte.
str: a string to send as a series of bytes.
buf: an array to send as a series of bytes.
len: the number of bytes to be sent from the array.

Вы должны определить, например,

char b[] = "Two hundred and fiftyfive character have to be in here tomake theexample work ....";

тогда

 Serial2.write(b,100);

будет работать, или вы определяете буфер фиксированной длины

 char b[256] = {'\0'};

и вы заполняете значения (преобразованные в строку) с помощью itoa, utoa, ftoa, в него с помощью strcpy и strcat, чем вы должны убедиться, что в буфере для записи находится минимум 100 символов. Если b представляет собой int или подобное, команда игнорирует ,100 и ведет себя как Serial.write(val) -> значение для отправки в виде одного байта!
ИЗМЕНИТЬ Ответ был дан до того, как OP опубликовал код, но как buf определяется как глобальный массив, нет необходимости возвращать его из функции
Вы определили его как uint8
Если вы распечатаете свой b в серийный номер, вы увидите странные символы (возможно, терминатор и некоторое содержимое памяти). Что должно прогу делать? Как по

uint8_t* b

значение указателя записывается в серийный номер, а не я предполагаю, что буфер из этого указателя - так чего же вы ожидаете? См. Выше использование в документации.

person Codebreaker007    schedule 20.04.2020