Отправка массива размером >255 байт на arduino
Я пытаюсь отправить растровый массив байтов размером 50x50 из моего клиента Python в Arduino, где он должен отображаться на экране.
Мне нужно получить 350 байт, чтобы получить данные для отображения битовой карты, но как только я инициализирую массив с > 255 элементами, он начинает делать странные вещи (полагаю, из-за памяти):
При инициализации массива размером 254 происходит ожидаемое:
Передача 350 завершена за 2.805466с (arduino) Получено: 253 элементы
с размером 350 я получаю только
«Получено: 93 элемента»
Как мне разделить полученные байты с доступной памятью, а затем построить битовую карту соответствующим образом или как лучше это сделать? Я бы хотел, чтобы они передавались через последовательный порт, а не создавался qrco de в arduino (так как я не смог заставить необходимые библиотеки работать в моей настройке).
Мой клиент Python делает в основном следующее:
for element in qrCodeBytes:
countElementsSent+=1
ser.write(element)
print("Sending " + str(element))
ser.write("$".encode()) #stop char
Мой код Arduino основан на популярном руководстве по основам последовательного ввода https://forum.arduino.cc/index.php?topic=288234.0
const byte numChars = 254;
byte receivedChars[numChars]; // массив для хранения полученных данных
boolean newData = false;
void setup() {
Serial.begin(114000);
Serial.setTimeout(10000);
Serial.println("<Arduino is ready>");
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // инициализируем с адресом I2C 0x3D (для 128x64)
display.clearDisplay();
display.display();
}
void loop() {
recvWithEndMarker();
showNewData();
}
void recvWithEndMarker() {
static byte ndx = 0;
char endMarker = '$';
char rc;
// если (Serial.available() > 0) {
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] = '$'; // завершить строку
Serial.println("Received: " + String(ndx) + " elements");
ndx = 0;
newData = true;
}
}
}
void showNewData() {
if (newData == true) {
Serial.println("This just in ... ");
display.clearDisplay();
drawBitMap(receivedChars,50,50,0);
display.display();
newData = false;
}
}
void drawBitMap(unsigned char *img, int width, int height, int position){
if (position ==0){
display.drawBitmap(128/2-(width/2), 64/2-(height/2), img, width, height, 1);
} else if (position == 1){
display.drawBitmap(128-62,1, img, width, height, 1);
} else if (position == 2){
display.drawBitmap(0,5, img, width, height, 1);
}
}
@Nico Müller, 👍2
1 ответ
Лучший ответ:
Вы используете тип byte
для переменной ndx
. Тип byte — это 8 бит, поэтому максимальное значение — 255. Переменная ndx
увеличивается и после 255 продолжает отсчет с 0.
- Как преобразовать строку в шестнадцатеричный массив
- Матричный дисплей с Arduino UNO (ПРОБЛЕМА)
- Как преобразовать строку шестнадцатеричных чисел с разделителями в массив int
- Программа для умножения чисел на самом деле не будет их умножать
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой