Чтение-запись SoftwareSerial mySerial
- Войдите на сайт для отправки комментариев
Чт, 26/01/2017 - 18:30
#include <SoftwareSerial.h> SoftwareSerial mySerial(10, 11); void setup(){ Serial.begin(115200); mySerial.begin(115200); } void loop() { mySerial.println("AT"); delay(1000); Serial.write(mySerial.read()); delay(1000); //Serial.println("AT"); //delay(1000); //Serial.write(Serial.read()); //delay(1000); }
Почему в порт пишется яяяяяяяяяяяяяя....
А если
Serial.println("AT"); delay(1000); Serial.write(Serial.read()); delay(1000);
AT
яAT
яAT
яAT
яAT
Вероятней всего разная скорость передачи данных для порта: для примера - установите в своём коде скорость
и в мониторе : по умолчанию 9600
Добрый день! Прошу помочь разобраться с приемом данных через Softwareserial. Суть проекта в следующем. К клавиатуре автомагнитолы (к ногам Uart TX и Uart RX) подключил Arduino Uno R3 (на пины 8 и 9, скетч привожу ниже). Необходимо при нажатии кнопки магнитолы считать приходящий пакет данных через Softwareserial и передать его в Serial (для отображения в терминале на компьютере). Скетч №1:
Инициализация порта проходит, в терминал приходит сообщение: "sereal activated". При нажатии любой кнопки в терминал приходит "FF". Все время только "FF". У меня подозрение, что сообщение состоит из нескольких пакетов, скорее всего из 8. А приходит только первый. Помогите разобраться - как считать оставшуюся информацию?
Почему в порт пишется яяяяяяяяяяяяяя....
А если
Если цепляешь к какой то штуковине то соедени с ней минуса (Ардуино и штуковины). Без общего минуса будет ЯЯЯЯЯяяяяяя.. натюрлих
А теперь сложный вопрос. Есть Мега, есть Уно, и есть модуль SIM800L. Мега (здесь Software serial 10, 11) соеденина с Уно (здесь Software Serial 2, 3). Обмен онформацией проходит на отлично, 2 Ардуинки общаются без проблем. Подключаю на Uno модуль SIM800L, завожу на UNO еще один (Software Serial 8, 9) и тут проблема, UNO не видит ни Мегу ни GSM модуль.
Я так понимаю UNO не поддерживает одновременное существование 2-х Software Serial, разнесенных по пинам? Кто знает?
Сама библиотека не поддерживает одновременной работы с двумя Software Serial, Uno здесь ни при чем. Если нужно одновременно 3 порта - однозначно на Мегу.
Тяжело в учении, легко....., короче и в бою тяжело. Победил. Если нужно подцепить на Uno 2 устройства по Serial, используем для 1-го устройства библиотеку Software Serial, дальше как по учебнику, а для 2-го устройства подключаем еще одну библиотеку AltSoft Serial, и запускаем устройство через эту библиотеку. Оба устройства живут одновременно и без перекрестных ошибок и сбоев. По умолчаению в библиотеке AltSoft Serial задействованы ноги на Rx и Tx 8 и 9. Изменение их либо в кишках, либо подключаем одно из устрйосв на 8 и 9 порты и радуемся.
Пример кода
Прошу помочь с реализацией следующего проекта. Есть автомагнитола. Отдельно от нее блок кнопок. От блока кнопок к магнитоле идут несколько проводов. А именно: 12+ и GND, Illumination + (12V) и Illumination -, Remote+ (12V) и Remote-, UART TX и UART RX. Нужно считать коды нажатий каждой из 12 кнопок кнопочного блока, чтобы впоследстчии управлять ими через Ардуино с Андроид-устройства.
Я предполагаю, что именно по uart передается команда при нажатии кнопки на блоке кнопок. Я подключил tx и rx к 8 и 9 пинам Ардуино уно. Залил вот такой скетч:
В результате при нажатии любой кнопки, получаю в терминале сообщение FF. То есть нажатие любой из 12 кнопок отображается в терминале идентично. Если подключить Remote GND блока кнопок к GND на Ардуино, то приходит 0 вместо FF. Помогите разобраться, что я делаю не так. Проблема, вероятно, не в скетче?
Нужно ли подключать Remote + (через преобразователь 12В->5В) к пину 5V Ардуино?
gear2003, а Вы уверены, что нужна скорость именно 9600 или пробовали на всех возможных скоростях?
Пробовал на скоростях с 300 и до 38200 включительно (выше ничего не выводит вообще - слишком большая скорость). На всех остальных же выводит одинаково.
Я бы подключил к ардуино lcd экранчик и подключил бы через обычный сириал, ну или от кнопок через сириал на ардуину а комп к софтвейрсириал
Ну или использовать мегу 2560 с ее аппаратными портами, чтобы локализовать проблему.
Привет, Всем!
Возникла проблема. А как принять большую строку данных 4000 байт к примеру. Чето я в затыке :(
Привет, Всем!
Возникла проблема. А как принять большую строку данных 4000 байт к примеру. Чето я в затыке :(
почитать мануалы и понять что 4КбАЙТ это много аж 32КбИТ.
Serial.read()
Cчитывает очередной доступный байт из буфера последовательного соединения.
стандарт буфер 64 байта, ну многие советуют увеличить до 128 байта, а вот как 4кбайт принять ??
каком кверху.
наверно надо делить на пакеты и более того проверять проглотили ли предыдущий пакет. а это уже почти свой протокол обмена :)).
далее захочет проверочные байты и т.д. и т.п.
похоже на то ...
стандарт буфер 64 байта, ну многие советуют увеличить до 128 байта, а вот как 4кбайт принять ??
А зачем?
Отвечая на этот вопрос, вероятнее всего, Вы либо поймете, что на самом деле в приеме 4кБайт нет никакой необходимости, либо поймете, что выбрали аппаратные средства несообразные задаче.
С чтением я наконец разобрался. Итак, получилось считать коды нажатия кнопок. Оказалось, что softwareserial работает на частоте 57600. Теперь вопрос в другом - как отправить код обратно, чтобы управлять через ардуино магнитолой?
Например, кнопка включения питания посылает код 77 (при нажатии), 64 при отпускании. Т.е. нужно отправить "77" и следом "64". Попробовал вот такой скетч:
Никакого результата. Serial.print тоже не работает. Посоветуйте, как быть?
Итак, получилось считать коды нажатия кнопок.
каких кнопок?
Я же писал немного выше - кнопок магнитолы в машине.
ну, как-то так
mySerial.write(
77
);
mySerial.write(
64
);
или так
mySerial.print('
77'
);
mySerial.print('
64'
);
ну, как-то так
mySerial.write(
77
);
mySerial.write(
64
);
или так
mySerial.print('
77'
);
mySerial.print('
64'
);
К сожалению реакции никакой. Пробовал брать команду увеличения громкости. Она равна 129, т.е. достаточно одной записи. Не работает все-равно. Не пойму, в какую сторону копать. Провода Rx/Tx также пробовал менять местами.
Даю небольшую подсказку:
Вопрос: что рады видеть все моряки?
К сожалению реакции никакой.
ну, всё выше сказанное верно для хардварного UART <-> UART двух AVR контроллеров, запрограммированных Дуино ИДЕ.
во-первых: на какой скорости твоя клава работает?
во-вторых: юзай аппаратный UART.
По поводу земли тоже думал. Даже пробовал. Но нет - не помогло. Кстати смотрел видео, как америкосы подключали свое устройство (исходниками не делятся) для управления магнитолой как у меня. Так они там вообще обошлись одним проводом (подцепили на RX магнитолы). Так что думаю не в земле дело.
Клава работает на 57600. Прием в софтверный порт работает хорошо. Что ж, попробую сделать отправку по хардверному порту, отпишусь, если получится.
Да, еще мне кажется что если сигналы поступившие в software sirial на при определенной скорости интерпретируется как какие то значения вовсе не значит что данные значения посланные обратно будут интерпретировать счет как аналогичный сигнал. Надеюсь понятно объяснил мысль...
Так что думаю не в земле дело.
ты это серьёзно?
ты тупо два провода подключил?
Ага... Попробую землю еще раз, спасибо за советы!
Ага... Попробую землю еще раз, спасибо за советы!
ну, я не знаю - ладно два провода можно подключить, но утверждать, что видел видео, где по одному проводу сигнал передают пиндосы...
и, вдогонку наводящий вопрос: клава магнитолы от 5-ти вольт питается?
Магнитола 12в,.
Спасибо все за советы, все получилось после подключения земли!
Алилуя, моряки всегда правы)
Здравствуйте. что то я вообще голову сломал...
1. В общем есть устройство с сериал портом (допустим NEO-6M)
подключил к ардуино нано через SoftwareSerial mySerial(4, 3);
Первый способ - поменять RX и TX местами.
менял уже все, вообще все, если рх к рх / тх к тх , то лампочка приема перестает мигать, монитор по прежнему пуст. магия какая то.
и в 16ричном виде смотрел, ничего не приходит.
и скорости все менял
Я может и не прав, но устройства с железным COM портом а ля модем и прочее проверяю с помощью putty
проверял и путти и ардуиновским монитором и CoolTermWin...
в общем взял еще один gps приемник, работает везде прекрасно, а первый только через софт сериал :))) это возможно?
Как видите - да.
Здраствуйте, может не совсем по теме , но связано с serial.
Я научился записывать число (до 255) в EEPROM, но как подать команду с порта ,
что бы записать число в ячеку по выбору . Пример: в порт пишется число 234 и его нужно записать в 2 ячеку , а затем пишется число 1 и его нужно записать в 3 ячеку. Как с порта подать команду на запись числа в нужную ячеку памяти еепром?
Помогите разобраться или дайте ссылку на пример.
Заранее спасибо.
Рафаэль, по моему тут проблема в алгоритме, а не в чтении порта. вы в порт пишите номер ячейки и потом значение? или номер ячейки автоматически выбирается следующий?
Здравствуйте, мне нужно с порта назначать ячейку памяти и значение числа. Не могу понять алгоритм, как выбрать ячейку и число. Ведь не назначишь числовые команды в скетче. Ведь число может быть равным тому, что требуется записать.
Можете писать одной строкой к примеру 3 234 или придумать любой другой код или последовательность x 3 y 234
3:234
Вообще все что угодно
Это понятно, но какую функцию использовать для выполнения сравнения, через if или case?
Разберитесь с любым примером парсинга строки
Можно ссылку на тему?
Делайте два раза Serial.parseInt(), в первый принимаете номер ячейки, во второй данные. В терминале просто подряд два числа через пробел пишете и все. Для простых задач это вполне подходящее быстрое решение. Пример чтения с парсингом - в мануале по Serial (на офсайте ардуины).
Спасибо большое. Сейчас займусь ликбезом.
Извините, а можете пример скетча написать?
Заранее спасибо.
Достаточно простой, но гораздо более надежный способ - однобуквенные команды. Например, записать по адресу 7 число 13:
A7D13
иначе очень просто получить рассинхронизацию, и опять получится путаница - где номер ячейки, а где заносимые в нее данные.