esp8266 / Arduino

ESP8266 core for Arduino
GNU Lesser General Public License v2.1
16.07k stars 13.33k forks source link

UART baudrate change problem #8428

Closed pruwait closed 2 years ago

pruwait commented 2 years ago

Platform

Settings in IDE

Problem Description

  1. I can't send two packets with different baudrate. Only second packet sending.
  2. How can I remove short impulse at start?

unsigned long timing; 

void send_break() {

  //Serial.end(); // HardwareSerial::begin consist end();
  Serial.begin(110);  // Starting low baudrate uart
  Serial.write(0x00); // send low baud packet
  Serial.write(0x55);
  Serial.end();       // close low baud uart

  Serial.begin(19200); // Starting high baudrate uart
  Serial.write(0x00);  // send high baud packet
  Serial.write(0x55);

}

void setup() {

  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {

  if (millis() - timing > 2000) {
    timing = millis();
    bool on_led = digitalRead(LED_BUILTIN);
    digitalWrite(LED_BUILTIN, !on_led);
    send_break(); 
  }
}

Debug Messages

esp8266-baud-problem

pruwait commented 2 years ago
...
 uint8_t master_tx_buf[] = {0x55, 0x22, 0x00};
 uint8_t break_tx_buf[] = {0x00, 0x66, 0x77, 0x00};
...

void send_break() {
uart_flush(_uart);
 uart_uninit(_uart); 
 _uart =  uart_init(_UART_NO, baud_break, SERIAL_8N1, UART_TX_ONLY, TX_P, 0, false);
 uart_set_baudrate(_uart, baud_break);
 uart_flush(_uart);
 //uart_write(_uart, (char *)&dummy, 1);
 uart_write(_uart, (char *)break_tx_buf, sizeof(break_tx_buf));
 uart_wait_tx_empty(_uart);
 //uart_flush(_uart);
 uart_uninit(_uart); 
 _uart =  uart_init(_UART_NO, baud_work, SERIAL_8N1, SERIAL_FULL, TX_P, 256, false);
 uart_write(_uart, (char *)master_tx_buf, sizeof(master_tx_buf));
 uart_wait_tx_empty(_uart);
}
...

send_break() must send on 9600bps 0x00, 0x66, 0x77, 0x00 and after that send on 19200bps 0x55, 0x22, 0x00. But i see 9600bps 0x00, 0x66, 0x77 + 19200bps 0x00, 0x55, 0x22, 0x00. 9600+19200

pruwait commented 2 years ago

It seems uart_wait_tx_empty() not working correctly

pruwait commented 2 years ago

Short impulse at start is uart on/off garbage. Bad idea using uart_init() / uart_uninit() or Serial.begin() / Serial.end()

uart_wait_tx_empty() not working before uart_set_baudrate() Need delayMicroseconds()

Thats working good with Core Version: 3.0.2;

// Отправка break + посылка

 uart_flush(_uart);                                               // очищаем uart
 uart_set_baudrate(_uart, baud_break);                            // занижаем бодрэйт
 //uart_write(_uart, (char *)&dummy, 1);        
 uart_write(_uart, (char *)break_tx_buf, sizeof(break_tx_buf));   // отправляем ноль на низкой скорости, длиинный ноль
 uart_wait_tx_empty(_uart);                                       // ждём, пока отправка завершится. Здесь в библиотеке uart.h (esp8266 core 3.0.2) ошибка, ожидания недостаточно при дальнейшем uart_set_baudrate().
 delayMicroseconds(100);                                          // добавляем ожидания, иначе скорость переключится раньше отправки. С задержкой 100us на d1-mini я получил идеальный сигнал, break = 520us
 uart_set_baudrate(_uart, baud_work);                             // возвращаем рабочий бодрэйт
 uart_write(_uart, (char *)master_tx_buf, sizeof(master_tx_buf)); // отправляем основную посылку
 uart_wait_tx_empty(_uart);                                       // ждем завершения отправки

9600+19200 good

pruwait commented 2 years ago

closed