Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 12.02.2011, 18:50  
zms2003
Частый гость
 
Регистрация: 26.03.2008
Сообщений: 43
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
zms2003 на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от code-by Посмотреть сообщение
main()
{
char s;
s=getchar();
if (s!='')
{ ... }
}

Мож написать s!=0xFF...
Где 0xff - некое значение, которое никогда по уарту не придет))) и s всегда его присваивать после обработки))

Просто если принимать циферки, то парсеру довольно тяжело определить что в буфере пришел 0 если пустой буфер и так из нулей состоит.
Здесь нужно по прерыванию отлавливать прием... типа прерывание по Rx - подняли флаг... В проге ловим флаг и берем s... Но тогда можно пропустить следующий символ на приеме, если проц небыстрый)))
либо обрабатывать сразу в обработчике прерываний...
Но проще всего все же в строку перевести при передаче... ИМХО Как я выше сказал...
Реклама:
zms2003 вне форума  
Непрочитано 12.02.2011, 19:58  
MisterDi
Почётный гражданин KAZUS.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

В бубырнадцатый раз повторю: GETCHAR() ЖДЕТ ПРИХОДА СИМВОЛА. ПОКА НЕ ПРИШЕЛ СИМВОЛ, НЕТ ВОЗВРАТА В ВЫЗЫВАЮЩУЮ ПРОГРАММУ! Используйте функцию запроса готовности, если это надо. И помните, в С проверка на равество пишется "==" а не "=", сам бывало спотыкался на этом.
__________________
misterdi<@>i.ua
MisterDi вне форума  
Непрочитано 12.02.2011, 20:22  
OlegNZH
Почётный гражданин KAZUS.RU
 
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
OlegNZH на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от MisterDi Посмотреть сообщение
И помните, в С проверка на равество пишется "==" а не "=", сам бывало спотыкался на этом.
Очень много "невынужденных ошибок" - когда пишешь на разных языках. Для примера- как-то углядел - статью- Ошибки Синтаксиса Паскаля после С - и наоборот...довольно занимательно . (прилагаю- читать с 9 главы (старенькое конечно , но явности- так и прут))
Offtop конечно .. удалю позже.
Вложения:
Тип файла: txt TC02.TXT (712.1 Кб, 260 просмотров)

Последний раз редактировалось OlegNZH; 12.02.2011 в 20:42.
OlegNZH вне форума  
Непрочитано 12.02.2011, 21:02  
zms2003
Частый гость
 
Регистрация: 26.03.2008
Сообщений: 43
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
zms2003 на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от MisterDi Посмотреть сообщение
GETCHAR() ЖДЕТ ПРИХОДА СИМВОЛА.
Я просто этой функцией не пользовался никогда))) Я сам их пишу - по некоторым причинам не могу использовать всякого рода библиотеки)))
zms2003 вне форума  
Непрочитано 12.02.2011, 22:08  
MisterDi
Почётный гражданин KAZUS.RU
 
Аватар для MisterDi
 
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
MisterDi на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

ИМХО хорошим тоном считается использование стандартных названий со стандартным смыслом. Конечно для самописных функций автор решает все. Прошу прощения за некоторую резкость.
__________________
misterdi<@>i.ua
MisterDi вне форума  
Непрочитано 12.02.2011, 23:28  
akimych
Прописка
 
Регистрация: 02.01.2011
Сообщений: 159
Сказал спасибо: 8
Сказали Спасибо 32 раз(а) в 28 сообщении(ях)
akimych на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Цитата:
т.е. может при приеме 0 (0x0) получаем s='' ?
Ест-но.
Я вообще не понял, к чему там написано if (s!='') { ... }
Да и
Цитата:
char getchar(void)
{
return UDR0;
}
Странный код, сначала нужно проверить статусный регистр на наличие принятого байта.

Цитата:
if (s!='') - это операция инверсии битов в переменной
Это где так?

Вообще задача стандартная, передать какие-то данные по RS-у.
Передавать их в чистом виде можно, если ошибки при передаче не играют особой роли. Ну например надо что-то во время отладки пару раз выдать на комп. В остальных случаях нужно делать какой-то протокол обмена.
Да вроду тут на форуме уже обсуждалось подобное.
akimych вне форума  
Непрочитано 13.02.2011, 01:24  
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от MisterDi Посмотреть сообщение
В бубырнадцатый раз повторю: GETCHAR() ЖДЕТ ПРИХОДА СИМВОЛА.
Да хоть в бубубубырнадцатый. Шо толку повторять, не разобравшись? Посмотри его первый пост, "листинг" программы. У него getchar() не стандартная библиотечная, а самопИсная, состоит из одного оператора return(UDR0). Естественно, что ЭТО никогда не будет работать как требуется. Даже если сделать циклический вызов, как выше рекомендовалось. Человеку лень прочитать не только даташит, посмотреть апноты по применею уарта, а вообще лень думать. На таких программо-пИсателей и время свое тратить не хочется .
Someone вне форума  
Непрочитано 14.02.2011, 13:22  
code-by
Прописка
 
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
code-by на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

функцию getchar я выложил специально в сокращенном виде.

если кому не нравится вот полный вариант:

Код:
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
   rx_buffer0[rx_wr_index0]=data;
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (++rx_counter0 == RX_BUFFER_SIZE0)
   {
      rx_counter0=0;     
      rx_buffer_overflow0=1; 
   };
}
}


#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
if (rx_counter0›0)
{
    data=rx_buffer0[rx_rd_index0];
    if (++rx_rd_index0 == RX_BUFFER_SIZE0) { rx_rd_index0=0; }
    #asm("cli")
    --rx_counter0;
    #asm("sei")    
    uart_data=1;
    return data;
}
else
{
    return '';
}
}
#pragma used-
#endif
тоже само и с main(). и так должно быть понятно что ТАМ ЕСТЬ WHILE.

Не знаю как у кого, у меня 0х0, 0x01, ... , 0x04 отправляет и принимает очень хорошо.

У кого замечания по коду - обращатся к разработчику CodeVision - это код их визарда uart.
code-by вне форума  
Непрочитано 14.02.2011, 23:27  
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от code-by Посмотреть сообщение
функцию getchar я выложил специально в сокращенном виде.
если кому не нравится вот полный вариант:
У кого замечания по коду - обращатся к разработчику CodeVision - это код их визарда uart.
Вот это уже совсем другое дело. Есть что обсуждать. Ну а по замечаниям по коду - листинг показывает уровень разработчиков, и соответственно качество компилятора. Почему? Да потому, что переменные data (но это еще куда не шло) и status объявляются как char, т.е. являются знаковыми. Соответственно, любой байт, больший 127 будет принят за отрицательное число. Последствий может и не быть, а могут быть самые разные . Конечно, может быть в кодевижне char принудительно сделан беззнаковым по умолчанию, но это противоречит стандарту С, и привыкнув так писать, легко поиметь проблемы на ровном месте с другими компиляторами и другими микроконтроллерами. Это раз. Второе - не использование указателей, соответственно объем кода. Он будет заметно больше, чем если использовать указатели. Третье - в getchar команды cli и sei нафиг не нужны, потому что ни на что не влияют, ведь даже если произойдет прерывание приема очередного байта перед декрементом счетчика принятых байт в буфере, то этот счетчик всего лишь увеличиться на еденицу, а очередной байт пойдет в буфер.
Someone вне форума  
Непрочитано 15.02.2011, 00:09  
Cybermaker
Вид на жительство
 
Регистрация: 21.08.2007
Сообщений: 318
Сказал спасибо: 12
Сказали Спасибо 67 раз(а) в 61 сообщении(ях)
Cybermaker на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от Someone Посмотреть сообщение
Да потому, что переменные data (но это еще куда не шло) и status объявляются как char, т.е. являются знаковыми. Соответственно, любой байт, больший 127 будет принят за отрицательное число.
Если вы про СИ - то там вообщет char приравнивается к int по длинне. И он точно не один байт. В С++ принято рассматривать char как uint8_t, то есть - байт. В этом коде - не совсем понятно что же автор действительно имел ввиду: Может ли return data =return '' ? Если может - то использование этой функции, при том что она не блокирующая, мне кажется весьма корявым.
Cybermaker вне форума  
 

Закладки

Метки
avr, mega, uart
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 14:27.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot