Добрый день уважаемые знатоки, по воле случая столкнулся с ардуино. Моя задача - Написать скетч для uno, на вход которого поступает строка через rs232 (И через MAX232), после чего она преобразуется (специальная кодировка/команда) и отправляется на промышленный принтер.
Все сделал, но когда на вход поступает кириллица, вылезают непонятные, битые символы, которые не получается преобразовать. Может ли кто помочь с этим? Сразу говорю, с ардуино не сталкивался до этого, так что могу не понимать элементарные вещи, заранее прошу прощения.
Вот Мой код:
#include <Arduino.h>
#include <SoftwareSerial.h>
// Настройка пинов для программного последовательного порта (для связи с принтером)
const int printerRxPin = 8; // Пин для приема данных от принтера
const int printerTxPin = 9; // Пин для передачи данных на принтер
const int printerRxPin2 = 10; // Пин для приема данных от Компьютера
const int printerTxPin2 = 11; // Пин для передачи данных на Компьютер
// Создание объекта SoftwareSerial для связи с принтером
SoftwareSerial printerSerial(printerRxPin, printerTxPin);
SoftwareSerial MySerial(printerRxPin2, printerTxPin2);
// Структура для хранения команды принтера
struct PrinterCommand {
String functionCode;
String data;
};
// Функция для преобразования символа в шестнадцатеричную строку
String charToHex(char value) {
char buffer[5];
sprintf(buffer, "00%02X", value);
return String(buffer);
}
String strToHex(const String &text) {
String result = "";
for (size_t i = 0; i < text.length(); ++i) {
result += charToHex(text[i]);
}
return result;
}
// Функция для создания структуры команды принтера
PrinterCommand printerCommandStructure(const String &code) {
PrinterCommand command = {code, ""};
return command;
}
String printerPrepareCommandForTransfer(PrinterCommand &command) {
String result = "";
// Добавляем код функции
result += command.functionCode;
result+="00";
// Добавляем длину данных в шестнадцатеричном формате
int length = command.data.length();
result += wordToHex(length);
result += command.data;
// Вычисляем контрольную сумму
uint16_t checksum = 0;
for (size_t i = 0; i < result.length(); ++i) {
checksum += result[i];
}
checksum %= 65536;
checksum = (checksum ^ 0xFFFF) + 1;
// Добавляем контрольную сумму
result += wordToHex(checksum);
// Добавляем символы начала и конца
char SOI = 0x7E;
char EOI = 0x0D;
result = String(SOI) + result + String(EOI);
return result;
}
// Функция для преобразования слова в шестнадцатеричную строку
String wordToHex(uint16_t value) {
char buffer[5];
sprintf(buffer, "%04X", value);
return String(buffer);
}
String printerSetDataForPrinting(const String data[], size_t dataSize) {
PrinterCommand command = printerCommandStructure("02");
command.data = "";
for (size_t index = 0; index < dataSize; ++index) {
String hexString = strToHex("X" + String(index) + data[index]);
command.data += hexString+"001F";
}
return printerPrepareCommandForTransfer(command);
}
void setup() {
// Настройка программного последовательного порта для связи с принтером
printerSerial.begin(9600);
Serial.begin(9600);
MySerial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
// Чтение строки с входа
String input = Serial.readString();
input.trim(); // Удаление пробельных символов с начала и конца строки
Serial.println(input);
// Создание массива данных из входной строки
String data[] = {input}; // Ваши данные
// Отправка данных в функцию для подготовки команды
String command = printerSetDataForPrinting(data, 1);
// Вывод команды на отправку
Serial.print("Результат обработки: ");
Serial.println(command);
// Отправка команды на принтер
printerSerial.println(command);
Serial.println("Отправлено");
}
if (printerSerial.available() > 0) {
// Чтение строки с входа
String input = printerSerial.readString();
Serial.println(input);
}
if (MySerial.available() > 0) {
// Чтение строки с входа
String input = MySerial.readString();
input.trim(); // Удаление пробельных символов с начала и конца строки
Serial.println(input);
// Создание массива данных из входной строки
String data[] = {input}; // Ваши данные
// Отправка данных в функцию для подготовки команды
String command = printerSetDataForPrinting(data, 1);
// Вывод команды на отправку
Serial.print("Final Command: ");
Serial.println(command);
// Отправка команды на принтер
printerSerial.println(command);
Serial.println("Отправлено");
}
}
