Теряются байты

dinz
Offline
Зарегистрирован: 07.04.2022

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

Не могу разобраться в следующем:

Две ардуино соединены между собой посредством SoftwareSerial через пины 7 и 8 (перехлестом) на скорости 115200 с инверсией сигнала.

Первая ардуино каждые 500 мс отправляет второй ардуине набор байт вида 0x4D,0x7A,0x12,0x00,0x00,0x00,0x00,0x00,0x07,0x01,0x01,0x01,0x5D,0x87,0x5D,0x57,0x78,0x78,0x3C,0x3C,0x3C,0x3C,0x3C,0x01,0x01,0xFF,0xFF,0xFF,0x00,0x0A,0x01,0x00,0x07,0x01,0x01,0x01,0x5D,0x87,0x5D,0x57,0x78,0x78,0x3C,0x3C,0x3C,0x3C,0x3C,0x01,0x01,0xFF,0xFF,0xFF,0x00,0x0A,0x01,0x02,0x0B,0x03,0x00,0x05,0x01,0x00,0xF0,0x3C,0x3C,0x3C,0x3C,0x01,0x01,0xFF,0x00,0x00,0x00,0x20,0x4C,0x4D

Данные всегда начинаются и заканчиваются одним и тем же байтом 0x4D. Длина пакета может быть разная, 30 – 80 байт.

Я размещаю принятые данные в массив и вывожу в монитор порта, но из 10 – 15 пакетов часть данных может передаться с ошибками.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8, true); // RX, TX, инверсия
byte input = 0;
int razmer_arr = 0;
byte priem[150] = {};
int count = 0;

void setup() {
  Serial.begin(9600);
  mySerial.begin(115200);
}

void loop(){
  priemSerial();
}

void priemSerial(){
  if (mySerial.available() > 0){
    input = mySerial.read();
    priem[count] = input;
    count++;  
  } else {
    if (count != 0){
      Serial.println(); 
      razmer_arr = count;
      for (int i = 0; i < razmer_arr; i++) {        
        Serial.print(" "); Serial.print(priem[i], HEX);
      }
      otpravka();
    }    
    count = 0;
    mySerial.flush();    
  }
}

 

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

dinz пишет:

SoftwareSerial на скорости 115200

В общем то вся проблема тут описана

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

Скорость снизить, раз в 6, а лучше в 12.
Проверять пакеты на целостность контрольной суммой.

dinz
Offline
Зарегистрирован: 07.04.2022

В том-то и дело, что скорость снизить нельзя. Как есть.

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

dinz пишет:

В том-то и дело, что скорость снизить нельзя. Как есть.


Тогда нужно использовать аппаратный UART

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Кварц то какой ???

dinz
Offline
Зарегистрирован: 07.04.2022

Kakmyc пишет:
dinz пишет:

В том-то и дело, что скорость снизить нельзя. Как есть.

Тогда нужно использовать аппаратный UART

Аппаратный не поддерживает инверсию

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

dinz пишет:

Kakmyc пишет:
dinz пишет:

В том-то и дело, что скорость снизить нельзя. Как есть.

Тогда нужно использовать аппаратный UART

Аппаратный не поддерживает инверсию


Инверсию поддерживают транзисторы

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

dinz пишет:

Аппаратный не поддерживает инверсию


Ну да, тут 115200. Но, однажды инвертировал входной сигнал на UART через прерывание. Только там было 1200 всего.

dinz
Offline
Зарегистрирован: 07.04.2022

Kakmyc пишет:
dinz пишет:

Kakmyc пишет:
dinz пишет:

В том-то и дело, что скорость снизить нельзя. Как есть.

Тогда нужно использовать аппаратный UART

Аппаратный не поддерживает инверсию

Инверсию поддерживают транзисторы

А можно подробнее? С паяльником дружу.

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

Если тяготеете к паяльнику, тогда ставьте транзистор. А если лень, как мне, тогда играйтесь софтом.

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

dinz
Offline
Зарегистрирован: 07.04.2022

Kakmyc пишет:

А можно номинал VT1? Сама не подберу.

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

Так может лучше борщ варить?

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

Да хоть кт315, главное резисторы правильно подобрать. Если мозгов на это не хватает, то тогда лучше на кмоп элементах. В той же SN74HC хватает копеечных решений . Подойдут с элементами 2(4)И-НЕ, 2(4)ИЛИ-НЕ.

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

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

Вот схема соединения для каждого из типов элементов 

 

Одной микросхемы должно хватить.

 

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

Green пишет:

Так может лучше борщ варить?

а может лучше суп? Харчо...
а транзистор подойдёт любой npn - BC547, 2SC945, КТ-315 и так далее

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

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Видимо линия в покое в нуле находится ...

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

Ну так это лишние телодвижения. Нужно принять байт... А так, ни о чём не думаешь - UART это делает за тебя.

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

Green пишет:

Ну так это лишние телодвижения. Нужно принять байт... А так, ни о чём не думаешь - UART это делает за тебя.

читаешь тему... 20 сообщений спорите про схемы через транзисторы ... неужели на фоне этого инвертировать байт - это "лишние телодвижения"? :)

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

Ну так это выражение для каждого по своему. Мне лично не приемлемо городить что то на транзисторе.)

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

Ну судя по всему там и старт/стоп биты инвертированы.
А почему так ? Мадемуазель, не рассказывали...

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

dinz пишет:
часть данных может передаться с ошибками.

Может быть, это поможет? 

http://arduino.ru/forum/programmirovanie/peredacha-dannykh-s-korrektsiei-oshibok

dinz
Offline
Зарегистрирован: 07.04.2022

Kakmyc пишет:
Ну судя по всему там и старт/стоп биты инвертированы. А почему так ? Мадемуазель, не рассказывали...

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

В документации сказано, что скорость 115200 и дальше все по стандарту, за исключением Signal Inversion.

Я читала про Hardware Serial в ардуино Mega, но наскольно я поняла нельзя в настройках изменить инверсию. 

dinz
Offline
Зарегистрирован: 07.04.2022

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

dinz пишет:
часть данных может передаться с ошибками.

Может быть, это поможет? 

http://arduino.ru/forum/programmirovanie/peredacha-dannykh-s-korrektsiei-oshibok

Спасибо, постараюсь сегодня почитать

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

dinz пишет:

В документации сказано, что скорость 115200 и дальше все по стандарту, за исключением Signal Inversion.

Я читала про Hardware Serial в ардуино Mega, но наскольно я поняла нельзя в настройках изменить инверсию. 


Да, в железке нельзя изменить инверсию. Но в софте можно. Вопрос только в том что бы справился софт с такой скоростью. А тут вы уже должны экспериментировать.

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

Green пишет:

Да, в железке нельзя изменить инверсию.


Это ты расскажи разработчикам CH340.

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

Kakmyc пишет:
Green пишет:

Да, в железке нельзя изменить инверсию.

Это ты расскажи разработчикам CH340.

Ой. Понятно что ничего нет невозможного. Какие проблемы!
Я же ж про потребителя.