Изменение скорости uart в программе

skilful
Offline
Зарегистрирован: 18.01.2021

Здравствуйте.

В ходе выполнения программы мне нужно менять скорость работы uart (пользователь может ее поменять в любой момент).

 

Для проверки написал такой скетч:

#define UART_MAX_N 8
String UART_SPEED_CONST[UART_MAX_N] {"1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200" };


void setup() {
  delay(5000);
}

void loop() {
  for (byte i = 0; i <= (UART_MAX_N-1); i++){
    long temp_speed = UART_SPEED_CONST[i].toInt();
    Serial.begin(temp_speed);
    Serial.println("\nSpeed is = " + UART_SPEED_CONST[i]);
    //Serial.flush();
    Serial.end();
    delay(3000);
    
  }

}

В цикле я читаю перенастраиваю uart на разные скорости.

В мониторе COM порта Arduino IDE меняю настройку скорости порта, после каждого прохода цикла, чтобы они совпадали.

Т.е. сменилась скорость порта у Arduino -- поменял ее на такую же в IDE для просмотра println.

Однако получаю какой-то мусор между переключениями состояния uart:

 

Speed is 1200

⸮⸮ffxfx

Speed is 2400

и так далее

 

Откуда он берется не пойму. Подскажите, пожалуйста, где ошибаюсь.

Спасибо

 

b707
Offline
Зарегистрирован: 26.05.2017

skilful пишет:

В ходе выполнения программы мне нужно менять скорость работы uart

а что, так разве можно было??

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А зачем скорости сначала String'ом, а потом toInt()? Почему не сразу числа?

По сути вопроса.Работа с портом глючна по определению, а Вы даже не закрываете его при смене скорости.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ЕвгенийП пишет:

По сути вопроса.Работа с портом глючна по определению, а Вы даже не закрываете его при смене скорости.

как не закрывает, а 15 строка?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А разве последние 3 значения массива влезают в ардуиновский int ?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

b707 пишет:

skilful пишет:

В ходе выполнения программы мне нужно менять скорость работы uart

а что, так разве можно было??

Вполне.
На esp8266 так делаю.
А то там обычно скорости загрузчика и скетча не совпадают, а информацию хочется видеть полностью

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Kakmyc пишет:
А разве последние 3 значения массива влезают в ардуиновский int ?

toInt - фамилия по мужу (наверное), урождённая она toLong

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

xDriver пишет:

как не закрывает, а 15 строка?

Сорри, не заметил, ночью дело было. Зря Вы "ответили" - я теперь поправить не могу, чтоб мозг никому не выносить.

skilful
Offline
Зарегистрирован: 18.01.2021

Да закрываю порт end ом.

 

А в принципе что тут такого -- менять скорость uart в программе? Там же в настройке uart в соответствующие регистры новые числа просто должны записаться.

Единственный вопрос у меня возникал -- вдруг там в программном буфере что-то болтается. Добавлял flush - функцию ожидания полной передачи. И задержку воткнул. Все равно мусор насыпает в порт.

Да, функция toInt на самом деле Long возвращает.

Я пробовал и числовой массив загонять -- все равно имеется мусор при смене скорости.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

skilful пишет:

Я пробовал и числовой массив загонять -- все равно имеется мусор при смене скорости.

Мусор не имеет никакого отношения к числам или строкам. Просто странно "зачем"

Что касается "мусора", там глюки в реализации, я Вам уже говорил. Вот, например, тоже про это - http://arduino.ru/forum/obshchii/oshibka-v-ide-1813

Попробуйте отдельный COM-клиент. И отпишитесь, помогло ли.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

skilful, "мусор" - это ни о чем. Посмотрите логическим анализатором, что там реально происходит на ножках.

skilful
Offline
Зарегистрирован: 18.01.2021

Евгений, я же в первом сообщении написал: пользователь может поменять скорость, задавая параметры работы устройства.

Вот нашел другой топик:

https://forum.arduino.cc/index.php?topic=382040.0

 

Но пока все также - мусор при изменении скорости и все тут.

 

skilful
Offline
Зарегистрирован: 18.01.2021

andriano пишет:

skilful, "мусор" - это ни о чем. Посмотрите логическим анализатором, что там реально происходит на ножках.

 

Да я тоже так подумал. Но просто в какой момент можно "доверять" arduino -- что она скорость сменила на uart

 

 

И нет анализатора к сожалению :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

отдай одну ногу контроллера, если не жалка, чтобы подать Reset на спицальную ногу CH340, сразу после Serial.end()

skilful
Offline
Зарегистрирован: 18.01.2021

DetSimen пишет:

отдай одну ногу контроллера, если не жалка, чтобы подать Reset на спицальную ногу CH340, сразу после Serial.end()

у меня плата Mega 2560. По USB подключена. Думаете сам конвертер выплевывает еще что-то?

Такая мысль не посещала :) Посмотрел по даташиту у CH340 есть свой буфер

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

skilful пишет:

 Посмотрел по даташиту у CH340 есть свой буфер

Ну вот по Reset он мошт и очистица. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

DetSimen пишет:
чтобы подать Reset на спицальную ногу CH340, сразу после Serial.end()

шот я уже не хрена не вижу, на какую ногу надо подавать?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

skilful пишет:

И нет анализатора к сожалению :)

Ну а как Вы собираетесь варить борщ, если у Вас нет ни кастрюли, ни, хотя бы, чайника?

Тут либо обзаводиться необходимой аппаратурой, либо даже не пытаться делать вещи, которые Вы не способны проконтролировать.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

xDriver пишет:

DetSimen пишет:
чтобы подать Reset на спицальную ногу CH340, сразу после Serial.end()

шот я уже не хрена не вижу, на какую ногу надо подавать?

Всё, х-ню сморозил, у CH340 внутренняя схема сброса при подаче питания, наружу не выходит.  Миль пардонс, б-ть. 

Upd. Это у CH341A есть нога RSTI, причем, активный уровень - HIGH. Китайцы, чо с них взять, дикий нарот. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

skilful пишет:

Евгений, я же в первом сообщении написал: пользователь может поменять скорость, задавая параметры работы устройства.

И что? Это Вам мешает взять не монитор порта, а другую программу? Возьмите, попробуйте и отпишитесь.

skilful
Offline
Зарегистрирован: 18.01.2021

ЕвгенийП пишет:

skilful пишет:

Евгений, я же в первом сообщении написал: пользователь может поменять скорость, задавая параметры работы устройства.

И что? Это Вам мешает взять не монитор порта, а другую программу? Возьмите, попробуйте и отпишитесь.

ой, упустил ваше предложение.

Да. проверял. Через Com port toolkit тоже самое

 

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

у меня, по моему, есть уно на CH340 и на 16AU, надо проверить в этом ли дело.

и да, а если после инициализации вычитывать порт?

while (Serial.read()>=0);

 

Green
Offline
Зарегистрирован: 01.10.2015

Нужно понимать 3 момента: 1 - Ардуино, 2 - мост, 3 - эмулятор терминала. И у каждого свой буфер. Ага?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А просто после смены скорости, слать в порт проверочный блок, до того момента пока не перестанет фигней страдать, не вариант ?

skilful
Offline
Зарегистрирован: 18.01.2021

xDriver пишет:

у меня, по моему, есть уно на CH340 и на 16AU, надо проверить в этом ли дело.

и да, а если после инициализации вычитывать порт?

while (Serial.read()>=0);

 

Делал. С английцкого форума ссылку дал и там весь код попробовал.

Дело в том, что ардуина должна дружить с другим модулем с uart и между ними скорость связи может поменяться.

skilful
Offline
Зарегистрирован: 18.01.2021

У кого есть возможность проверьте ,пожалуйста, скетч смены скорости порта. У всех мусор шлется?

Может я где-то ошибаюсь...

Feofan
Offline
Зарегистрирован: 28.05.2017

Nano и монитор Arduino IDE. При изменении скорости UART происходит сброс Nano (диод моргает). Как понимаю - терминал дергает DTR.

#define UART_MAX_N 8
long int UART_SPEED_CONST[UART_MAX_N] {1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 };

void flash() {
  for (byte i = 0; i < 6; i++) {
    digitalWrite(13, !digitalRead(13));
    delay(500);
  }
}

void setup() {
  pinMode(13, OUTPUT);
  flash();
}

void loop() {
  for (byte i = 0; i <= (UART_MAX_N - 1); i++) {
    Serial.begin(UART_SPEED_CONST[i]);
    while (!Serial);
    Serial.print("\nSpeed is = ");
    Serial.println(UART_SPEED_CONST[i]);
    //Serial.flush();
    Serial.end();
    delay(3000);
  }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

xDriver пишет:

DetSimen пишет:
чтобы подать Reset на спицальную ногу CH340, сразу после Serial.end()

шот я уже не хрена не вижу, на какую ногу надо подавать?

Всё, х-ню сморозил, у CH340 внутренняя схема сброса при подаче питания, наружу не выходит.  Миль пардонс, б-ть. 

Upd. Это у CH341A есть нога RSTI, причем, активный уровень - HIGH. Китайцы, чо с них взять, дикий нарот. 

а на cp2101, ft232 и pl2303 резет есть и выведен на ногу )))

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ua6em пишет:

DetSimen пишет:

xDriver пишет:

DetSimen пишет:
чтобы подать Reset на спицальную ногу CH340, сразу после Serial.end()

шот я уже не хрена не вижу, на какую ногу надо подавать?

Всё, х-ню сморозил, у CH340 внутренняя схема сброса при подаче питания, наружу не выходит.  Миль пардонс, б-ть. 

Upd. Это у CH341A есть нога RSTI, причем, активный уровень - HIGH. Китайцы, чо с них взять, дикий нарот. 

а на cp2101, ft232 и pl2303 резет есть и выведен на ногу )))

а на cp2104, еще и 4 GPIO есть, ардуина совсем не нужна:))

skilful
Offline
Зарегистрирован: 18.01.2021

Друзья, обнаружил такую штуку:

если Com Port Toolkit установить DTR в низкий уровень, то в порт на компьютер все нормально пишется и нет никакого мусора.

На что влияет эта настройка в переходнике USB на плате с Ардуино не разбирался. Или как она связана с приемом.

В Arduino IDE такой настройки не увидел.

 

#define UART_MAX_N 8

String UART_SPEED_CONST[UART_MAX_N] {"1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200" };

//long LONG_UART_SPEED_CONST[UART_MAX_N] {1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 };

void setup() {
  delay(5000);
}

void loop() {
  // put your main code here, to run repeatedly:
  for (byte i = 0; i <= (UART_MAX_N-1); i++){

      Serial.begin(UART_SPEED_CONST[i].toInt());

      Serial.print("\nSpeed is = " + UART_SPEED_CONST[i]);

      delay(3000);

      Serial.end(); // wait for last transmitted data to be sent   
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

skilful пишет:

если Com Port Toolkit установить DTR в низкий уровень, то в порт на компьютер все нормально пишется

Это то самое, почему я Вам советовал попробовать другой терминал. Просто я не пользую толкит, а в простых программах, которые у меня, там всегда один уровень, потому и не мог досказать эту настройку.

skilful
Offline
Зарегистрирован: 18.01.2021

Спасибо. Неожиданное явление.

Следующее явление, которое надо будет понять или победить - это crazy led на Arduino Pro Mini (глюк работы сторожевого таймера)

sadman41
Offline
Зарегистрирован: 19.10.2016

Use Optiboot, Luke.