Чтение из серийных проблем с Amazon FreeRTOS - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь выполнить чтение из uart2 клона ESP32 DevKitC в потоке задач.

Мой код выглядит следующим образом:

uint8_t data[128];
data[0] = '\0'; //null terminate so we don't print garbage

for( ; ; ) {
    //get a chunk of data off the FIFO buffer
    const int uart_num = UART_NUM_2;
    int length = 0;
    IotLogInfo( "preread" );
    length = uart_read_bytes(uart_num, data, 10, 1000 / portTICK_RATE_MS); //read 10 bytes or time out after a second.

    if(length == -1)
        IotLogInfo( "read reported error! -1" );

    //did we rx anything?
    if(length > 0){
        data[length] = '\0'; //null terminate the string
        IotLogInfo( "Rx: %i bytes", length );
        IotLogInfo( "Rx: %s ", data );
    }
    else{
        IotLogInfo( "rx no data" );
    }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
}

По какой-то причине символы 2 и 3 передаваемой строки "UVW" портятся, даже если буфер содержит более одной передачи:

122 4911 [_readSerialForM] [INFO ][DEMO][49110] preread

123 5011 [_readSerialForM] [INFO ][DEMO][50110] Rx: 3 bytes

124 5011 [_readSerialForM] [INFO ][DEMO][50110] Rx: U⸮⸮ 

126 5011 [_readSerialForM] [INFO ][DEMO][50110] preread

127 5111 [_readSerialForM] [INFO ][DEMO][51110] Rx: 3 bytes

128 5111 [_readSerialForM] [INFO ][DEMO][51110] Rx: U⸮⸮ 

130 5111 [_readSerialForM] [INFO ][DEMO][51110] preread

131 5510 [_readSerialForM] [INFO ][DEMO][55100] Rx: 12 bytes

132 5510 [_readSerialForM] [INFO ][DEMO][55100] Rx: U⸮⸮U⸮⸮U⸮⸮U⸮⸮ 

134 5510 [_readSerialForM] [INFO ][DEMO][55100] preread

135 5710 [_readSerialForM] [INFO ][DEMO][57100] Rx: 6 bytes

136 5710 [_readSerialForM] [INFO ][DEMO][57100] Rx: U⸮⸮U⸮⸮ 

138 5710 [_readSerialForM] [INFO ][DEMO][57100] preread

139 5910 [_readSerialForM] [INFO ][DEMO][59100] Rx: 6 bytes

140 5910 [_readSerialForM] [INFO ][DEMO][59100] Rx: U⸮⸮U⸮⸮ 

«UVW» должно быть 0x55 x56 x57, но похоже, что оно интерпретируется как «0x55 0xD5 0xFD», что еще более странно, если я отправляю «UUU» на сериал, который должен быть «0x55 0x55 0x55», он прибывает как «0x55 0x55 0xF5 ", что очень странно, так как байт № 2 не искажается, когда его повторяет байт перед ним.

Я самостоятельно проверил передачу с помощью arduino, и она отлично читается. Так что я очень смущен.

Я уверен, что это довольно простая ошибка с моей стороны. Однако я не могу понять, что это такое.

Заранее спасибо.

1 Ответ

1 голос
/ 20 июня 2019

Последовательный интерфейс должен быть настроен правильно. Настройки на обоих концах должен быть таким же.

Википедия пишет

Для последовательных соединений, используемых для асинхронной связи «старт-стоп», требуется много настроек, чтобы выберите скорость , количество бит данных на символ, четность и количество стоп-бит на символ.

(...)

Часто, если настройки введены неправильно, соединение не будет сброшено; однако любые отправленные данные будут получены на другом конце как бессмыслица.

Если приемник видит неправильный битовый шаблон на проводе, он должен вызвать «ошибку кадрирования» или «ошибку четности». Однако некоторые ошибки не могут быть обнаружены, и часто эти состояния ошибок просто игнорируются.

Еще один серьезный источник проблем с последовательным интерфейсом - это электрическая сторона. Традиционный RS232 поставляется с напряжением до +/- 15 В. Напротив, микроконтроллеры предпочитают классические логические сигналы (3,3 В или 5 В). Перепутывание проводов может позволить некоторую связь в одном направлении. Чтобы исключить этот комплекс, вы должны проверить сигналы с помощью мультиметра или, что еще лучше, осциллографа.

...