Штрих код не вошел в систему 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();}
}
@Maximilian1988, 👍1
Обсуждение1 ответ
Я нашел способ:
#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;
}
- Лучшая практика буферизации для непрерывной записи на SD-карту
- SIM800L не отвечает на AT-команды
- HLW8032 UART отправляет случайные данные (регистры часто переполняются)
- Проблема последовательной связи с общей землей SIM800L
- Быстрая регистрация данных
- Как читать и анализировать данные UART с радарного датчика присутствия человека
- Как выбрать использование библиотеки softserial в проекте Arduino?
- Связь UART - серийный номер всегда пуст
Почему вы перепостили свой вопрос?, @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