А по языкам понять все равно не смогу. Я же айдетик. Не могу на себя проблему примерить.
Ладно, погорячился, австрийский знаю.))) Но после 0,8-1,0л. О чем говорили не помню, но ведь общались же, если полночи кабаки меняли и не потерялись.))))
Здравствуйте. Снова принялся за затею которая не дает мне покоя. По вашей рекомендации изменил код. В итоге вот что получил
#include <SoftwareSerial.h>
// Подключаем сам ридер
SoftwareSerial RfidReader(8, 9);
int data1 = 0;
bool ok = false;
bool reads = false;
// активируемый порт при считывании валидной карты
int yes = 6;
// активируемый порт при считывании карты не из списка
int no = 7;
// Массив с номерами карт. Для увеличения валидных карт просто добавьте еще один массив внутрь
const PROGMEM char tags[][14] = {
{2, 50, 49, 48, 48, 52, 66, 68, 53, 70, 56, 52, 55, 3 }
};
int newtag[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void setup(){
RfidReader.begin(9600);
Serial.begin(9600);
pinMode(yes, OUTPUT);
pinMode(no, OUTPUT);
}
// данная функция сравнивает по очереди все 14 символов
// массива из базового массива, и только что считанного массива
uint8_t compare(int str1[], int str2[])
{
for(int i = 1; i < 14; i++)
{
if(str1[i] != str2[i]) return 0;
}
return 1;
}
void loop(){
reads = ok = false;
int tag;
// если карта поднесена
if (RfidReader.available() > 0) {
delay(100);
// создаем массив с данными поднесенной карты
for (int x = 0 ; x < 14 ; x++){
data1 = RfidReader.read();
newtag[x] = data1;
//вывод в монитор порта организовал для проверки того что считали
Serial.println(newtag[x]);
}
//пока еще какая-то карта доступна
while (RfidReader.available())
// все непустые байты считываем вникуда (всё что надо, считали выше))))
while (RfidReader.read() > 0) {};
reads = true;
// по очереди сравниваем данные карты с валидным массивом
for(int i = 0; i < sizeof(tags) ; i++){
tag = pgm_read_byte(&(tags[0][i]));
//здесь вывод в монитор порта того что взяли из PROGMEM
Serial.println(tag);
if (compare(newtag, tag) == true){
ok = true;
break;
}
}
}
// если произошло считывание
if(reads){
// если карта есть в списке валидных
if (ok){
digitalWrite(yes, HIGH);
delay(2000);
digitalWrite(yes, LOW);
}
// если карт нету в списке валидных
else {
digitalWrite(no, HIGH);
delay(2000);
digitalWrite(no, LOW);
}
ok = false;
}
}
При компиляции которого выдаются ошибки:
Documents\Arduino\sketch_6300_input2\sketch_6300_input2.ino:66:27: warning: invalid conversion from 'int' to 'int*' [-fpermissive]
if (compare(newtag, tag) == true){
Documents\Arduino\sketch_6300_input2\sketch_6300_input2.ino:30:9: note: initializing argument 2 of 'uint8_t compare(int*, int*)'
uint8_t compare(int str1[], int str2[])
Всю голову сломал как их исправить.
Вроде бы компиляция проходит с ошибками но в мониторе порта выдаются верные значения считываемой метки и метки из памяти. Но при сравнении этих значений, по всей видимости, начинаются проблемы. Не пойму как так ?
Ваша функция compare ожидает два параметра - оба массивы. А Вы в строке 64 передаёте ей первым параметром маасив, а вторым tag - просто число.
Будьте аккуратнее при вставке кода и сообщений. Сообщение, что Вы привели - не от этого кода. В сообщении ругается на строку 66, а реально она в коде - 64. Вставляйтё всё как есть, со всеми пустыми строками.
#include <SoftwareSerial.h>
// Подключаем сам ридер
SoftwareSerial RfidReader(8, 9);
int data1 = 0;
bool ok = false;
bool reads = false;
// активируемый порт при считывании валидной карты
int yes = 6;
// активируемый порт при считывании карты не из списка
int no = 7;
// Массив с номерами карт. Для увеличения валидных карт просто добавьте еще один массив внутрь
const PROGMEM char tags[][14] = {
{2, 50, 49, 48, 48, 52, 66, 68, 53, 70, 56, 52, 55, 3 }
};
int newtag[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int tags1[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void setup(){
RfidReader.begin(9600);
Serial.begin(9600);
pinMode(yes, OUTPUT);
pinMode(no, OUTPUT);
}
// данная функция сравнивает по очереди все 14 символов
// массива из базового массива, и только что считанного массива
uint8_t compare(int str1[], int str2[])
{
for(int i = 1; i < 14; i++)
{
if(str1[i] != str2[i]) return 0;
}
return 1;
}
void loop(){
reads = ok = false;
int tag;
// если карта поднесена
if (RfidReader.available() > 0) {
delay(100);
// создаем массив с данными поднесенной карты
for (int x = 0 ; x < 14 ; x++){
data1 = RfidReader.read();
newtag[x] = data1;
//вывод в монитор порта организовал для проверки того что считали
Serial.println(newtag[x]);
}
//пока еще какая-то карта доступна
while (RfidReader.available())
// все непустые байты считываем вникуда (всё что надо, считали выше))))
while (RfidReader.read() > 0) {};
reads = true;
// по очереди сравниваем данные карты с валидным массивом
for(int i = 0; i < sizeof(tags) ; i++){
tag = pgm_read_byte(&(tags[0][i]));
tags1[i] = tag;
//здесь вывод в монитор порта того что взяли из PROGMEM
Serial.println(tags1[i]);
if (compare(newtag, tags1) == true){
ok = true;
break;
}
}
}
// если произошло считывание
if(reads){
// если карта есть в списке валидных
if (ok){
digitalWrite(yes, HIGH);
delay(2000);
digitalWrite(yes, LOW);
}
// если карт нету в списке валидных
else {
digitalWrite(no, HIGH);
delay(2000);
digitalWrite(no, LOW);
}
ok = false;
}
}
я - балбес) когда написал это сообщение меня вдруг осенило что я сравниваю массив с кучей значений переменной tag . всё сейчас поправил. буду теперь пробовать как поведет себя проверка в полноценном массиве меток.
вот так бывает - бьешься весь день на фигней какой-то, потом плюешь и решаешь на форуме спросить и как только кидаешь сообщение - до тебя доходит где косяк)
ЕвгенийП пишет:
Ваша функция compare ожидает два параметра - оба массивы. А Вы в строке 64 передаёте ей первым параметром маасив, а вторым tag - просто число.
Будьте аккуратнее при вставке кода и сообщений. Сообщение, что Вы привели - не от этого кода. В сообщении ругается на строку 66, а реально она в коде - 64. Вставляйтё всё как есть, со всеми пустыми строками.
очередной затык, но теперь уже из-за незнания...или я просто перестарался сегодня)
суть проблемы в том что после добавления меток должна проводиться проверка по всему массиву меток из progmem
для этого устанавливаем счетчик с переменной k
теперь при установке k = 0 программа запускает следующий цикл где проверяет все данные по счетчику i . вот тут и проблема - при несовпадении данных повторяется внутренний цикл и не увеличивается k
каким-то образом необходимо выйти из внутреннего цикла во внешний и увеличить k
какие могут быть варианты решения проблемы ?
#include <SoftwareSerial.h>
// Подключаем сам ридер
SoftwareSerial RfidReader(8, 9);
int data1 = 0;
bool ok = false;
bool reads = false;
// активируемый порт при считывании валидной карты
int yes = 6;
// активируемый порт при считывании карты не из списка
int no = 7;
// Массив с номерами карт. Для увеличения валидных карт просто добавьте еще один массив внутрь
const PROGMEM char tags[][14] = {
{2, 50, 49, 48, 48, 52, 66, 68, 53, 70, 56, 52, 55, 2 },
{2, 50, 49, 48, 48, 52, 66, 68, 53, 70, 56, 52, 55, 3 }
};
int newtag[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int tags1[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void setup(){
RfidReader.begin(9600);
Serial.begin(9600);
pinMode(yes, OUTPUT);
pinMode(no, OUTPUT);
}
// данная функция сравнивает по очереди все 14 символов
// массива из базового массива, и только что считанного массива
uint8_t compare(int str1[], int str2[])
{
for(int i = 1; i < 14; i++)
{
if(str1[i] != str2[i]) return 0;
}
return 1;
}
void loop(){
reads = ok = false;
int tag;
// если карта поднесена
if (RfidReader.available() > 0) {
delay(100);
// создаем массив с данными поднесенной карты
for (int x = 0 ; x < 14 ; x++){
data1 = RfidReader.read();
newtag[x] = data1;
//вывод в монитор порта организовал для проверки того что считали
Serial.println(newtag[x]);
}
//пока еще какая-то карта доступна
while (RfidReader.available())
// все непустые байты считываем вникуда (всё что надо, считали выше))))
while (RfidReader.read() > 0) {};
reads = true;
// по очереди сравниваем данные карты с валидным массивом
for(int k = 0; k < 3 ; k++){
for(int i = 0; i < sizeof(tags) ; i++){
tag = pgm_read_byte(&(tags[k][i]));
tags1[i] = tag;
//здесь вывод в монитор порта того что взяли из PROGMEM
Serial.println(tags1[i]);
if (compare(newtag, tags1) == true){
ok = true;
break;
}
}
}
}
// если произошло считывание
if(reads){
// если карта есть в списке валидных
if (ok){
digitalWrite(yes, HIGH);
delay(2000);
digitalWrite(yes, LOW);
}
// если карт нету в списке валидных
else {
digitalWrite(no, HIGH);
delay(2000);
digitalWrite(no, LOW);
}
ok = false;
}
}
Сорри. Я не злой. Я вредный. А по языкам понять все равно не смогу. Я же айдетик. Не могу на себя проблему примерить.
2All: кстати, а что там у придурка за вопрос был?
Так никто и не понял. В первую очередь он сам. Какие-то int64_t, прогмемы, строки, запятые. Хрен его разберёт :)
Ладно, погорячился, австрийский знаю.))) Но после 0,8-1,0л. О чем говорили не помню, но ведь общались же, если полночи кабаки меняли и не потерялись.))))
Здравствуйте. Снова принялся за затею которая не дает мне покоя. По вашей рекомендации изменил код. В итоге вот что получил
При компиляции которого выдаются ошибки:
Ваша функция compare ожидает два параметра - оба массивы. А Вы в строке 64 передаёте ей первым параметром маасив, а вторым tag - просто число.
Будьте аккуратнее при вставке кода и сообщений. Сообщение, что Вы привели - не от этого кода. В сообщении ругается на строку 66, а реально она в коде - 64. Вставляйтё всё как есть, со всеми пустыми строками.
я - балбес) когда написал это сообщение меня вдруг осенило что я сравниваю массив с кучей значений переменной tag . всё сейчас поправил. буду теперь пробовать как поведет себя проверка в полноценном массиве меток.
вот так бывает - бьешься весь день на фигней какой-то, потом плюешь и решаешь на форуме спросить и как только кидаешь сообщение - до тебя доходит где косяк)
Ваша функция compare ожидает два параметра - оба массивы. А Вы в строке 64 передаёте ей первым параметром маасив, а вторым tag - просто число.
Будьте аккуратнее при вставке кода и сообщений. Сообщение, что Вы привели - не от этого кода. В сообщении ругается на строку 66, а реально она в коде - 64. Вставляйтё всё как есть, со всеми пустыми строками.
очередной затык, но теперь уже из-за незнания...или я просто перестарался сегодня)
суть проблемы в том что после добавления меток должна проводиться проверка по всему массиву меток из progmem
для этого устанавливаем счетчик с переменной k
теперь при установке k = 0 программа запускает следующий цикл где проверяет все данные по счетчику i . вот тут и проблема - при несовпадении данных повторяется внутренний цикл и не увеличивается k
каким-то образом необходимо выйти из внутреннего цикла во внешний и увеличить k
какие могут быть варианты решения проблемы ?