Терминал для DigiUSB.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

Терминал для DigiUSB.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015
 
Терминал для DigiUSB.
 
Запилил монитор-терминал для Digispark DigiUSB.
 
по причине его отсутствия в новых дистрибутивах и непроходимой глючности версии, поставляемой в старых дистрибутивах.
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
сделано:
- убран баг с утерей 9-го символа.
- убран баг падения при переполнении массива ввода.
- убран таймаут 100 миллисекунд, делающий работу с терминалом абсолютно дискомфортной.
- убрана горячая клавиша выхода из терминала - не факт, что комбинация Ctrl+C (3) нам не понадобится для отправки в DigiUSB.
- активированы специальные клавиши клавиатуры.
- изменён режим работы терминала с железом DigiUSB:
раньше терминал собирал вводимые с клавиатуры символы в массив и отправлял этот массив в DigiUSB посимвольно при нажатии Enter(вводе символа \n (10)) (предполагается, что в DigiUSB символы будут снова собираться в массив или обрабатываться тем или иным полезным образом программными средствами DigiUSB).
при всей концептуальной правильности этого способа ввода данных, возникает вопрос: зачем мы вообще что-то делаем средствами терминала с предназначающейся для ввода в DigiUSB информацией, если стоит простая задача - отправить символ в DigiUSB?
поэтому:
все вводимые с клавиатуры символы имеют одинаковый приоритет и передаются в DigiUSB безусловно и немедленно.
 
*кароче, кому сложно развидеть теорию нового режима ввода - считайте, что клавиатура компьютера аппаратно подключена к DigiUSB по интерфейсу USB, вам остаётся обрабатывать нажатое на стороне DigiUSB и средствами DigiUSB.
неявный бонус: новый режим ввода по сути является режимом "game mode" - можно рулить контроллером всеми доступными клавишами клавиатуры.
 
фичи:
DigiUSB.println("text") печатает в терминал не так, как ожидается - т.е. печатает "text", делает возврат каретки — CR \r, делает перевод строки - LF \n без "text".
пока разбираюсь - или так и должно быть в линуксах, откуда есть пошла библиотека PDCurses, или в настройках PDCurses можно изменить дизайн поведения.
пока я разбираюсь, юзаем корректно работающую замену DigiUSB.println("text") -> DigiUSB.print("text\n"); или DigiUSB.print(a); DigiUSB.print('\n'); 
 
внешний вид терминала наследует настройки окна командной строки (CMD) Windows, поэтому настраивается там.
терминал представляет собой окно, где в первой строке снизу отображается код введённого символа, вторая строка снизу является строкой ввода, в третьей строке снизу отображается код принятого из DigiUSB символа, выше находится прокручиваемый экран принятого из DigiUSB.
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
сделано:
 
- добавлен вывод в текстовый файл:
received_digiusb.txt - получено из DigiUSB.
sent_digiusb.txt - отправлено в DigiUSB.
файлы создаются-открываются в режиме записи в конец текстового файла.
 
- изменён вывод в экран и текстовый файл непечатных символов ASCII:
 
непечатные символы выводятся в виде [d], где d - целое десятичное со знаком.*
т.е. [-128]...[31] и [127].
 
в то время, как:
 
печатные символы [32]...[126] выводятся в виде букв, цифр и знаков препинания.
 
управляющие символы
BS  \b [ 8]
TAB \t [ 9]
LF  \n [10] (Windows)
CR  \r [13]
LF  \n [17] (Unix)
выполняют функции управления выводом.
 
---------
*удобный формат представления, когда на стороне контроллера DigiUSB нужно анализировать полученное.
пример:
char ch;
if (ch == d) {}
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
сделано:
 
- теперь можно отправлять строку символов в терминал из консоли CMD Windows в формате
digiusb 1234send_command
или
digiusb "1234 send command"
где "digiusb" - имя файла программы терминала, "1234send_command" - строка, отправляемая терминал.
в контроллер DigiUSB будут отправлены символы 1234send_command + \n (символ перевода строки).
строка отправляется посимвольно, после чего работа программы терминала завершается, запись в текстовые файлы и сообщения об ошибках выполнения не производится - подразумевается, что программно-аппаратная отладка произведена в терминале, запущенным обычным образом и неполадок не предвидится.
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

и, скетч для просветления - зачем, почему, как... нужное раскомментить.


#include <DigiUSB.h>

void setup() {DigiUSB.begin();}

void loop() {

if (DigiUSB.available()) {

char a = DigiUSB.read();
// static String b = "";

// b = b + a; // добавляем в конец строки принятый символ.

// DigiUSB.write(a);
DigiUSB.print(a); // печатаем в DigiUSB принятый символ - делаем эхо-char.

// что-то делаем при получении символа клавиши z(122).
// if (a == 122) {}
// или
// if (a == 'z') {}
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// if (a == '\n') { // что-то делаем со строкой, если принят символ перевода строки(Enter)

// DigiUSB.print(b); // печатаем в DigiUSB собранную строку - делаем эхо-String.

// или что-то делаем и печатаем отчёт о выполненном, если принята строка "L01 on\n".
// if (b == "L01 on\n") {

// здесь что-то делаем.

// DigiUSB.print("ok!: " + b);}

// или выполняем другой код или подпрограмму.
// здесь код.

// b = ""; // в конце очищаем строку.

// }
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}

DigiUSB.delay(1);

}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001, что , прямо сам его пофиксил?)) Здорово. Кстати в тему, интересно какие аппаратные  ресурсы отъедает этот терминал. Сдаётся мне что таймер1 и прерывание PCINT, интересно бы точно узнать . А таймер1 там очень крутой, хоть и  8-битный, но у него 14-битный прескалер и возможность тактироваться через встроенный PLL синтезатор с тактовой 64MHz.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:

Клапауций 001, что , прямо сам его пофиксил?))

скорее не пофиксил, а переписал логику работы.

за USB там libusb отвечает - просто инициализируется железка, никакой логики, оставил как есть.

за ввод и отрисовку экрана PDCurses - настроил.

дальше C++ - читаешь символ из клавы и отправляешь в окно или usb.

исходник здесь валяется, просмотрев его, поймёшь, что писал упоротый LSD, периодически приходящий в сознание чел.

 

dimax пишет:

Кстати в тему, интересно какие аппаратные  ресурсы отъедает этот терминал. Сдаётся мне что таймер1 и прерывание PCINT, интересно бы точно узнать . А таймер1 там очень крутой, хоть и  8-битный, но у него 14-битный прескалер и возможность тактироваться через встроенный PLL синтезатор с тактовой 64MHz.

нуу, я не готов ответить, сколько ресурсов что отъедает - у меня оно крутится в программаторе USBasp на Atmega8 и частоте 12 мегагерц.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001 пишет:

у меня оно крутится в программаторе USBasp на Atmega8 и частоте 12 мегагерц.

а для чего он в программаторе? Я думал это исключительно для дижиспарка монитор.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:

Клапауций 001 пишет:

у меня оно крутится в программаторе USBasp на Atmega8 и частоте 12 мегагерц.

а для чего он в программаторе? Я думал это исключительно для дижиспарка монитор.

это монитор для дижиспарка, дижиспарк у меня крутится на atmega8 12 мегагерц, которая аппаратно находится в железе программатора USDasp - смысл городить аппаратный интерфейс V-USB, который использует дижиспарк, если готовая железка под руками валяется?

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:

Кстати в тему, интересно какие аппаратные  ресурсы отъедает этот терминал.

 
давай ещё раз про ресурсы объясню, что знаю точно:
 
терминал(digiusb.exe) опрашивает USB-порт дижиспарка на предмет его(порта) состояния
если состояние == 0, то буфер порта пуст и можно отправлять символ или ничего не делать
если состояние == 1, то в буфере порта что-то есть и это нужно считать и напечатать в окно терминала.
если состояние < 0, то это код ошибки - печатаем код ошибки и через 5 секунд закрываем терминал.
всё это крутится в цикле без таймаутов, выходом из цикла является условие состояние < 0.
 
так подозреваю, что на катастрофические потребление ресурсов дижиспарка частота опроса состояния USB-порта не должна особо влиять...
 
*в чём вообще должна выражаться нехватка ресурсов контроллера?
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001 пишет:

*в чём вообще должна выражаться нехватка ресурсов контроллера?

Я имел ввиду аппаратные ресурсы, что со стороны МК для обслуживания USB ( скорее всего не только для терминалки, а для любой эмуляции) отьедается целиком  таймер, прерывание. И об этом нигде не написано, по крайней мере на глаза не попадалось.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:
Я имел ввиду аппаратные ресурсы, что со стороны МК для обслуживания USB ( скорее всего не только для терминалки, а для любой эмуляции) отьедается целиком  таймер, прерывание. И об этом нигде не написано, по крайней мере на глаза не попадалось.

написано. вся информация есть в свободном доступе

со стороны МК работает интерфейс V-USB об этом явно сказано в Readme.txt, который лежит в папке библиотеки DigisparkUSB

This is the Readme file to Objective Development's firmware-only USB driver
for Atmel AVR microcontrollers. For more information please visit
http://www.obdev.at/vusb/

обобщённая информация в википедии

https://ru.wikipedia.org/wiki/V-USB

V-USB — название программной библиотеки, позволяющей получить поддержку протокола USB на микроконтроллерах AVR (семейств Classic, Tiny и Mega компании Atmel), которые не имеют аппаратной поддержки USB. V-USB — название программной библиотеки, позволяющей получить поддержку протокола USB на микроконтроллерах AVR (семейств Classic, Tiny и Mega компании Atmel), которые не имеют аппаратной поддержки USB. 

*мне не попадалась информация, что V-USB катастрофически занимает ресурсы

**пока, что нашёл в вики - но, это и из схемы подключения понятно

Из аппаратных ресурсов используется только прерывание по изменению сигнала на выводе (обычно INT0, подсоединенный к сигналу D+ шины USB). Таким системным требованиям удовлетворяют большинство микроконтроллеров семейства AVR.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001, это информация общая.  У дижиспарка на тини 85 своя специфика, и по ней -ни слова.  INT0 там точно свободен,т.к. это нога физически не подключена к USB. И главное про таймер нет ни слова нигде, хотя он явно используется.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:

Клапауций 001, это информация общая.

ну, как так "общая"? - есть исходники V-USB, есть исходники библиотеки DigisparkUSB, которые снабжены подробнейшими комментариями.

dimax пишет:

У дижиспарка на тини 85 своя специфика, и по ней -ни слова.   И главное про таймер нет ни слова нигде, хотя он явно используется.

вся специфика дижиспарка на тини 85 не выходит за рамки спецификации V-USB.

если желается узнать точно, то достаточно сравнить исходники библиотеки DigisparkUSB и V-USB

dimax пишет:

INT0 там точно свободен,т.к. это нога физически не подключена к USB.

ну, да.

/* ----------------------- Дополнительное описание MCU ------------------------ */
/* Следующие конфигурации работают по умолчанию в usbdrv.h. Вам обычно не нужно
    устанавливать их. Только если Вам нужно запустить драйвер на устройстве,
    которое пока не обрабатывается компилятором, который не полностью поддерживается
    (как, например, IAR C) или если используете прерывание, отличное от INT0,
    Вы можете задать кое-что из этого.
 */ 

для ATtiny85 в файле usbconfig.h указаны следующие настройки - посмотри, где там таймер - я плаваю в этом.

 #if defined (__AVR_ATtiny45__) || defined (__AVR_ATtiny85__) 
#define USB_INTR_CFG            PCMSK
#define USB_INTR_CFG_SET        (1<<USB_CFG_DPLUS_BIT)
#define USB_INTR_ENABLE_BIT     PCIE
#define USB_INTR_PENDING_BIT    PCIF
#define USB_INTR_VECTOR         SIG_PIN_CHANGE
#endif
для остальных AVR - настройки V-USB по умолчанию, где-то в usbdrv.h нужно смотреть.
 
*а, откуда, вообще, информация о таймере, о котором нигде не сказано, но всем известно?
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001 пишет:

*а, откуда, вообще, информация о таймере, о котором нигде не сказано, но всем известно?

Я изучал этот таймер, всё было хорошо пока не попытался выводить иформацию через терминал. Стоит поменять настройки таймера при работе терминала -либо всё сразу отваливается от usb, либо скорость вывода меняется. либо просто терминал отваливается, но таймер продолжает работать. Причём любые операции не связанные с таймером проходили без глюков, осюда сделал вывод, что таймер1 занят. Возможно таймер0 свободен, до него руки не дошли.

Кстати ещё любопытно, если ресет запрограммировать как обычный порт. Можно ли будет так-же через бутлоадер заливать прошивки? :) Жирно больно из 6 портов один отдавать под ненужную функцию..

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:

Кстати ещё любопытно, если ресет запрограммировать как обычный порт. Можно ли будет так-же через бутлоадер заливать прошивки? :) Жирно больно из 6 портов один отдавать под ненужную функцию..

в оригинальном дижиспарке так и сделано - всё льётся посредством их самописного лоадера и их софтового программатора micronucleus

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

dimax пишет:
Я изучал этот таймер, всё было хорошо пока не попытался выводить иформацию через терминал. Стоит поменять настройки таймера при работе терминала -либо всё сразу отваливается от usb, либо скорость вывода меняется. либо просто терминал отваливается, но таймер продолжает работать.

Наверное потому, что протокол USB довольно требователен к частоте при передаче данных, любое отклонение от допустимых по стандарту значений вызывает в драйверах аварийную ошибку и отключение устройства.

Клапауций 001спасибо, терминал - это хорошо, а то приходилось извращаться методом вывода в блокнот через DigiKeyboard.println()   :)

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

Tomasina пишет:
спасибо, терминал - это хорошо

все юзающие, зачисляются в роту тестеров и обязуются докладывать о неполадках и прочих неудобствах.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

А какое жалование у тестеров?

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:
А какое жалование у тестеров?

они не будут расстреляны за невыполнение приказа.

т.е. им будет пожаловано самое ценное в этом мире - жизнь.

*невидимые руны лицензионного соглашения читать нужно, что бы вопросов не возникало.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Живём!
Правда непонятно, чья жизнь им гарантирована.
Да и не расстрелян не значит не повешен
Эхх, как говорил один мой коллега, если что то не получается, ляг поспи и все пройдет

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:
Правда непонятно, чья жизнь им гарантирована.

не гарантирована, а пожалована - я не страховая компания, а простой командир роты тестеров.

вероятность путаницы не исключаю - заменю из обменного фонда.

*шо там у тебя не получается?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В тестеры выйти не получается, прощай жизнь. Нету у меня Digisparkа

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:
В тестеры выйти не получается, прощай жизнь. Нету у меня Digisparkа

ну, да - а, кто подключал фейс V-USB и загрузчик USBaspLoader пилил?

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ах жеж, точно. Не вникнул значит в тему, видел знакомые слова, но не осознал, только щас дошло :) Хотя Дигиспарк я всё таки погуглил W

 

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:

Ах жеж, точно. Не вникнул значит в тему, видел знакомые слова, но не осознал, только щас дошло :) Хотя Дигиспарк я всё таки погуглил W

ну, теперь пили файл usbconfig.h в папке библиотеки DigisparkUSB для своего МК или возьми готовый для atmega8 и атмега16, где подключено:
 
atmega8:
USB D+ - D 2 (PD2), D 9 (PB1)
USB D- - D 8 (PB0)
 
atmega16:
USB D+ - D 2 (PD2)
USB D- - D 6 (PD6)
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Честное слово, не могу придумать, зачем мне это сейчас нужно. Хотя может когда и пригодится, тогда и вспользуюсь.

Я щас активно юзаю паяльник и взрываю интернет по поиску недостающих деталек, типа С5-16МВ-2, даже Чип и Дип отказал в заказе :)

 

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:
Честное слово, не могу придумать, зачем мне это сейчас нужно. Хотя может когда и пригодится, тогда и вспользуюсь.

хм. приходит чел в тему, задаёт вопросы, получает ответы, затем заявляет, что не понимает, что он здесь делает и зачем это всё ему нужно именно сейчас.

*kisoft, ты заблудился? - никто тебя не принуждает всё бросать и заниматься дижиспарком.  если шо, то выход здесь Форум.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Мне этот терминал щас не нужен, вот я о чем, а не про что то еще. Ок, я закончил, хотел разговор поддержать, да не получилось :)

 

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:

Мне этот терминал щас не нужен, вот я о чем, а не про что то еще. 

ок - на планете Земля существует несколько миллиардов человек, кому не нужен терминал, ты один из них.

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

На то он и форум, каждый пишет что хочет

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

вопрос программистам:

в каком виде выводить в терминал непечатные символы канонически правильно в виде %d(целое десятичное со знаком)?

*запилил запись ввода-вывода в текстовый файл - потестирую и опубликую позже.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я предпочитаю в HEX "0x%02X", ещё можно в десятичном и в скобках HEX.
Специальных канонов нет, зависит от типа информации.
Только в HEX удобно тем, что числа в колонках одно под другим.
Вообще вопрос философский, как аффтор посчитает понятным и удобным, так и хорошо

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:
Я предпочитаю в HEX "0x%02X", ещё можно в десятичном и в скобках HEX. Специальных канонов нет, зависит от типа информации. Только в HEX удобно тем, что числа в колонках одно под другим. Вообще вопрос философский, как аффтор посчитает понятным и удобным, так и хорошо

ну, в монитор печатается и пересылается в USB переменная char - пытался выводить её в виде %x, но как-то оно криво отрицательные значения выводятся. остановился на %d - легко читаемое и интуитивно понятное  десятичное число.

думаю так

%-30%0%31%127

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Если нужны числа со знаком, то HEX неудобен, это да. Хотя привести char к беззнаковому типу - не вопрос

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:
Если нужны числа со знаком, то HEX неудобен, это да. Хотя привести char к беззнаковому типу - не вопрос

не в знаке дело, а в том, что отрицательные числа если делать %x выводятся с fffff перед значением HEX - не знаю почему.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Явно перед выводом char конвертируется, потому это и происходит (более точно щас не смогу объяснить, сам не очень помню, не охота по асму лазить). Потому перед выводом char надо конвертировать, например, в unsigned char. Для примера в третьем варианте привел к unsigned int. Да, всё это на винде компилировалось и выполнялось.

Пример (Visual Studio 2013):

char val1 = 18;
char val2 = 254;

int _tmain(int argc, _TCHAR* argv[])
{

	
	printf("%s\n", " === signed");
	printf("val1 = 0x%02X\n", val1);
	printf("val2 = 0x%02X\n", val2);

	printf("%s\n", " === unsigned");
	printf("val1 = 0x%02X\n", (unsigned char)val1);
	printf("val2 = 0x%02X\n", (unsigned char)val2);

	printf("%s\n", " === unsigned int");
	printf("val1 = 0x%02X\n", (unsigned int)val1);
	printf("val2 = 0x%02X\n", (unsigned int)val2);
	return 0;
}

/*
=== signed
val1 = 0x12
val2 = 0xFFFFFFFE
=== unsigned
val1 = 0x12
val2 = 0xFE
=== unsigned int
val1 = 0x12
val2 = 0xFFFFFFFE
*/

 

Клапауций 001
Offline
Зарегистрирован: 05.09.2015
фиг его знает, да и не при чём тут асм - фсё происходит на винде в MinGW C++
а, почему у тебя строка символов %s, а не символ %c ?
 
у меня так получается - результатом
// *где send_usb - скан-код клавы компа.
printf("%d\n", send_usb);
printf("%x\n", send_usb);


является к примеру:

8
8

-8
fffffff8

15
f

-15
fffffff1

городить костыли форматирования этого в нечто единообразное как-то не желается да и читается оно хреново - привык уже что числа от -128 до 127 у меня летают.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Asm только чтобы посмотреть приведение типов.
Насчёт %s не понял. %s - вывод строки, что у меня и есть, а %c - вывод char. Впрочем это и так понятно. Значит я вопрос не понял.
Кстати %x так и написано, что это беззнаковое целое, значит 100% происходит преобразование из char в unsigned int или типа того.
В общем можно с этим завязывать, тема HEX раскрыта :) Может кому будет полезно почитать.

arduinec
Offline
Зарегистрирован: 01.09.2015

Про дополнительный код для отрицательных чисел:
http://microkontroller.ru/programmirovanie-mikrokontrollerov-avr/pryamoy...

kisoft пишет:
Кстати %x так и написано, что это беззнаковое целое, значит 100% происходит преобразование из char в unsigned int или типа того.

Судя по примерам, происходит преобразование в long int (процессор 32-разрядный). Но конверсия (unsigned char) уменьшает число до одного байта и помогает уменьшить количество F в старших разрядах числа.

 

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:
Кстати %x так и написано, что это беззнаковое целое, значит 100% происходит преобразование из char в unsigned int или типа того. В общем можно с этим завязывать, тема HEX раскрыта

для меня не раскрыта - как напечатать в HEX отрицательный  char.

в byte перевести и затем?..

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

HEX изначально беззнаковый формат, потому отрицательный HEX - нонсенс

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:

HEX изначально беззнаковый формат, потому отрицательный HEX - нонсенс

т.е. вывод char в формате HEX практически невозможен и не имеет смысла.

ок.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я всё объяснил в сообщении #32 повторять нет смысла.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:
Я всё объяснил в сообщении #32 повторять нет смысла.

ничего ты не объяснил - ты сказал, что для лично тебя это не проблема.

для меня это проблема - вернуть отрицательное число из HEX

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

kisoft пишет:

HEX изначально беззнаковый формат, потому отрицательный HEX - нонсенс

Как это беззнаковый, куда-ж знак растворяется что ли? :))

int val = 0xFFF1;
void setup() {
Serial.begin (9600);
Serial.print(val);
}

void loop() {
}

Вот код для примера ,  выдаст в сериал  -15.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax, получается, что всё правильно тут #35

17 -15
18 fffffff1

*кароче, шото у меня подозрение, что оптимальным способом будет конвертация числа в восьмибитный код, а затем - представлять его, как желается.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Клапауций 001, да я и не особо понял в чём собссно проблема. Отрицательные в хексе -да, непривычно выглядят, с ходу даже не поймёшь ,большое это число или маленькое:) Можно даже загадки новичкам загадывать, что больше, (int) 0xFFF1  или (int)0x7FFF ? )))

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

dimax пишет:

Клапауций 001, да я и не особо понял в чём собссно проблема.

вкратце: думаю, как выводить на экран непечатные сканкоды клавиатуры - потому как printf("%c", ch) печатает бред.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

dimax пишет:

kisoft пишет:

HEX изначально беззнаковый формат, потому отрицательный HEX - нонсенс

Как это беззнаковый, куда-ж знак растворяется что ли? :))

int val = 0xFFF1;
void setup() {
Serial.begin (9600);
Serial.print(val);
}

void loop() {
}

Вот код для примера ,  выдаст в сериал  -15.


-15 это DEC, а не HEX.
В общем как хотите, но ужеибез меня. В гугле поискать c++ printf и в нём формат %x, там написано явно, что это беззнаковый формат. Point.

Клапауций 001
Offline
Зарегистрирован: 05.09.2015

kisoft пишет:
В общем как хотите, но ужеибез меня.

да, нет уж - снова пришёл, нагородил чепухи и свалил...

рассказывай, нафига ты мне предложил выводить char в формате HEX?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

kisoft, я иногда торможу, и чего-то не понимаю, просьба разъяснить :)  В данном случае не понимаю причём тут HEX, DEC и их знаковость? Где тут взаимосвязь? Есть знак, или нету знака задаётся в типе данных int16_t или uint16_t, другими словами в int старший бит несёт не числовую, а знаковую информацию.  Но как это связано с хексом или dec, вот что я не пойму..

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Клапауций 001 пишет:

kisoft пишет:
В общем как хотите, но ужеибез меня.

да, нет уж - снова пришёл, нагородил чепухи и свалил...

рассказывай, нафига ты мне предложил выводить char в формате HEX?

А вернуться и прочитать моё сообщение слабо? Я написал "я предпочитаю", и меня совершенно не интересует, что, при этом, предпочитают другие. И объяснений я уже тонну выкатил, да никто не хочет прочитать внимательно.

Теперь по поводу HEX, DEC. Я слегка удивлён, что вы тут все дружно начали тупить и смешивать понятия хранения и отображения. HEX, DEC это всего лишь формат для отображения информации в удобном для человека виде. Попгуглите "C++ printf" и почитайте там про %x.

Мля, всё это есть в инете, объяснять рутину нет никакого желания. Считайте как хотите. Я больше на эту тему не отвечаю, гуглите.