Чтение-запись SoftwareSerial mySerial

Sergeyevd
Sergeyevd аватар
Offline
Зарегистрирован: 25.03.2014
#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
 
Aleks_neofit
Aleks_neofit аватар
Offline
Зарегистрирован: 28.12.2016

Вероятней всего разная скорость передачи данных для порта: для примера - установите в своём коде скорость 

Serial.begin(9600);

mySerial.begin(9600);

и в мониторе : по умолчанию 9600

 

gear2003
Offline
Зарегистрирован: 15.02.2017

Добрый день! Прошу помочь разобраться с приемом данных через Softwareserial. Суть проекта в следующем. К клавиатуре автомагнитолы (к ногам Uart TX и Uart RX) подключил Arduino Uno R3 (на пины 8 и 9, скетч привожу ниже). Необходимо при нажатии кнопки магнитолы считать приходящий пакет данных через Softwareserial и передать его в Serial (для отображения в терминале на компьютере). Скетч №1:



#include <SoftwareSerial.h>

SoftwareSerial mySerial(8, 9);

void setup() 
{
Serial.begin(9600);
while (!Serial)
{;}

Serial.println("sereal activated");
mySerial.begin(9600);
}

void loop() 
{
if (mySerial.available()) 
{
Serial.print((byte)mySerial.read(), HEX);
Serial.print(" ");
}
}

 

Инициализация порта проходит, в терминал приходит сообщение: "sereal activated". При нажатии любой кнопки в терминал приходит "FF". Все время только "FF". У меня подозрение, что сообщение состоит из нескольких пакетов, скорее всего из 8. А приходит только первый. Помогите разобраться - как считать оставшуюся информацию?

V-max VL
Offline
Зарегистрирован: 22.04.2016

Sergeyevd пишет:

#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
 

Если цепляешь к какой то штуковине то соедени с ней минуса (Ардуино и штуковины). Без общего минуса будет ЯЯЯЯЯяяяяяя.. натюрлих

V-max VL
Offline
Зарегистрирован: 22.04.2016

А теперь сложный вопрос. Есть Мега, есть Уно, и есть модуль SIM800L. Мега (здесь Software serial 10, 11) соеденина с Уно (здесь Software Serial 2, 3). Обмен онформацией проходит на отлично, 2 Ардуинки общаются без проблем. Подключаю на Uno модуль SIM800L, завожу на UNO еще один (Software Serial 8, 9) и тут проблема, UNO не видит ни Мегу ни GSM модуль.

Я так понимаю UNO не поддерживает одновременное существование 2-х Software Serial, разнесенных по пинам? Кто знает?

 

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

Сама библиотека не поддерживает одновременной работы с двумя Software Serial, Uno здесь ни при чем. Если нужно одновременно 3 порта - однозначно на Мегу.

V-max VL
Offline
Зарегистрирован: 22.04.2016

Тяжело в учении, легко....., короче и в бою тяжело. Победил. Если нужно подцепить на Uno 2 устройства по Serial, используем для 1-го устройства библиотеку Software Serial, дальше как по учебнику, а для 2-го устройства подключаем еще одну библиотеку AltSoft Serial, и запускаем устройство через эту библиотеку. Оба устройства живут одновременно и без перекрестных ошибок и сбоев. По умолчаению в библиотеке AltSoft Serial задействованы ноги на Rx и Tx 8 и 9. Изменение их либо в кишках, либо подключаем одно из устрйосв на 8 и 9 порты и радуемся.

Пример кода

#include <SoftwareSerial.h>
#include <AltSoftSerial.h>
SoftwareSerial mod1 (2, 3);    // RX, TX
AltSoftSerial mod2;               //(8, 9) RX, TX по умолчанию
 
int ch=0;                                  
String val ="";                            
 
void setup() {
 Serial.begin(9600);
 delay(100);
 mod1.begin(9600);
 delay(100);
 Serial.println("Mod1 start");
 mod2.begin(9600);
 delay(100);
 Serial.println("Mod2 start");
}
 
void loop(){
  if (mod1.available()){
   while(mod1.available())
                     {                                         
                     char ch = mod1.read();                        
                     val += ch;                         
                     } 
                     Serial.print(val);
                     val="";                     
                     }
 
  if (mod2.available()){
   while(mod2.available())
                     {                                         
                     сhar ch = mod2.read();                        
                     val += ch;                         
                     } 
                     Serial.print(val); 
                     val="";
                     }
 
}
gear2003
Offline
Зарегистрирован: 15.02.2017

Прошу помочь с реализацией следующего проекта. Есть автомагнитола. Отдельно от нее блок кнопок. От блока кнопок к магнитоле идут несколько проводов. А именно: 12+ и GND, Illumination + (12V) и Illumination -, Remote+ (12V) и Remote-, UART TX и UART RX. Нужно считать коды нажатий каждой из 12 кнопок кнопочного блока, чтобы впоследстчии управлять ими через Ардуино с Андроид-устройства.

Я предполагаю, что именно по uart передается команда при нажатии кнопки на блоке кнопок.  Я подключил tx и rx к 8 и 9 пинам Ардуино уно. Залил вот такой скетч:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 9);
unsigned char buf;

void setup()
{
 Serial.begin(9600);
	while (!Serial)
{
;
}
	Serial.println("sereal activate");
	mySerial.begin(9600);
}

void loop()
{
	if (mySerial.available())
	{
	while (mySerial.available())
		{
		buf = mySerial.read();
		}
	Serial.print(buf, HEX);Serial.print(" ");
	}
}

В результате при нажатии любой кнопки, получаю в терминале сообщение FF. То есть нажатие любой из 12 кнопок отображается в терминале идентично. Если подключить Remote GND блока кнопок к GND на Ардуино, то приходит 0 вместо FF. Помогите разобраться, что я делаю не так. Проблема, вероятно, не в скетче?

Нужно ли подключать Remote + (через преобразователь 12В->5В) к пину 5V Ардуино?

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

gear2003, а Вы уверены, что нужна скорость именно 9600 или пробовали на всех возможных скоростях?

gear2003
Offline
Зарегистрирован: 15.02.2017

Пробовал на скоростях с 300 и до 38200 включительно (выше ничего не выводит вообще - слишком большая скорость). На всех остальных же выводит одинаково.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Я бы подключил к ардуино lcd экранчик и подключил бы через обычный сириал, ну или от кнопок через сириал на ардуину а комп к софтвейрсириал

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

Ну или использовать мегу 2560 с ее аппаратными портами, чтобы локализовать проблему.

vins
Offline
Зарегистрирован: 22.09.2016

Привет, Всем!

Возникла проблема. А как принять большую строку данных 4000 байт к примеру. Чето я в затыке :( 

arDubino
Offline
Зарегистрирован: 12.01.2017

vins пишет:

Привет, Всем!

Возникла проблема. А как принять большую строку данных 4000 байт к примеру. Чето я в затыке :( 

почитать мануалы и понять что 4КбАЙТ это много аж 32КбИТ.

Serial.read()

Cчитывает очередной доступный байт из буфера последовательного соединения.

 

vins
Offline
Зарегистрирован: 22.09.2016

стандарт буфер 64 байта, ну многие советуют увеличить  до 128 байта, а вот как 4кбайт принять ??

arDubino
Offline
Зарегистрирован: 12.01.2017

каком кверху.

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

далее захочет проверочные байты и т.д. и т.п.

vins
Offline
Зарегистрирован: 22.09.2016

похоже на то ...

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

vins пишет:

стандарт буфер 64 байта, ну многие советуют увеличить  до 128 байта, а вот как 4кбайт принять ??

А зачем?

Отвечая на этот вопрос, вероятнее всего, Вы либо поймете, что на самом деле в приеме 4кБайт нет никакой необходимости, либо поймете, что выбрали аппаратные средства несообразные задаче.

gear2003
Offline
Зарегистрирован: 15.02.2017

С чтением я наконец разобрался. Итак, получилось считать коды нажатия кнопок. Оказалось, что softwareserial работает на частоте 57600. Теперь вопрос в другом - как отправить код обратно, чтобы управлять через ардуино магнитолой?

Например, кнопка включения питания посылает код 77 (при нажатии), 64 при отпускании. Т.е. нужно отправить "77" и следом "64". Попробовал вот такой скетч:

#include <SoftwareSerial.h>

SoftwareSerial genesisSerial(8, 9);



void setup() 
{
Serial.begin(57600);
while (!Serial)
{;}

Serial.println("sereal activated");
mySerial.begin(57600);
}

void loop() 
{

mySerial.write("77"); mySerial.write("64");
}

Никакого результата. Serial.print тоже не работает. Посоветуйте, как быть?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

gear2003 пишет:

Итак, получилось считать коды нажатия кнопок.

каких кнопок?

gear2003
Offline
Зарегистрирован: 15.02.2017

Я же писал немного выше - кнопок магнитолы в машине.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

ну, как-то так

mySerial.write(77);

mySerial.write(64);

или так

mySerial.print('77');

mySerial.print('64');

 

gear2003
Offline
Зарегистрирован: 15.02.2017

Клапауций 112 пишет:

ну, как-то так

mySerial.write(77);

mySerial.write(64);

или так

mySerial.print('77');

mySerial.print('64');

 

К сожалению реакции никакой. Пробовал брать команду увеличения громкости. Она равна 129, т.е. достаточно одной записи. Не работает все-равно. Не пойму, в какую сторону копать. Провода Rx/Tx также пробовал менять местами.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Даю небольшую подсказку:
Вопрос: что рады видеть все моряки?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

gear2003 пишет:

К сожалению реакции никакой.

ну, всё выше сказанное верно для хардварного UART <-> UART двух AVR контроллеров, запрограммированных Дуино ИДЕ.

во-первых: на какой скорости твоя клава работает?

во-вторых: юзай аппаратный UART.

gear2003
Offline
Зарегистрирован: 15.02.2017

По поводу земли тоже думал. Даже пробовал. Но нет - не помогло. Кстати смотрел видео, как америкосы подключали свое устройство (исходниками не делятся) для управления магнитолой как у меня. Так они там вообще обошлись одним проводом (подцепили на RX магнитолы). Так что думаю не в земле дело.

 

Клава работает на 57600. Прием в софтверный порт работает хорошо. Что ж, попробую сделать отправку по хардверному порту, отпишусь, если получится.

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Да, еще мне кажется что если сигналы поступившие в software sirial на при определенной скорости интерпретируется как какие то значения вовсе не значит что данные значения посланные обратно будут интерпретировать счет как аналогичный сигнал. Надеюсь понятно объяснил мысль...

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

gear2003 пишет:

Так что думаю не в земле дело.

ты это серьёзно?

ты тупо два провода подключил?

gear2003
Offline
Зарегистрирован: 15.02.2017

Ага... Попробую землю еще раз, спасибо за советы!

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

gear2003 пишет:

Ага... Попробую землю еще раз, спасибо за советы!

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

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

и, вдогонку наводящий вопрос: клава магнитолы от 5-ти вольт питается?

gear2003
Offline
Зарегистрирован: 15.02.2017

Магнитола 12в,.

Спасибо все за советы, все получилось после подключения земли!

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

Алилуя, моряки всегда правы)

Kuss
Offline
Зарегистрирован: 15.04.2018

Здравствуйте. что то я вообще голову сломал...

1. В общем есть устройство с сериал портом (допустим NEO-6M)

подключил к ардуино нано через SoftwareSerial mySerial(4, 3);

вывожу в железный инфу, все прекрасно работает (т.е. проверил что устройство рабочее)
  Serial.begin(9600);
  mySerial.begin(9600);
 
2. есть переходник usb to ttl (при замыкании RX TX в порт выводит то что ввожу, т.е. проверил, тоже работает)
так вот при подключении NEO-6M через этот переходник, монитор молчит, вообще ничего, хотя лампочка RX моргает.
 
в чем подвох? в чем разница работы железного и софтового портов? я просто не смог неделю назад подключить НЕО к третьему устройству (на коротом железный порт), и пошел по порядку проверять в чем проблема.
sadman41
Offline
Зарегистрирован: 19.10.2016

Первый способ - поменять RX и TX местами.

Kuss
Offline
Зарегистрирован: 15.04.2018

менял уже все, вообще все, если рх к рх / тх к тх , то лампочка приема перестает мигать, монитор по прежнему пуст. магия какая то.

и в 16ричном виде смотрел, ничего не приходит.

Kuss
Offline
Зарегистрирован: 15.04.2018

и скорости все менял

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Я может и не прав, но устройства с железным COM портом а ля модем и прочее проверяю с помощью putty

Kuss
Offline
Зарегистрирован: 15.04.2018

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

в общем взял еще один gps приемник, работает везде прекрасно, а первый только через софт сериал :))) это возможно?

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

Как видите - да.

Рафаэль
Offline
Зарегистрирован: 15.04.2018

Здраствуйте, может не совсем по теме , но связано с serial.


 #include <EEPROM.h>

int eep;
int del;


void setup() {
  Serial.begin(9600);// put your setup code here, to run once:

}

void loop() {
  if (Serial.available() > 0) { 
    eep = Serial.parseInt();
    EEPROM.update(0, eep)
      delay(5); 
    del = EEPROM.read(0);
    Serial.print("IMPULS="); 
    Serial.println(del);
Serial.flush();  
}
// put your main code here, to run repeatedly:

}

Я научился записывать число (до 255) в EEPROM, но как подать команду с порта , 

что бы записать число в ячеку по выбору . Пример: в порт пишется число 234 и его нужно записать в 2 ячеку , а затем пишется число 1 и его нужно записать в 3 ячеку. Как с порта подать команду на запись числа в нужную ячеку памяти еепром?

Помогите разобраться или дайте ссылку на пример.

Заранее спасибо.

Kuss
Offline
Зарегистрирован: 15.04.2018

Рафаэль, по моему тут проблема в алгоритме, а не в чтении порта. вы в порт пишите номер ячейки и потом значение? или номер ячейки автоматически выбирается следующий?

Рафаэль
Offline
Зарегистрирован: 15.04.2018

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

Kuss
Offline
Зарегистрирован: 15.04.2018

Можете писать одной строкой к примеру 3 234 или придумать любой другой код или последовательность x 3 y 234
3:234
Вообще все что угодно

Рафаэль
Offline
Зарегистрирован: 15.04.2018

Это понятно, но какую функцию использовать для выполнения сравнения, через if или case?

Kuss
Offline
Зарегистрирован: 15.04.2018

Разберитесь с любым примером парсинга строки

Рафаэль
Offline
Зарегистрирован: 15.04.2018

Можно ссылку на тему?

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

Делайте два раза Serial.parseInt(), в первый принимаете номер ячейки, во второй данные. В терминале просто подряд два числа через пробел пишете и все. Для простых задач это вполне подходящее быстрое решение. Пример чтения с парсингом - в мануале по Serial (на офсайте ардуины).

Рафаэль
Offline
Зарегистрирован: 15.04.2018

Спасибо большое. Сейчас займусь ликбезом.

Рафаэль
Offline
Зарегистрирован: 15.04.2018

Извините, а можете пример скетча написать?
Заранее спасибо.

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

Достаточно простой, но гораздо более надежный способ - однобуквенные команды. Например, записать по адресу 7 число 13:

A7D13

иначе очень просто получить рассинхронизацию, и опять получится путаница - где номер ячейки, а где заносимые в нее данные.