Отправка массива размером >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);
  }
}

, 👍2


1 ответ


Лучший ответ:

5

Вы используете тип byte для переменной ndx. Тип byte — это 8 бит, поэтому максимальное значение — 255. Переменная ndx увеличивается и после 255 продолжает отсчет с 0.

,