rfid to serial to socket to rasp(python)

shiyri
Offline
Зарегистрирован: 20.08.2019

Привет, Помогите пожалста. Есть скрипт который собирает данные rfid метки и отправляет на serial(arduino + rfid rc522), есть скрипт на питоне в малине который должен принять код метки, помогие соеденить через сеть. Когда считываю serial и пытаюсь отправить через socket получаю первый число метки:

#include <Ethernet.h>
#include <SPI.h>
char ser;
byte mac[] = { 0xBE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 178 };
byte server[] = { 192, 168, 0, 36 }; 
int tcp_port = 9999;

EthernetClient client;
void(* resetFunc) (void) = 0;//объявляем функцию reset с адресом 0
void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);

  delay(500);
  if (client.connect(server, tcp_port)) { 
   
  } else {
    resetFunc(); //вызываем reset
  }
}

void loop()
{ 
 
  if (Serial.available()>0)
  {
    ser = Serial.read();
    client.write(ser); // Send what is reed on serial monitor
    client.stop();
    Serial.print(ser);delay(500);
    resetFunc(); //вызываем reset
  
  }
}

 

shiyri
Offline
Зарегистрирован: 20.08.2019

Причем, если сделать такой вид:

void loop()
{ 
     client.write("fkgfgk dfsfskdf");
}

Передается строка как надо!

Morroc
Offline
Зарегистрирован: 24.10.2016

resetFunc(); //вызываем reset

зачем ?

shiyri
Offline
Зарегистрирован: 20.08.2019

Morroc пишет:

resetFunc(); //вызываем reset

зачем ?

Ведь вопрос не в этом......

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

Сначала соберите весь ID в строку/число, а потом только посылайте его.

Разве не очевидно, по какой причине на стороне raspberry получаете только один символ?

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

Дак ты первый символ метки и отправляешь. Один. А потом, ХРЯСЬ!!!, и Reset.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ахха-ха))) Я вообще нуб в программировании но тоже это заметил. Смутили «умные слова про передачу данных» (не дорос я ещё до этого). И ресет вообще убил. Зачем ресет? Это где то описано в документации? (Интересно узнать)

Morroc
Offline
Зарегистрирован: 24.10.2016

BOOM пишет:

Интересно узнать

а то )))

shiyri
Offline
Зарегистрирован: 20.08.2019

Да дело не в reset,

void loop()
{ 
 
  if (Serial.available()>0)
  {
    ser = Serial.read();
    client.write("врврвраврвра"); // Send what is reed on serial monitor
    client.stop();
    Serial.print(ser);delay(500);
    resetFunc(); //вызываем reset
  
  }
}

вот так тоже вся строка передается, проблема в том, client.write() считанное из Serial.read() не принимает.

Или как сделать переменную из Serial.read() в кавычках "value"? 

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

Да ты идиот штоли?  Так 

client.write("врврвраврвра");

ты сразу всю строку передаешь, а так 

client.write(ser);

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

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

тебе надо сначала собрать ВСЮ переданную СТРОКУ, а не один символ char, коим является ser, и передать уже ВСЮ СТРОКУ. Херли тут непонятного? 

Канешна, ватьмашу, дело не в резет, а в (сам придумай)

 Не зли меня... 

shiyri
Offline
Зарегистрирован: 20.08.2019

Убрал перезагрузку, эффект тот же 1 символ

#include <Ethernet.h>
#include <SPI.h>
char ser;
byte mac[] = { 0xBE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 178 };
byte server[] = { 192, 168, 0, 36 }; 
int tcp_port = 9999;

EthernetClient client;
void(* resetFunc) (void) = 0;//объявляем функцию reset с адресом 0
void setup()
{
  Ethernet.begin(mac, ip);
  Serial.begin(9600);

  delay(500);
  if (client.connect(server, tcp_port)) { 
   
  } 
}

void loop()
{ 
 
  if (Serial.available()>0)
  {
    ser = Serial.read();
    client.write(ser); // Send what is reed on serial monitor
    client.stop();
    Serial.print(ser);delay(500);
    
  
  }
}

 

shiyri
Offline
Зарегистрирован: 20.08.2019

Если переменную делаю тип String то на client.write() выходит ошибка:

no matching function for call to 'EthernetClient::write(String&)'

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

Бросьте, это дело не ваше.

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

shiyri пишет:

Если переменную делаю тип String то на client.write() выходит ошибка:

no matching function for call to 'EthernetClient::write(String&)'

мошт, так надо: 

String YourVar;

.

.

.

client.write(YourVar.c_str());

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

sadman41 пишет:

Бросьте, это дело не ваше.

+100500

Morroc
Offline
Зарегистрирован: 24.10.2016

shiyri пишет:

Убрал перезагрузку, эффект тот же 1 символ

Разберите построчно этот код

  if (Serial.available()>0)
  {
    ser = Serial.read();
    client.write(ser); // Send what is reed on serial monitor
    client.stop();
    Serial.print(ser);delay(500);
  }

Что именно вы считываете по read(), что передаете, зачем после этого сразу stop() ? зачем делали reset (ну какая то мысль была же, пусть и ошибочная) ? зачем delay в конце ? вы там с бубном вокруг кода пляшите что ли ? ) как поймете каждую строчку (и нужна ли она) - может быть заработает

shiyri
Offline
Зарегистрирован: 20.08.2019


void loop()
{ 
   if (Serial.available()>0)
  {
    ser = Serial.read();
    client.write(ser.c_str()); // Send what is reed on serial monitor
    client.stop();
    Serial.print(ser);delay(500);
    }
}

Если так делаю то, аруино пересылает в другой какой то системе например j это 10610, причем до малины дошло только 106.


void loop()
{ 
   if (Serial.available()>0) //смотрим если ли что в порте, если есть идем дальше
  {
    ser = Serial.read(); // читам что там прислали
    client.write(ser.c_str()); // пишем в socket
    client.stop(); //закрываем сессию
    Serial.print(ser); // давай тут посмотрим что мы наотправляли и сравним с малиной
    }
}

 

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

поставлю-ка я вопрос по-другому, сколько символов может влесть в переменную char ser;?

Morroc
Offline
Зарегистрирован: 24.10.2016

shiyri пишет:

   if (Serial.available()>0) //смотрим если ли что в порте, если есть идем дальше
  {
    ser = Serial.read(); // читам что там прислали
...
    client.stop(); //закрываем сессию
...

    }

А если еще не все прислали по Serial ?

shiyri
Offline
Зарегистрирован: 20.08.2019

эммм 1 алфавитно-цифровой

shiyri
Offline
Зарегистрирован: 20.08.2019

Тогда ждать..... других инструкций ж нет

shiyri
Offline
Зарегистрирован: 20.08.2019

То есть надо из алфавитно-цифрового кода метки сделать только цифровой код и его норм передать в INT?

shiyri
Offline
Зарегистрирован: 20.08.2019

в int такая же ерунда, т.е. надо передать как-то массив?

shiyri
Offline
Зарегистрирован: 20.08.2019

а если строку разбить посимвольно, и потом собрать на другом конце?

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

shiyri пишет:

а если строку разбить посимвольно, и потом собрать на другом конце?

её надо сначала собрать из символов, которые ты читаешь как Serial.read().  Ты описание на нее читал?  Сколько символов она аддаёт за 1 вызов?

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

shiyri - сколько символов у тебя в RFID? - 10 ? 16? - а ты принимаешь только один!

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

Но только по твоим вопросам я вижу, что ты абсолютно деревянный (без обид). Тебе надо сесть и прочитать какую-то книжку по программированию, прорешать примеры - и только потом вернутся к этой задачке.  А с нынесними твоими "знаниями" у тебя нет ни малейшего шанса решить задачу.

shiyri
Offline
Зарегистрирован: 20.08.2019
void printDec(byte *buffer, byte bufferSize) {
    Serial.print(buffer[0], DEC);
    Serial.print(buffer[1], DEC);
    Serial.print(buffer[2], DEC);
    Serial.print(buffer[3], DEC);}

вот так работает, считывает.

void printDec(byte *buffer, byte bufferSize) {
Serial.print(buffer[0], DEC);
Serial.print(buffer[1], DEC);
Serial.print(buffer[2], DEC);
Serial.print(buffer[3], DEC);
sscanf(*buffer, "%[^,], %[^,], %[^,], %[^,]", &str1, &str2, &str3, &str4);
Serial.println(str1);
Serial.println(str2);
Serial.println(str3);
Serial.println(str4);
}

вот так зависает в порт валиться абра-кадабра бесконечно.

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

что это вообще? Как первое "считывает", если это оператор print?

Во втором случае зачем сначала снова первый вариант?

Вы чего вообще добиться-то хотите? вроде в предпоследнем сообщении я вам четко обьяснил. что надо делать. Это ваше решение не имеет ничего общего с моими рекомендациями... или вы уже совсем о другом?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Правильно заданный вопрос - 80% ответа. Жалко, что правильно задать вопрос далеко не с первого раза получается. Или не получается вообще. 

Morroc
Offline
Зарегистрирован: 24.10.2016

shiyri пишет:
вот так зависает в порт валиться абра-кадабра бесконечно.

Вывод - это фигня, было бы чего выводить, а вот как вы buffer заполняете ? 

shiyri
Offline
Зарегистрирован: 20.08.2019

оказалось просто:))))

void printDec(byte *buffer, byte bufferSize) {
String value ;
for (int i = 0; i < 4; ++i)
{
    value +=buffer[i] ;
}
Serial.println(value); 

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

shiyri пишет:

оказалось просто:))))

void printDec(byte *buffer, byte bufferSize) {
String value ;
for (int i = 0; i < 4; ++i)
{
    value +=buffer[i] ;
}
Serial.println(value); 

 

Ну попробуй buffer из 7ми символов обработать...

Morroc
Offline
Зарегистрирован: 24.10.2016

охх...

shiyri
Offline
Зарегистрирован: 20.08.2019

BOOM пишет:

shiyri пишет:

оказалось просто:))))

void printDec(byte *buffer, byte bufferSize) {
String value ;
for (int i = 0; i < 4; ++i)
{
    value +=buffer[i] ;
}
Serial.println(value); 

 

Ну попробуй buffer из 7ми символов обработать...

 

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

например: 3518216427
 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Так проканало с 7ю то или нет?

shiyri
Offline
Зарегистрирован: 20.08.2019

BOOM пишет:

Так проканало с 7ю то или нет?

Я тебя не понимаю!

У меня на метках только такой код, как я его увеличу?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Да ну нафиг. Я же о последнем куске кода говорю. И конкретно про переменную buffer. 

shiyri
Offline
Зарегистрирован: 20.08.2019
void printDec(byte *buffer, byte bufferSize) {
String value ;
for (int i = 0; i < 7; ++i)
{
    value +=buffer[i] ;
}
Serial.println(value); 

так?

получается :

3518216427000

а если 4 прохода if то

3518216427
 

 

shiyri
Offline
Зарегистрирован: 20.08.2019
void printDec(byte *buffer, byte bufferSize) {
for (int i = 0; i < 4; ++i)
{
value +=buffer[i];
} Serial.println(value); 
}
void requestEvent() {
Wire.write(value); 
}

no matching function for call to 'TwoWire::write(String&)'

у меня же переменная value в String изначально.....

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

shiyri пишет:

void printDec(byte *buffer, byte bufferSize) {
String value ;
for (int i = 0; i < 7; ++i)
{
    value +=buffer[i] ;
}
Serial.println(value); 

а если 4 прохода if то

3518216427

Что еще за четыре прохода if? Откуда это все вообще?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

shiyri пишет:

no matching function for call to 'TwoWire::write(String&)'

у меня же переменная value в String изначально.....

На это уже дед отвечал в ЭТОЙ ЖЕ теме...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Пользуйся:


String valuePrint;
byte byteMass[] = {'T', 93, 'eq', 55, 'E', 93, 'eq', 47};

void setup() {
  Serial.begin(9600);
  delay(200);
  Serial.print("Byte massive: ");
  Serial.println((char*)byteMass);
  delay(200);
  Serial.println("String from byte massive: ");
}

void loop() {
  valuePrint = getStringFromByteMass (byteMass, sizeof(byteMass));
  Serial.println(valuePrint); 
  delay(2000);
}

String getStringFromByteMass (byte *buffer, byte bufferSize) {
  String value ;
  for (int i = 0; i < bufferSize; i++) {
    value += (char)buffer[i];
  }
  return value;
}

Почитай хотя бы эту книгу.

shiyri
Offline
Зарегистрирован: 20.08.2019
void printDec(byte *buffer, byte bufferSize) {

for (int i = 0; i < 4; ++i)
{
    value +=buffer[i];
    

   } Serial.println(value); 
   }
  void requestEvent() {
  Wire.write(value.c_str()); 
   }

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

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

Причем я тебе готовую функцию дал, но ты ее даже не смотрел (или не понял что это вообще такое). 

shiyri
Offline
Зарегистрирован: 20.08.2019

BOOM пишет:

Пользуйся:


String valuePrint;
byte byteMass[] = {'T', 93, 'eq', 55, 'E', 93, 'eq', 47};

void setup() {
  Serial.begin(9600);
  delay(200);
  Serial.print("Byte massive: ");
  Serial.println((char*)byteMass);
  delay(200);
  Serial.println("String from byte massive: ");
}

void loop() {
  valuePrint = getStringFromByteMass (byteMass, sizeof(byteMass));
  Serial.println(valuePrint); 
  delay(2000);
}

String getStringFromByteMass (byte *buffer, byte bufferSize) {
  String value ;
  for (int i = 0; i < bufferSize; i++) {
    value += (char)buffer[i];
  }
  return value;
}

 

это ооооч сложно

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Если такое сложно, то гоу учиццо, учиццо и еще раз учиццо!

Без знаний в программировании делать нечего.

Morroc
Offline
Зарегистрирован: 24.10.2016

А разделителя никакого нет, сплошняком цифры сыпет ? Как вариант ждать небольшой таймаут в качестве разделителя, а то прием N символов в общем то не гарантирует, что считана метка карты, а не 5 символов с одной карты и 2 со следующей.