rfid to serial to socket to rasp(python)
- Войдите на сайт для отправки комментариев
Втр, 20/08/2019 - 14:27
Привет, Помогите пожалста. Есть скрипт который собирает данные 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
}
}
Причем, если сделать такой вид:
void loop() { client.write("fkgfgk dfsfskdf"); }Передается строка как надо!
resetFunc(); //вызываем reset
зачем ?
resetFunc(); //вызываем reset
зачем ?
Ведь вопрос не в этом......
Сначала соберите весь ID в строку/число, а потом только посылайте его.
Разве не очевидно, по какой причине на стороне raspberry получаете только один символ?
Дак ты первый символ метки и отправляешь. Один. А потом, ХРЯСЬ!!!, и Reset.
Ахха-ха))) Я вообще нуб в программировании но тоже это заметил. Смутили «умные слова про передачу данных» (не дорос я ещё до этого). И ресет вообще убил. Зачем ресет? Это где то описано в документации? (Интересно узнать)
Интересно узнать
а то )))
Да дело не в 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"?
Да ты идиот штоли? Так
client.write("врврвраврвра");ты сразу всю строку передаешь, а такclient.write(ser);только один (первый) считанный символ, потом отправляешь контроллер в перезагрузку, все буферы очищаются, больше ничего не передаеца.тебе надо сначала собрать ВСЮ переданную СТРОКУ, а не один символ char, коим является ser, и передать уже ВСЮ СТРОКУ. Херли тут непонятного?
Канешна, ватьмашу, дело не в резет, а в (сам придумай)
Не зли меня...
Убрал перезагрузку, эффект тот же 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); } }Если переменную делаю тип String то на client.write() выходит ошибка:
no matching function for call to 'EthernetClient::write(String&)'
Бросьте, это дело не ваше.
Если переменную делаю тип String то на client.write() выходит ошибка:
no matching function for call to 'EthernetClient::write(String&)'
мошт, так надо:
String YourVar;
.
.
.
client.write(YourVar.c_str());
Бросьте, это дело не ваше.
+100500
Убрал перезагрузку, эффект тот же 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 в конце ? вы там с бубном вокруг кода пляшите что ли ? ) как поймете каждую строчку (и нужна ли она) - может быть заработает
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); // давай тут посмотрим что мы наотправляли и сравним с малиной } }поставлю-ка я вопрос по-другому, сколько символов может влесть в переменную char ser;?
}
А если еще не все прислали по Serial ?
эммм 1 алфавитно-цифровой
Тогда ждать..... других инструкций ж нет
То есть надо из алфавитно-цифрового кода метки сделать только цифровой код и его норм передать в INT?
в int такая же ерунда, т.е. надо передать как-то массив?
а если строку разбить посимвольно, и потом собрать на другом конце?
а если строку разбить посимвольно, и потом собрать на другом конце?
её надо сначала собрать из символов, которые ты читаешь как Serial.read(). Ты описание на нее читал? Сколько символов она аддаёт за 1 вызов?
shiyri - сколько символов у тебя в RFID? - 10 ? 16? - а ты принимаешь только один!
решение задачи - читать Сериал в цикле, дожидаясь, пока придут все символы, потом собрать в одну строку - и только после этого передавать.
Но только по твоим вопросам я вижу, что ты абсолютно деревянный (без обид). Тебе надо сесть и прочитать какую-то книжку по программированию, прорешать примеры - и только потом вернутся к этой задачке. А с нынесними твоими "знаниями" у тебя нет ни малейшего шанса решить задачу.
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); }вот так зависает в порт валиться абра-кадабра бесконечно.
что это вообще? Как первое "считывает", если это оператор print?
Во втором случае зачем сначала снова первый вариант?
Вы чего вообще добиться-то хотите? вроде в предпоследнем сообщении я вам четко обьяснил. что надо делать. Это ваше решение не имеет ничего общего с моими рекомендациями... или вы уже совсем о другом?
Правильно заданный вопрос - 80% ответа. Жалко, что правильно задать вопрос далеко не с первого раза получается. Или не получается вообще.
Вывод - это фигня, было бы чего выводить, а вот как вы buffer заполняете ?
оказалось просто:))))
void printDec(byte *buffer, byte bufferSize) { String value ; for (int i = 0; i < 4; ++i) { value +=buffer[i] ; } Serial.println(value);оказалось просто:))))
void printDec(byte *buffer, byte bufferSize) { String value ; for (int i = 0; i < 4; ++i) { value +=buffer[i] ; } Serial.println(value);Ну попробуй buffer из 7ми символов обработать...
охх...
оказалось просто:))))
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
Так проканало с 7ю то или нет?
Так проканало с 7ю то или нет?
Я тебя не понимаю!
У меня на метках только такой код, как я его увеличу?
Да ну нафиг. Я же о последнем куске кода говорю. И конкретно про переменную buffer.
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
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 изначально.....
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? Откуда это все вообще?
no matching function for call to 'TwoWire::write(String&)'
у меня же переменная value в String изначально.....
На это уже дед отвечал в ЭТОЙ ЖЕ теме...
Пользуйся:
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; }Почитай хотя бы эту книгу.
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()); }посыл по книге понял, поизучаю, вот так сделал, но отправляет по одному символу......
Нееее.... Сначала упорно изучать книгу, а потом делать. Ты же просто обрывки кода вставляешь куда попало даже не думая.
Причем я тебе готовую функцию дал, но ты ее даже не смотрел (или не понял что это вообще такое).
Пользуйся:
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; }это ооооч сложно
Если такое сложно, то гоу учиццо, учиццо и еще раз учиццо!
Без знаний в программировании делать нечего.
А разделителя никакого нет, сплошняком цифры сыпет ? Как вариант ждать небольшой таймаут в качестве разделителя, а то прием N символов в общем то не гарантирует, что считана метка карты, а не 5 символов с одной карты и 2 со следующей.