Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
12.02.2011, 18:50
|
|
Частый гость
Регистрация: 26.03.2008
Сообщений: 43
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от code-by
|
main()
{
char s;
s=getchar();
if (s!='')
{ ... }
}
|
Мож написать s!=0xFF...
Где 0xff - некое значение, которое никогда по уарту не придет))) и s всегда его присваивать после обработки))
Просто если принимать циферки, то парсеру довольно тяжело определить что в буфере пришел 0 если пустой буфер и так из нулей состоит.
Здесь нужно по прерыванию отлавливать прием... типа прерывание по Rx - подняли флаг... В проге ловим флаг и берем s... Но тогда можно пропустить следующий символ на приеме, если проц небыстрый)))
либо обрабатывать сразу в обработчике прерываний...
Но проще всего все же в строку перевести при передаче... ИМХО Как я выше сказал...
|
|
|
|
12.02.2011, 19:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
В бубырнадцатый раз повторю: GETCHAR() ЖДЕТ ПРИХОДА СИМВОЛА. ПОКА НЕ ПРИШЕЛ СИМВОЛ, НЕТ ВОЗВРАТА В ВЫЗЫВАЮЩУЮ ПРОГРАММУ! Используйте функцию запроса готовности, если это надо. И помните, в С проверка на равество пишется "==" а не "=", сам бывало спотыкался на этом.
__________________
misterdi<@>i.ua
|
|
|
|
12.02.2011, 20:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 28.02.2010
Сообщений: 2,297
Сказал спасибо: 53
Сказали Спасибо 461 раз(а) в 392 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от MisterDi
|
И помните, в С проверка на равество пишется "==" а не "=", сам бывало спотыкался на этом.
|
Очень много "невынужденных ошибок" - когда пишешь на разных языках. Для примера- как-то углядел - статью- Ошибки Синтаксиса Паскаля после С - и наоборот...довольно занимательно . (прилагаю- читать с 9 главы (старенькое конечно , но явности- так и прут))
Offtop конечно .. удалю позже.
Последний раз редактировалось OlegNZH; 12.02.2011 в 20:42.
|
|
|
|
12.02.2011, 21:02
|
|
Частый гость
Регистрация: 26.03.2008
Сообщений: 43
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от MisterDi
|
GETCHAR() ЖДЕТ ПРИХОДА СИМВОЛА.
|
Я просто этой функцией не пользовался никогда))) Я сам их пишу - по некоторым причинам не могу использовать всякого рода библиотеки)))
|
|
|
|
12.02.2011, 22:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
ИМХО хорошим тоном считается использование стандартных названий со стандартным смыслом. Конечно для самописных функций автор решает все. Прошу прощения за некоторую резкость.
__________________
misterdi<@>i.ua
|
|
|
|
12.02.2011, 23:28
|
|
Прописка
Регистрация: 02.01.2011
Сообщений: 159
Сказал спасибо: 8
Сказали Спасибо 32 раз(а) в 28 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Цитата:
|
т.е. может при приеме 0 (0x0) получаем s='' ?
|
Ест-но.
Я вообще не понял, к чему там написано if (s!='') { ... }
Да и
Цитата:
|
char getchar(void)
{
return UDR0;
}
|
Странный код, сначала нужно проверить статусный регистр на наличие принятого байта.
Цитата:
|
if (s!='') - это операция инверсии битов в переменной
|
Это где так?
Вообще задача стандартная, передать какие-то данные по RS-у.
Передавать их в чистом виде можно, если ошибки при передаче не играют особой роли. Ну например надо что-то во время отладки пару раз выдать на комп. В остальных случаях нужно делать какой-то протокол обмена.
Да вроду тут на форуме уже обсуждалось подобное.
|
|
|
|
13.02.2011, 01:24
|
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от MisterDi
|
В бубырнадцатый раз повторю: GETCHAR() ЖДЕТ ПРИХОДА СИМВОЛА.
|
Да хоть в бубубубырнадцатый. Шо толку повторять, не разобравшись? Посмотри его первый пост, "листинг" программы. У него getchar() не стандартная библиотечная, а самопИсная, состоит из одного оператора return(UDR0). Естественно, что ЭТО никогда не будет работать как требуется. Даже если сделать циклический вызов, как выше рекомендовалось. Человеку лень прочитать не только даташит, посмотреть апноты по применею уарта, а вообще лень думать. На таких программо-пИсателей и время свое тратить не хочется .
|
|
|
|
14.02.2011, 13:22
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
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.
|
|
|
|
14.02.2011, 23:27
|
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от code-by
|
функцию getchar я выложил специально в сокращенном виде.
если кому не нравится вот полный вариант:
У кого замечания по коду - обращатся к разработчику CodeVision - это код их визарда uart.
|
Вот это уже совсем другое дело. Есть что обсуждать. Ну а по замечаниям по коду - листинг показывает уровень разработчиков, и соответственно качество компилятора. Почему? Да потому, что переменные data (но это еще куда не шло) и status объявляются как char, т.е. являются знаковыми. Соответственно, любой байт, больший 127 будет принят за отрицательное число. Последствий может и не быть, а могут быть самые разные . Конечно, может быть в кодевижне char принудительно сделан беззнаковым по умолчанию, но это противоречит стандарту С, и привыкнув так писать, легко поиметь проблемы на ровном месте с другими компиляторами и другими микроконтроллерами. Это раз. Второе - не использование указателей, соответственно объем кода. Он будет заметно больше, чем если использовать указатели. Третье - в getchar команды cli и sei нафиг не нужны, потому что ни на что не влияют, ведь даже если произойдет прерывание приема очередного байта перед декрементом счетчика принятых байт в буфере, то этот счетчик всего лишь увеличиться на еденицу, а очередной байт пойдет в буфер.
|
|
|
|
15.02.2011, 00:09
|
|
Вид на жительство
Регистрация: 21.08.2007
Сообщений: 318
Сказал спасибо: 12
Сказали Спасибо 67 раз(а) в 61 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от Someone
|
Да потому, что переменные data (но это еще куда не шло) и status объявляются как char, т.е. являются знаковыми. Соответственно, любой байт, больший 127 будет принят за отрицательное число.
|
Если вы про СИ - то там вообщет char приравнивается к int по длинне. И он точно не один байт. В С++ принято рассматривать char как uint8_t, то есть - байт. В этом коде - не совсем понятно что же автор действительно имел ввиду: Может ли return data =return '' ? Если может - то использование этой функции, при том что она не блокирующая, мне кажется весьма корявым.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:27.
|
|