Я пытаюсь написать код Android Uno для отправки шестнадцатеричных значений через SoftwareSerial, но при просмотре Serial Monitor вывод не такой, как я ожидал или хотел, и у меня еще недостаточно опыта, чтобы знать, что делать дальше.
Я не знаю, откуда берутся FFFF, чтобы иметь возможность их устранить.
Мой желаемый результат:
<br>
AA130120<br>
AA0400AE
Что я получаю:
<br>
FFFFFFFFAA1311E<br>
FFFFFFAA20
Мой код:
#include <SoftwareSerial.h>
// Define the RX and TX pins to establish UART communication with the MP3 Player Module.
#define Pin_RX 0 // to RX
#define Pin_TX 1 // to TX
#define d_sleep 10000
// Define the required MP3 Player Commands:
static byte ccPlay[] = {0xAA, 0x02, 0x00, 0xAC}; // Play:
static byte ccSetVol[] = {0xAA, 0x13, 0x01, 0x20}; // Set Volume (00-30):
// Define the Serial MP3 Player Module.
SoftwareSerial MP3(Pin_RX, Pin_TX);
void setup() {
// Initiate the serial monitor.
Serial.begin(9600);
}
void loop() { // Play a song.
ccSetVol[3] = {0x1E};
send_command_to_MP3_player(ccSetVol, 4);
delay(d_sleep);
send_command_to_MP3_player(ccPlay, 4);
delay(d_sleep);
}
void send_command_to_MP3_player(int8_t command[], int len){
//Serial.print("\nMP3 Command => ");
for (int i=0; i<len; i++) {
MP3.write(command[i]);
Serial.print(command[i], HEX);
}
delay(100);
}
Не могли бы вы установить скорость передачи в последовательном мониторе на 9600 бод, запустить этот код и посмотреть, выдает ли он ожидаемые байты в последовательном мониторе?
#define d_sleep 10000
static byte ccPlay[] = {0xAA, 0x02, 0x00, 0xAC};
static byte ccSetVol[] = {0xAA, 0x13, 0x01, 0x20};
void send_command_to_MP3_player(byte command[], int len) {
for (int i=0; i<len; i++) {
//Serial.println(command[i], HEX);
Serial.print(command[i], HEX);
}
//Serial.println();
delay(100);
}
void setup() {
Serial.begin(9600);
delay(1500);
}
void loop() {
ccSetVol[3] = 0x1E;
send_command_to_MP3_player(ccSetVol, 4);
delay(d_sleep);
send_command_to_MP3_player(ccPlay, 4);
delay(d_sleep);
}
Похоже, выводит одно и то же.
АА 13 1 1Е АА 2 0 АС
Позвольте мне объяснить, пожалуйста. Эти шестнадцатеричные значения отображаются в Serial Monitor вертикально, но когда я пытаюсь отправить вам то, что вижу, эта утилита упорядочивает их по горизонтали с пробелом.
Я не хочу CR/LF, но мне нужны ведущие нули, пожалуйста.
Я отредактирую код. Я не могу дать вам ведущие нули, но это не имеет значения для отправки на MP3-плеер; правильные байты будут отправлены, если вы добавите код MP3-плеера обратно, они просто будут отображаться без начальных нулей в последовательном мониторе.
Есть ли преимущество в использовании Softwareserial lib и отправке TX / RX на разные контакты или нет и использовании распознанных контактов 0 и 1 на UNIO?
Не знаю, я никогда не использую SoftwareSerial. Вы можете спросить на Arduino.
Пожалуйста. Не забудьте вернуть содержимое SoftwareSerial и файлы MP3.write(command[i]); и т. д.; Я удалил некоторые вещи, чтобы изолировать проблему.
Было предложено добавить строку в мой код, поэтому, когда шестнадцатеричный символ меньше 16, в serial.print("0");. Это заставляет Serial Monitor выглядеть хорошо, но это не дает положительных результатов при общении с MP3 Player.
Нет, просто выглядит лучше. MP3-плеер просто получает байт, и ему все равно, выглядит ли этот байт для вас как 0 или 00; отправленный байт просто 0.
Это не компилируется для меня; void send_command_to_MP3_player(int8_t command[], int len) должен быть void send_command_to_MP3_player(byte command[], int len) или void send_command_to_MP3_player(uint8_t command[], int len)