Теряются байты
- Войдите на сайт для отправки комментариев
Здравствуйте, не ругайтесь строго, я не так давно начала изучать программирование.
Не могу разобраться в следующем:
Две ардуино соединены между собой посредством 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(); } }
SoftwareSerial на скорости 115200
В общем то вся проблема тут описана
Скорость снизить, раз в 6, а лучше в 12.
Проверять пакеты на целостность контрольной суммой.
В том-то и дело, что скорость снизить нельзя. Как есть.
В том-то и дело, что скорость снизить нельзя. Как есть.
Тогда нужно использовать аппаратный UART
Кварц то какой ???
В том-то и дело, что скорость снизить нельзя. Как есть.
Аппаратный не поддерживает инверсию
В том-то и дело, что скорость снизить нельзя. Как есть.
Аппаратный не поддерживает инверсию
Инверсию поддерживают транзисторы
Аппаратный не поддерживает инверсию
Ну да, тут 115200. Но, однажды инвертировал входной сигнал на UART через прерывание. Только там было 1200 всего.
В том-то и дело, что скорость снизить нельзя. Как есть.
Аппаратный не поддерживает инверсию
А можно подробнее? С паяльником дружу.
Если тяготеете к паяльнику, тогда ставьте транзистор. А если лень, как мне, тогда играйтесь софтом.
А можно номинал VT1? Сама не подберу.
Так может лучше борщ варить?
Да хоть кт315, главное резисторы правильно подобрать. Если мозгов на это не хватает, то тогда лучше на кмоп элементах. В той же SN74HC хватает копеечных решений . Подойдут с элементами 2(4)И-НЕ, 2(4)ИЛИ-НЕ.
Вот схема соединения для каждого из типов элементов
Одной микросхемы должно хватить.
Так может лучше борщ варить?
а может лучше суп? Харчо...
а транзистор подойдёт любой npn - BC547, 2SC945, КТ-315 и так далее
а зачем нужен сериал с инверсией? и нельзя ли сначала принять байт. а потом инвертировать... программно
Видимо линия в покое в нуле находится ...
Ну так это лишние телодвижения. Нужно принять байт... А так, ни о чём не думаешь - UART это делает за тебя.
Ну так это лишние телодвижения. Нужно принять байт... А так, ни о чём не думаешь - UART это делает за тебя.
читаешь тему... 20 сообщений спорите про схемы через транзисторы ... неужели на фоне этого инвертировать байт - это "лишние телодвижения"? :)
Ну так это выражение для каждого по своему. Мне лично не приемлемо городить что то на транзисторе.)
Ну судя по всему там и старт/стоп биты инвертированы.
А почему так ? Мадемуазель, не рассказывали...
Может быть, это поможет?
http://arduino.ru/forum/programmirovanie/peredacha-dannykh-s-korrektsiei-oshibok
Потому что у меня есть детская игрушка, которая включает и выключает различные моторчики. вот мы с детьми и хотим научиться управлять этими моторчиками с ПК, а не с дисплея.
В документации сказано, что скорость 115200 и дальше все по стандарту, за исключением Signal Inversion.
Я читала про Hardware Serial в ардуино Mega, но наскольно я поняла нельзя в настройках изменить инверсию.
Может быть, это поможет?
http://arduino.ru/forum/programmirovanie/peredacha-dannykh-s-korrektsiei-oshibok
Спасибо, постараюсь сегодня почитать
В документации сказано, что скорость 115200 и дальше все по стандарту, за исключением Signal Inversion.
Я читала про Hardware Serial в ардуино Mega, но наскольно я поняла нельзя в настройках изменить инверсию.
Да, в железке нельзя изменить инверсию. Но в софте можно. Вопрос только в том что бы справился софт с такой скоростью. А тут вы уже должны экспериментировать.
Да, в железке нельзя изменить инверсию.
Это ты расскажи разработчикам CH340.
Да, в железке нельзя изменить инверсию.
Ой. Понятно что ничего нет невозможного. Какие проблемы!
Я же ж про потребителя.