Отправка шестнадцатеричных данных последовательно и получение их обратно
Ниже приведен мой код. Я хочу отправить шестнадцатеричные данные последовательно на какое-нибудь устройство и также ожидать ответа. Я хочу видеть ответ в шестнадцатеричной форме на последовательном мониторе. Любой комментарий будет оценен по достоинству. Спасибо.
const byte numChars = 88;
word receivedChars[numChars]; // массив для хранения полученных данных
boolean newData = false;
void setup() {
Serial.begin(9600);
Serial.println("<Arduino is ready>");
}
void loop() {
uint8_t message[] = {0xA5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x0d };
Serial.write(message, sizeof(message));
delay(500);
}
void recvWithEndMarker() {
static byte ndx = 0;
char endMarker = '\n';
word rc;
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
} else {
receivedChars[ndx] = '\0'; // завершает строку
ndx = 0;
newData = true;
}
}
}
void showNewData() {
if (newData == true) {
Serial.print("data ");
Serial.println(receivedChars);
newData = false;
}
}
Ошибка, которую я получаю, заключается в том, что вызов перегруженного println(word [88])
неоднозначен. Спасибо вам за помощь.
@Ali khan, 👍0
Обсуждение1 ответ
Вот ваш исправленный код: если вы хотите отправлять числа, закодированные в виде шестнадцатеричных строк, это именно то, что вам нужно сделать с обоих концов.
Стандартная функция itoa()
преобразует числа в их строковое представление, но, работая таким образом, вы тратите много ресурсов, потому что для отправки числа 1
(что может быть выполнено путем отправки ровно одного байта) вы отправляете строку 0x01
(для передачи которой теперь требуется 4 байта).
const byte numChars = 88;
word receivedChars[numChars]; // массив для хранения полученных данных
boolean newData = false;
void setup() {
Serial.begin(9600);
Serial.println("<Arduino is ready>");
}
void loop() {
uint8_t message[] = {0xA5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x0d };
char buf[4];
for (uint8_t i = 0; i < sizeof(message); i++) {
itoa(message[i], buf, 16));
Serial.write(buf, sizeof(buf));
}
delay(500);
recvWithEndMarker();
showNewData();
}
#define END_MARKER '\n'
void recvWithEndMarker() {
static byte ndx = 0;
char rc;
while (Serial.available() > 0 && !newData) {
rc = Serial.read();
if (rc != END_MARKER) {
receivedChars[ndx++] = rc;
if (ndx >= numChars) {
ndx = numChars - 1;
}
} else {
receivedChars[ndx] = '\0'; // завершение строки
ndx = 0;
newData = true;
}
}
}
void showNewData() {
if (newData) {
Serial.print("data ");
for (unsigned int i = 0; i < numChars; i++) {
Serial.print(receivedChars[i], HEX);
}
Serial.println();
newData = false;
}
}
Спасибо всем вам, ребята, Роберто, код, который вы исправили, показывает ? вместо 0x... каждого байта есть какое-либо решение для этого., @Ali khan
Это только часть " 0x`? Все ли остальные части обмена данными верны?, @Roberto Lo Giacco
только часть 0x, и у меня также есть еще одна проблема: когда я перемещаю регулятор громкости, я не получаю никаких данных последовательно, пока они не достигнут примерно 95 процентов после дальнейшего перемещения, я получаю данные. Я хочу получать данные при каждом движении позиции, @Ali khan
О каком _волюмном узле_ вы говорите?!?, @Roberto Lo Giacco
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Метод перебора битов в байте, отправленном по последовательному каналу.
- Считывание серийного номера с заголовком и конечным маркером
- Arduino Uno по-прежнему загружается и работает, но нет последовательной связи через USB
- Отправка строки с Arduino на ESP8266 работает на UNO, но не на Pro Mini
- Повреждение данных SoftwareSerial - поиск предложений
- Быстрая регистрация данных
Класс print не знает, как напечатать массив из 88 байт. Вам нужно напечатать каждый байт по отдельности по очереди в форме, которую вы можете понять (является ли ответ ASCII? Если нет, то вам нужно будет отобразить его в виде чисел в той или иной форме)., @Majenko
данные передаются не в шестнадцатеричном формате, а в байтах. ... hex предназначен только для человеческой читабельности байтов. ....
0xA5
и165
- это совершенно одно и то же, @jsotolaЗамените "слово" → "символ"., @Edgar Bonet
while (Serial.available() > 0 && newData == false)
иSerial.begin(9600);
вы всегда получали один байт (восьмибитная временная задержка обязательна)!, @dsgdfg