Штрих код не вошел в систему SD карта UART

После долгих попыток целый месяц.. глядя как новичок , я не успел зарегистрировать результат сканера штрих-кодов, используя модуль rtc SD и сканер waveshare, подключенный через UART к портам 2 и 3 от arduino.

Основная идея заключалась в том, чтобы иметь возможность войти на SD-карту под заголовком Штрих-код и время, сканируемый штрих-код и время сканирования.

Я знаю, как создавать файлы с текущей датой + int. CSV , последовательно, если он уже был создан, удалил их...и т. Д

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

Это следует за беспорядком-кодом ... недостаточно грязным, у меня есть еще кое-что ...честно..во всяком случае

#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>
#include <string.h>
#include <Wire.h>
#include "RTClib.h"
#define rxPin 2
#define txPin 3
SoftwareSerial mySerial = SoftwareSerial (rxPin, txPin);

RTC_DS1307 RTC;
File myFile; // файл, который будет создан и в котором будут храниться данные

char c = ' ';         // хранит последний символ из последовательного буфера ввода
int length = 30;      // максимальная. длина буфера
char buffer [31];     // массив типа char для хранения theincoming сведения
char termChar = 10;   // завершающий символ
byte index = 0;       // индекс позиции bufffer, где следующий символ придут, должна быть направлена
boolean haveNewData = false; // Flag to tell the sketch we have data
const int chipSelect = 10; //CS pin For SD card.


void setup()  {

  Serial.begin(9600);

  mySerial.begin(9600);

  Wire.begin();       

  if (!RTC.begin()) {
    return;
  }

  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    return;
  }
  myFile = SD.open("test.CSV", FILE_WRITE);
  if (myFile) {
    Serial.print("Writing to file...");
    myFile.println("Hello BarWorld");
    myFile.close();
  }
}


// прямо сейчас я сканирую штрих-код



void loop()
{    
  readmySerial();
  if ( haveNewData ) {  processNewData();  }
}




void readmySerial()
{
     if (mySerial.available())
    {
      c = mySerial.read();
      if (c != termChar)
      {
        buffer[index] = c;
        index = index + 1;
      }
      else
      {
        buffer[index] = '\0';
        index = 0;
        haveNewData = true;
      }
  }
}

 
 
void processNewData()
{
  myFile = SD.open("test.CSV", FILE_WRITE);
  if (myFile) {
  myFile.println(buffer);
  myFile.close();}
  }
   
  

, 👍1

Обсуждение

Почему вы перепостили свой вопрос?, @chrisl

из - за того, что код был неправильным, я забыл добавить правильный voidloop-он появился как функция "readmySerial" в другом посте...и почему-то я не мог переделать все это в одну только одну оду снова...извините... моя вина.., @Maximilian1988

Вам нужно установить haveNewData=false в proccessNewData(), @Sim Son

Вы не задали вопрос и не описали проблему, с которой столкнулись, @Sim Son

уит часть `сканирование штрих-кода в файл " не работает?, @jsotola

@Maximilian1988 Вы знаете, что всегда можете отредактировать свой вопрос, чтобы исправить или добавить к нему информацию? Мой предыдущий комментарий теперь потерян, так как вы удалили этот вопрос. Вы пробовали вставить несколько серийных отпечатков для отладки?, @chrisl

извини за мой поздний ответ. @SimSon спасибо за ваш вклад, это действительно помогает избежать бесконечного и хаотичного цикла. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу зарегистрировать серийный номер штрих-кода, который я сканирую. Я все еще толком не могу ., @Maximilian1988

@chrislI сделал это, и результаты следуют, @Maximilian1988

1. Используя отладку с использованием последовательных отпечатков, я понял, что с помощью "int length" и "char buffer", как показано на рисунке выше, мне пришлось сканировать три раза, чтобы войти в свою SD-карту со штрих-кодом. Проблема в том , что он несколько раз регистрировал штрих-код, а между ними еще и "Hello BarWorld", я не понимаю, почему, учитывая, что это часть настройки..То, что я сделал, помимо того, что включил рекомендацию Симсона, - это изменил "char buffer" и "int length" на 13, я также изменил завершающий символ и значения "C" на " '\0' " ., @Maximilian1988

2. В результате мне нужно только один раз нажать кнопку сканирования, хотя результат все еще сбивает с толку. Серийные шоу "4001653001501 TEST ( " ( цифры соответствуют штрих-коду, TEST-это имя моей SD-карты..) , то, что записано на карточке, - это Hello BarWorld в виде заголовка в первой строке, за которым следует номер штрих-кода во второй строке и "Hello Bar" (9 символов) в третьей строке. Если я удалю из установочной части скетча функцию открытия файла и напишу Hello BarWorld,то результат в серийном варианте будет тот же., @Maximilian1988

3. однако на самом деле в SD-карте регистрируется следующее: в первой строке регистрируется серийный номер штрих - кода (13 символов), а во второй строке первые 9 символов-номера-штрих-кода. Похоже, что если бы была необходимость регистрировать 22 символа, несмотря ни на что. Честно говоря, я совершенно сбит с толку ,почему ведение журнала, когда оно доступно , является частью настройки, когда оно не включено в цикл? Почему 22 символа? Соответствуют ли эти 22 символа общей емкости буфера битовой памяти? Спасибо., @Maximilian1988


1 ответ


0

Я нашел способ:

#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>
#include <string.h>
#include <Wire.h>
#include "RTClib.h"
#define rxPin 2
#define txPin 3
RTC_DS1307 RTC;
SoftwareSerial mySerial = SoftwareSerial (rxPin, txPin);
File main_folder; // инициализируйте папку для сохранения
File dataFile; // инициализация sd-файла
const int chipSelect = 10; // pin CS на SD-карте модуль
int prev_file_indx = 0; // используется для именования файлов
String fileName = "000";
char timestamp[30];


// сколько последовательных данных мы ожидаем перед новой строкой
const unsigned int MAX_INPUT = 50;


void dateTime(uint16_t* date, uint16_t* time) {
  DateTime now = RTC.now();
  sprintf(timestamp, "%02d:%02d:%02d %2d/%2d/%2d \n", now.hour(), now.minute(), now.second(), now.month(), now.day(), now.year() - 2000);
  // дата возврата с помощью макроса FAT_DATE для форматирования полей
  *date = FAT_DATE(now.year(), now.month(), now.day());

  // время возврата с помощью макроса FAT_TIME для форматирования полей
  *time = FAT_TIME(now.hour(), now.minute(), now.second());
}


void setup ()
{
  Serial.begin (115200);
  mySerial.begin (115200);
  Wire.begin();       
  if (!RTC.begin()) {
    return;
  }

  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
      return;
    }
    
    main_folder = SD.open("/");
    fileName = sd_saver(main_folder);
 // end of setup
    delay(1500);
    dataFile = SD.open("DATA"+fileName+".csv",FILE_WRITE);
  if (dataFile) {
    Serial.println(dataFile);
    Serial.println("Writing Headers...");
    dataFile.println("FA,  Zeit");
    dataFile.close(); // close the file
    Serial.println("File closed, Headers written");
  }
 }

void process_data (const char * data)
// here to process incoming serial data after a terminator received
{ delay(500);
    SdFile::dateTimeCallback(dateTime);  
  DateTime now = RTC.now();
  sprintf(timestamp, "%02d:%02d:%02d %2d/%2d/%2d \n", now.hour(), now.minute(), now.second(), now.month(), now.day(), now.year() - 2000);
     dataFile = SD.open("DATA"+fileName+".csv",FILE_WRITE);
  if (dataFile) {
    Serial.println("Writing to file...");
    dataFile.print (data);
    dataFile.print(",");
    dataFile.println (timestamp);
    Serial.println (data);
    Serial.println (timestamp);
    Serial.println("Done.");
    dataFile.close();
  } else {
    Serial.println("error opening test.txt");
    delay(1000);
  }

}



void processIncomingByte (const byte inByte)
{
  static char input_line [MAX_INPUT];
  static unsigned int input_pos = 0;

  switch (inByte)
  {

    case '\n':   // end of text
      input_line [input_pos] = 0;  // завершающий байт null

      // терминатор добрался! введите строку процесса здесь ...
      process_data (input_line);

      // сброс буфера для следующего раза
      input_pos = 0;
      break;

    case '\r':   // возврат каретки с отказом
      break;

    default:
      // продолжайте добавлять, если не заполнено ... разрешите завершить нулевой байт
      if (input_pos < (MAX_INPUT - 1))
        input_line [input_pos++] = inByte;
      break;

  }  // end of switch

} // end of processIncomingByte

void loop() {
  delay(2000);


  // если доступны последовательные данные, обрабатывайте их
  while (mySerial.available () > 0)
  processIncomingByte (mySerial.read ());
  mySerial.write(processIncomingByte);
  delay(1000);

  // сделайте здесь и другие вещи, такие как тестирование цифрового ввода (нажатие кнопок) ...

}  // end of loop



String sd_saver(File dir){
  while(true){
    // повторите все файлы, чтобы убедиться, что они не перезаписываются
    File entry = dir.openNextFile();
    if (!entry){
      break;
    }
    // процедура именования
    String entry_name = entry.name();
    if ((entry_name.substring(4,7)).toInt()>=prev_file_indx){
      prev_file_indx = (entry_name.substring(4,7)).toInt()+1;
      if (prev_file_indx>=100){
        fileName = String(prev_file_indx);
      } else if (prev_file_indx>=10){
        fileName = "0"+String(prev_file_indx);
      } else{
        fileName = "00"+String(prev_file_indx);
      }
    }
    entry.close();
  }
  return fileName;
}
,