У меня есть такое определение функции в библиотеке Arduino:
bool RHReliableDatagram::sendtoWait(uint8_t * buf, uint8_t len, uint8_t address)
Когда я использую:
uint8_t timePacket[] = "time\n";
sendtoWait(timePacket, sizeof(timePacket), SERVER_ADDRESS)
Я получаю очень хорошую строку со словом "time" на другом конце (SERVER_ADDRESS) в функции readline () pyserial, которая прекрасно декодируется с использованием кодировки utf-8.
Теперь мне нужно отправить несколько байтов, используя ту же функцию sendtoWait()
. Сначала я определяю массив символов из 60 байтов
char packetBuff[60] = "";
Затем я беру каждый байт и использую его как символ.
char value = (char)flash.readByte(dumpCounter++);
Затем поместите каждое значение в массив char следующим образом:
packetBuff[charNo] = value;
После нахождения символа новой строки я снова пытаюсь отправить массив символов с помощью функции sendtoWait()
:
if (value == '\n') {
Serial.println(packetBuff);
uint8_t buff[charNo];
for (int i = 0; i < charNo; i++) {
buff[i] = packetBuff[i];
}
sendtoWait(buff, charNo, SERVER_ADDRESS))
charNo++;
Но хотя Serial.println(packetBuff)
показывает правильные символы, например что-то вроде "1559105487 \ n" (метка времени Unix), массив buff
просто не работает правильно и показывает случайные символы, такие как точка с запятой, случайные однозначные числа и т. д.
Как правильно привести массив символов и отправить его правильно, используя функцию sendtoWait()
, как было отправлено «time \ n»?
EDIT:
Полный код:
int charNo = 0;
char packetBuff[60] = "";
if (dumpCounter != 0) {
dumpCounter--;
}
while(dumpCounter < currentFlashLoc) {
char value = (char)flash.readByte(dumpCounter++);
packetBuff[charNo] = value;
if (value == '\n') {
Serial.println(packetBuff);
uint8_t buff[charNo];
for (int i = 0; i < charNo; i++) {
buff[i] = packetBuff[i];
}
if (manager.sendtoWait(buff, charNo, SERVER_ADDRESS)) {
// packet sent successfully
}
charNo = -1;
}
charNo++;
}