Serial.print и Serial.write передают символы

Argus19
Offline
Зарегистрирован: 08.05.2022

Изучаю лёгкую библиотеку для OLED:
https://github.com/GyverLibs/GyverOLED
Передаю в комп содержимое буфера дисплея:

  for (i = 0; i < 1023; i++){
 Serial.print(oled._oled_buffer[i], HEX);         
}

или

Serial.write(oled._oled_buffer, 1024);

 Смотрю лог передачи программой Free Serial Port Monitor. Вместо передачи байт вижу передачу символов:
46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 FFFFFFFFFFFFFFFF
32 32 30 30 32 32 30 30 32 38 30 30 30 30 30 30 2200220028000000
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000

Как передать именно байты?

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А где сам буфер ?

Argus19
Offline
Зарегистрирован: 08.05.2022

В библиотеке, на которую я дал ссылку.

В буфер байты принимаются и отображаются на дисплее.

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А символы у тебя значит передаются трайтами ?

b707
Offline
Зарегистрирован: 26.05.2017

Argus19 пишет:

Вместо передачи байт вижу передачу символов:

46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 FFFFFFFFFFFFFFFF
32 32 30 30 32 32 30 30 32 38 30 30 30 30 30 30 2200220028000000
30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000

Как передать именно байты?

 

а как, по вашему. при печати должны выглядеть байты? :)))

Argus19
Offline
Зарегистрирован: 08.05.2022

Попробую объяснить.

Первые 8 байт состоят из единиц: 11111111. Т.е. в шестнадцатиричной системе: 0хFF.

Однако, ардуино их передаёт в виде символов: 70 и 70. Не 0хFF, а "F" и потом ещё "F".

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Argus19 пишет:

Однако, ардуино их передаёт в виде символов: 70 и 70. Не 0хFF, а "F" и потом ещё "F".

так вы же сами заказали печатать их в HEX формате.  255 в HEX - это и есть FF

 

Argus19
Offline
Зарегистрирован: 08.05.2022

"FF" не есть "F" и "F". "FF" есть 255, а не два байта по 70. Должен быть один байт шестнадцатиричного, а не два байта символов.

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Argus19 пишет:

"FF" не есть "F" и "F".

это вы так думаете. И думаете неправильно.. На самом деле команда

Serial.print(0xFF, HEX);

печатает два символа 'F' и никак иначе.

 

Цитата:
Должен быть один байт шестнадцатиричного, а не два байта символов.

Разберитесь в чем отличие байтов и их шестнадцатиричного представления. У вас в голове полная каша. Байт 0xFF "как байт" вообще нельзя напечатать, ему не соответствует печатных символов в таблице ASCCI. А в шестнадцатиричном виде он представляет из себя два символа 'F', так что программа печаете вам именно то, что вы заказали.

Вам для начала надо понять, что вы хотите от программы. Залача "напечатать байтовый буфер" - это бредятина.

 

 

 

SAB
Offline
Зарегистрирован: 27.12.2016

Argus19 пишет:

Попробую объяснить.

Первые 8 байт состоят из единиц: 11111111. Т.е. в шестнадцатиричной системе: 0хFF.

Вообщето вы написали про биты (в двоичной системе)  B11111111=0xFF  

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Argus19, Вам в первом же ответе намекнули, что необходимо приводить текст скетча полностью. Т.е. то, что можно целиком загрузить в IDE и проверить, не добавляя к нему никаких строк "от себя". Именно потому, что это "от себя" у каждого будет разное.

Учитывая, что библиотеки Гайвера содержат массу ошибок, а сам автор не торопится их исправлять, на этом форуме не принято их использовать и вообще как-то обсуждать. Поэтому могу порекомендовать составить небольшой законченный фрагмент (не использующий библиотек Гайвера), который каждый желающий мог бы откомпилировать и проверить у себя.

И там же напишите, что Вы получаете в результате, и что ожидаете получить.

Пока что нет предмета для обсуждения.

Argus19
Offline
Зарегистрирован: 08.05.2022

b707 пишет:
Залача "напечатать байтовый буфер" - это бредятина.

 "Полностью согласен с предыдущим оратором". Поэтому, кроме

Serial.print(oled._oled_buffer[i], HEX); 

, которая именно "печатает", было опробовано

Serial.write(oled._oled_buffer, 1024);

Второй вариант должен был тупо передать массив байт, в котором может быть всё, что угодно, а не обязательно текст. Однако, всё-равно передаются символы.

andriano пишет:

 Поэтому могу порекомендовать составить небольшой законченный фрагмент (не использующий библиотек Гайвера), который каждый желающий мог бы откомпилировать и проверить у себя.

И там же напишите, что Вы получаете в результате, и что ожидаете получить.

Пока что нет предмета для обсуждения.

 Наконец-то вразумительный ответ. Спасибо. К сожалению, предмет обсуждения в том, что у библиотеки имеется член класса - буфер дисплея, к которому есть доступ. Я сделал загрузку изображения из компьютера в OLED дисплей. Если правила форума позволяют приводить ссылки на другие форумы, то я приведу ссылку на мой блог, в котором компьютерная программа, скетч и описание. Программа передаёт в буфер дисплея Гайвера именно байты.

andriano пишет:

Учитывая, что библиотеки Гайвера содержат массу ошибок, а сам автор не торопится их исправлять, на этом форуме не принято их использовать и вообще как-то обсуждать.

 Спасибо. Учту. Библиотека от Adafruit уж очень велика. Хотелось бы оставить побольше места в памяти.

Если не затруднит, дайте ссылку на стартовое обсуждение этой библиотеки. Интересно почитать об имеющихся в ней ошибках.

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Argus19 пишет:

было опробовано

Serial.write(oled._oled_buffer, 1024);

Второй вариант должен был тупо передать массив байт, в котором может быть всё, что угодно, а не обязательно текст. Однако, всё-равно передаются символы.

думается мне, что это неправда. Можете продемонстрировать, как вы это видите? Только скетч. пожалуйста, полностью

Цитата:
Если правила форума позволяют приводить ссылки на другие форумы, то я приведу ссылку на мой блог, в котором компьютерная программа, скетч и описание.

 

нет, не позволяют. Выкладывайте все сюда.

Argus19
Offline
Зарегистрирован: 08.05.2022

b707 пишет:

думается мне, что это неправда. Можете продемонстрировать, как вы это видите? Только скетч. пожалуйста, полностью

Вот:

#define RES 8
#define DC 7
#define CS 6
#define OLED_SPI_SPEED 8000000ul

#include <GyverOLED.h>

GyverOLED<SSD1306_128x64, OLED_BUFFER, OLED_SPI, CS, DC, RES> oled;

int i;			// Счётчик. 
int X = 1;
uint32_t btnTimer = 0;
byte Y;           // сохраняет считанные аналоговые значения, сопоставленные с 0-63
byte oldY;	  // ранее считанное значение
void setup() {
    Serial.begin(9600);
    pinMode(A0, INPUT);	// Определяем пин АЦП
// Назначаем 4-й пин с внутренним подтягивающим резистором для кнопки: "Сброс".    
  pinMode(4, INPUT_PULLUP); 
// Назначаем 5-й пин с внутренним подтягивающим резистором для ещё одной кнопки: "Переслать изображение в компьютер".
  pinMode(5, INPUT_PULLUP);    
  oled.init();
  Wire.setClock(800000L);
   Axis();	
}
void loop() {
  if (digitalRead(4) == LOW) {
     X = 1;
      oled.clear();
        Axis();
  }

  if (digitalRead(5) == LOW) {
// Передаём в комп буфер дисплея.
 Serial.write(oled._oled_buffer, 1024);           
  }    

        if (X >= 127){  // Если достигли ширины дисплея, стоим.
	return;
}
// сдвиг вправо на 4 эффективно отображает диапазон 0-1023 в 0-63	
    Y = 63 - (analogRead(A0) >> 4); 
    if (Y == oldY){
	return;
}
   oled.line(X, oldY, X++, Y, 1);
//       Serial.println(Y);
    oled.update(); // Отображаем линию.   
     oldY = Y;     // Запоминаем новое значение        
      ++X;  
}

void Axis(){              // Рисуем вертикальную ось и засечки на ней.
 oled.clear();
  oled.line(0, 0, 0, 63, 1);
  for(i = 0; i < 60; i = i+12){    
       oled.dot(1, i+1, 1);
  }
 oldY = 63 - (analogRead(A0) >> 4);
  oled.dot(X, oldY, 1);
    oled.update();

}

b707 пишет:
нет, не позволяют. Выкладывайте все сюда.

Как приложить к сообщению архив?

Argus19
Offline
Зарегистрирован: 08.05.2022

kalapanga
Offline
Зарегистрирован: 23.10.2016

Argus19, Вы не можете разобраться в понятиях "байты", "символы", "текст", "шестнадцатеричный" и т.п.

К этому ни малейшего отношения не имеют ни дисплей, ни Гайвер с его библиотеками. _oled_buffer у него там - это обычный массив значений типа uint8_t. Вот и напишите махонький скетч с объявлением такого массива, заполнением его какими-нибудь значениями и выводом его в сериал. И объясните - что Вы ожидали увидеть и чем оно отличается от того, что увидели. Всё.

Argus19
Offline
Зарегистрирован: 08.05.2022

kalapanga пишет:

К этому ни малейшего отношения не имеют ни дисплей, ни Гайвер с его библиотеками. _oled_buffer у него там - это обычный массив значений типа uint8_t. Вот и напишите махонький скетч с объявлением такого массива, заполнением его какими-нибудь значениями и выводом его в сериал. И объясните - что Вы ожидали увидеть и чем оно отличается от того, что увидели. Всё.

Написал:

uint8_t arr[4] = {0xFF, 0, 0xFF, 3};

void setup() {
  Serial.begin(9600);
 Serial.write(arr, 4);        
}


void loop() {
   
}

и получил именно байты, как и хотел:


Порт открыт процессом "javaw.exe" (PID: 3312)

Ответ:09.05.2022 14:22:53.31464

FF 00 FF 03 ÿ.ÿ.

Порт закрыт

Порт открыт процессом "javaw.exe" (PID: 3312)

Ответ:09.05.2022 14:22:53.31464

 FF 00 FF 03                                       ÿ.ÿ.            

Порт закрыт

Если в библиотеке Гайвера буфер дисплея _oled_buffer объявлен как uint8_t, то почему я получаю символы? Это всё, что я хочу понять.

Argus19
Offline
Зарегистрирован: 08.05.2022

Всем спасибо.

После переписывания скетчей, вернулся к вышеприведённому и всё заработало.

Похоже, у меня проблема с компьютером.

 

Argus19
Offline
Зарегистрирован: 08.05.2022

b707]</p> <p>[quote=Argus19 пишет:

Цитата:
Если правила форума позволяют приводить ссылки на другие форумы, то я приведу ссылку на мой блог, в котором компьютерная программа, скетч и описание.

нет, не позволяют. Выкладывайте все сюда.

Если интересны результаты, можете посмотреть:

https://drive.google.com***************************

https://drive.google.com***************************

 

Green
Offline
Зарегистрирован: 01.10.2015

Ну, тебе ж сказали, выкладывать всё сюда... Никто ТУДА ходить не будет.

Argus19
Offline
Зарегистрирован: 08.05.2022

Green пишет:

Ну, тебе ж сказали, выкладывать всё сюда... Никто ТУДА ходить не будет.

 Это ссылки для скачивания архивов .zip.

 Как сюда разместить архив?

 

Green
Offline
Зарегистрирован: 01.10.2015

Без архивов. Исходные тексты под спойлер.

b707
Offline
Зарегистрирован: 26.05.2017

исходные тексты без всяких архивов сюда или на github

но вообще сомневаюсь. что это будет хоть кому-нибудь интересно. По вопрсам очевидно, что источник проблемы в банальном неумении программировать.

Argus19
Offline
Зарегистрирован: 08.05.2022

b707 пишет:

исходные тексты без всяких архивов сюда или на github

 Исходные коды программ под Windows?

b707 пишет:
но вообще сомневаюсь. что это будет хоть кому-нибудь интересно. По вопрсам очевидно, что источник проблемы в банальном неумении программировать.

 Там два архива.

  В одном программа, которая загружает выбираемое изображение с жёсткого диска компа, преобразует её в формат 128Х64 в оттенках серого. Слайдером выбирается желаемый вид чёрно-белого изображения. После чего изображение передаётся в ардуино и отображается на OLED дисплее.

  Во втором, ловушка для блока питания на ардуино. Отслеживаются и индицируются на OLED дисплее изменения напряжения БП. Полученное изображение по нажатию кнопки передаётся в компьютерную программу, которая выводит полученное изображение и записывает его в формате .bmp.

 Вся проблема была в неправильном драйвере CH340.

 По неумению программировать, подскажите, что означают такие строки:

	digitalWrite(SDA,1);
	digitalWrite(SCL,1);
	TWBR=26;     //TWBR=26; calculated for 24 FPS (TWBR=1; for 80 FPS )
	TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE);
	while (buff_size>=0);
	delay(1);
  TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
	while (TWCR&(1<<TWSTO));
	TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
	while (!(TWCR&(1<<TWINT)));
	TWDR=SSD1306_addr<<1;
	TWCR=(1<<TWINT)|(1<<TWEN);
	while (!(TWCR&(1<<TWINT)));
	TWDR=0x40;
	TWCR=(1<<TWINT)|(1<<TWEN);
}

 Тут непонятные для меня строки со знаками "<<" и пр.

 

b707
Offline
Зарегистрирован: 26.05.2017

Argus19 пишет:

 Тут непонятные для меня строки со знаками "<<" и пр.

 

непонятный знак "<<" означает битовый сдвиг влево, с такими вопросами обращайтесь в любой учебник по Си - это базовые понятия.

Приведенный отрывок кода - это работа с I2c через соответвующие регистры. без использования ардуиновского Wire.h

Argus19
Offline
Зарегистрирован: 08.05.2022

b707 пишет:

непонятный знак "<<" означает битовый сдвиг влево, с такими вопросами обращайтесь в любой учебник по Си - это базовые понятия.

Приведенный отрывок кода - это работа с I2c через соответвующие регистры. без использования ардуиновского Wire.h

Спасибо. Было сомнение, что это код AVR-студии, а не ардуино IDE. Я какое-то время назад с пол-года позанимался С++. Многое забыл.

 

b707
Offline
Зарегистрирован: 26.05.2017

Argus19 пишет:

Спасибо. Было сомнение, что это код AVR-студии, а не ардуино IDE.

Вообще говоря. код AVR-студии отлично работает в ардуино IDE. Но судя по первым двум строчкам - это код ардуино

Argus19
Offline
Зарегистрирован: 08.05.2022

b707 пишет:

Вообще говоря. код AVR-студии отлично работает в ардуино IDE. Но судя по первым двум строчкам - это код ардуино

 Спасибо.

Green
Offline
Зарегистрирован: 01.10.2015

Ну до чего ж народ то ограниченный! Ужос.(