В функцию не передаются русские буквы.
- Войдите на сайт для отправки комментариев
Чт, 16/10/2014 - 22:12
Вот код:
int p12 = 12; // PIN #12 - подключен пьезоизлучатель
int p13 = 13; // PIN #13 - подключен светодиод
int dlit = 50; // Длительность точки (как "атомарная длинна")
int let = dlit * 3; // Длительность тире
bool start = true;
void loop() {
if (start == true) {
start = false;
beep('A'); beep('l'); beep('e'); beep('x'); beep('e'); beep('y'); // Так все хорошо работает !!!
pauza();
} }
void beep(char bukva) {
if (bukva == 'A' || bukva == 'a' || bukva == 'A' || bukva == 'а') {a();}; // Пропищать .- а
...
....
....
....
Если подставить русские буквы:
beep('А'); beep('л'); beep('е'); beep('к'); beep('с'); beep('е'); beep('й');
...то ничего не происходит - пищалка морзянку не пищит, мыргалка не мыргает...
Почему ?
а Вы ее напрямую в теле программы передаете или через терминал?
тип char принимает значения до 127. Кириллица - от 192 (А) до 255 (я).
попробуйте unsigned char
ua6cfo,
1. добавьте в начало метода beep вывод значения параметра в терминал.
2. посмотрите и запишите что он выводит
a. для разных латинских букв
b.для кирилических букв
3. опубликуйте тут результаты
Вы не учли что расские буквы представленны в юникоде а это значит что нужно сравнивать по 2 байта или хотябы каждый 2 байт.
И сравнение лучше всего вывести в
там организовать промежуточную функцию morze(char * str, uint8_t len){} где будет перебираться строка
и обращяться к ней так morze('.-',2);
Для:
beep('A'); beep('l'); beep('e'); beep('x'); beep('e'); beep('y');
------
Если использовать:
void beep(word bukva) {
Я же сказал что нужно переработать весь принцип программы. Сделать обработчик "Целой" строки а не отдельных букв. Сделать преобразование в заглавные буквы целевой строки как для юникода(руссике буквы) так и для латыницы. Если в латынице они все последовательны, то с юникодом сложнее там часть строчных русских букв в другой таблице: "абв..." таблица D0, а "рст..." таблица D1. Микроконтроллер 8-битный поэтому ему проще оперировать переменными размером 1 байт.
Какой тип двухбайтной переменной "bukva" использовать ?
Попробуйте byte, должно хватить. Для "я" - 255.
Получается, что задача в таком виде не решабельна. :-(
В коде Морзе существуют такие буквы как: ч,ш,э,ю,я, которые не имеют аналогов в коде морзе с остальными буквами.
Если написать на компьютере программу, которая делает то, что Вы, NeiroN, предлагаете - так Aduino тут вообще не нужен. Достаточно к COM порту присобачить релюшку или оптрон и вперед... Таких программ для ПК сейчас сколько хочешь...
To sergeevalex: Спасибо ! Попробую...
Когда начнёте пробовать, увидите свою ошибку. Возможно, это подтолкнёт к мысли анализировать в коде не сам знак, а его числовой эквивалент.
А мне тут нечего было делать и я написал вашу прогу чисто из принципа, проверил, допилил, отладил.
Теперь вам задача сделать из этого кода библиотеку, чтобы другие могли ей пользоваться.
через массивы, на мой взгляд, было бы красивее. Сопоставить аскиикоду символа набор символов морзе и при опросе первого измерения массива на соответствие знака введённой строки выводить из второго измерения массива необходимый набор символов.
Не вижу кода от вас, кроме стандартного эха компорта.
To NeiroN: Я восхищён ! Спасибо ! Попробую сделать из этого реальную библиотечку - надеюсь многим пригодится...
Вы использовали обычный динамик через конденсатор, подключенный на pin#10. А у меня пъезоизлучатель (который сам пищит если подать 5 вольт), вместо него потом будет стоять герконовая 5 вольтовая релюшка (надежно и бесшумно). Но и мой вариант (для манипуляции) и Ваш (для аудиоконтроля) совмещу...
Еще вопрос, если не утомил: терминал - то понятно, но через что (какую программу) можно посылать строки в СОМ порт, если не пользоваться средой Arduino ? HyperTerminal или еще через что-то - пойму и сделаю терминальную (которая для ПК) часть на Delphi...
putty
А еще в ней можно рисовать текстовой графикой что угодно(тут такая есть тема).
putty
А еще в ней можно рисовать текстовой графикой что угодно(тут такая есть тема).
Еще раз спасибо ! Честно говоря я так и думал, но сомневался. PUTTY у меня используется для работы через COM порт - управление разными устройствами и поэтому ее достаточно хорошо изучил... :-) Еще раз спасибо, буду делать систему управления (по своей задумке - многим моим коллегам будет полезна) и оформлю в виде библиотеки. Только, надеюсь, если не дотумкаю сам как превратить код в библиотеку, Вы подскажете...
Нейрон, где буква ё ?
остальные мелкие претензии к качеству кода оставлю при себе. ибо сам говнокожу по пятницам.
для упрощения кода я ее не использую)) пусть кому надо сами допишут две строки с нужными кодами.
Вобщем мне опять было весело и я скачал програмку для андроида чтобы раскодировать морзянку через микрофон - решил затестить свою програмку. С задержками немного ошибся - коректировал по устойчивому распознованию программой на андроиде - звуковых кодов генерируемых ардуиной(жаль что программа только латинские буквы распознает). Привожу код который Морзянку генерит как надо.
На массивы переписывать не стал, потому что лень. Возможно кто-то захочет написать декодер морзе - задача чуть сложнее, но тоже вполне решаема через arduino.
я бьюсь в истерике под столом
обязательно над кодом поработаю
спасибо за положительные эмоции
Делается в расчете на хорошую читаемость кода. Все работает хорошо, как изначально было задумано...
Хочу спросить, как лучше сделать изменение скорости ? Вариант с переменным резистором или вариант через макрокоманду (типа: #60 - "установить скорость 60 знаков в минуту") ?
Имеет ли смысл использовать маленькую внутренюю память для хранения предопределенных макросов (допустим до 10 шт.), которые будут вызываться макрокомандой с терминала &1 (к примеру: по команде &1 будет выдано - "CQ CQ DE UA6CFO PSE K" - "всем, всем, приглашает UA6CFO, пожалуйста передавайте") ? Или лучше заранее прописывать текст макроса как строку в скетч ?