ESP32 Hardware Serial - только запись 1 байта за раз - PullRequest
0 голосов
/ 20 апреля 2020

Я использую

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

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

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

data recived

У любого есть совет о том, как я могу передать полный буфер, вместо 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:
}

1 Ответ

0 голосов
/ 20 апреля 2020

Как Serial.write(buf,len) isdefined

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) -> значение для отправки в виде одного байта!
EDIT Ответ был дан до того, как OP опубликовал код но так как buf определен как глобальный массив, нет необходимости возвращать его из функции
Вы определили его как uint8
Если вы напечатаете ваш b в serial, вы увидите странные символы (вероятно, терминатор и некоторый контент памяти) ) Что делать проге? Как к

uint8_t* b

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

...