Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
11.02.2011, 11:21
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Отправка числа 0 (ноль) по уарту
при отправке чисел размерностью int и разделению их на char появляется, что старший байт = 0 (т.е. число 0x00AB надо отправить как 0x0 и 0xAB). на сколько я понимаю 0х0 по уарту не передается?
как лучше поступить в такой ситуации?
|
|
|
|
11.02.2011, 11:23
|
|
Частый гость
Регистрация: 26.03.2008
Сообщений: 43
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: отправка числа 0 (ноль) по уарту
почему? передается.....
|
|
|
|
11.02.2011, 11:29
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: отправка числа 0 (ноль) по уарту
да, отправляет (проверил в терминале на ПК). тогда может у меня ошибка в приеме на другом МК...
|
|
|
|
11.02.2011, 13:49
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: отправка числа 0 (ноль) по уарту
может проблема в приеме:
char getchar(void)
{
return UDR0;
}
main()
{
char s;
s=getchar();
if (s!='')
{ ... }
}
?
т.е. может при приеме 0 (0x0) получаем s='' ?
|
|
|
|
11.02.2011, 14:34
|
|
Прописка
Регистрация: 07.03.2009
Адрес: MN
Сообщений: 168
Сказал спасибо: 6
Сказали Спасибо 31 раз(а) в 21 сообщении(ях)
|
Re: отправка числа 0 (ноль) по уарту
Сообщение от code-by
|
(т.е. число 0x00AB надо отправить как 0x0 и 0xAB).
|
Почему 0x0? Собираетесь передавать полубайт? 0x00AB - это 0x00 (старший байт) и 0xAB (младший байт), хотя при присвоении какой-нибудь переменной компилятору будет всё-равно, 0x0 или 0x00.
__________________
- Квадрат - это тоже прямоугольник, только более квадратный и не такой вытянутый
- Двуугольник - это треугольник, только поломанный
- Одноугольника не видел
|
|
|
|
11.02.2011, 14:38
|
|
Прописка
Регистрация: 04.08.2006
Сообщений: 181
Сказал спасибо: 1
Сказали Спасибо 31 раз(а) в 31 сообщении(ях)
|
Re: отправка числа 0 (ноль) по уарту
А как еще отправить 0x00AB если не разделить на 2 char?
В качестве решения сделал битовую переменную которой присваивается 1 когда срабатывает прерывание по приему. В main() проверка чему равна эта переменная.
|
|
|
|
12.02.2011, 08:01
|
|
Частый гость
Регистрация: 26.03.2008
Сообщений: 43
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: отправка числа 0 (ноль) по уарту
т.е. может при приеме 0 (0x0) получаем s='' ?[/QUOTE]
ИМХО не очень корректно... Как вариант, при передаче все значения переводить в строку...
Типа 0x00AB перевести в 30 30 3А 3В и на входе парсить.
А такая проверка как у Вас ИМХО вернет пустую строку если принимается непечатный символ (например с кодом меньше 0х09)...
У меня были такие грабли...
Попробуйте принять значение 0x0404 например...
Последний раз редактировалось zms2003; 12.02.2011 в 08:05.
|
|
|
|
12.02.2011, 09:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от code-by
|
может при приеме 0 (0x0) получаем s=''
|
если мне не изменяет склероз и хелп ССS-a, то getchar() ЖДЕТ приема символа
Цитата:
|
This function waits for a character to come in over the RS232 RCV pin and returns the character
|
Поэтому пробуйте проверять бит готовности даных в приемнике.
Из того же источника
- это операция инверсии битов в переменной
попробуйте так:
кроме того, мне кажется не корректным сравнивать СИМВОЛ, с пустой СТРОКОЙ.
__________________
misterdi<@>i.ua
Последний раз редактировалось MisterDi; 12.02.2011 в 09:42.
|
|
|
|
12.02.2011, 11:41
|
|
Прописка
Регистрация: 09.11.2009
Сообщений: 179
Сказал спасибо: 44
Сказали Спасибо 58 раз(а) в 26 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от code-by
|
char getchar(void)
{
return UDR0;
}
main()
{
char s;
s=getchar();
if (s!='')
{ ... }
}
?
|
code-by, функция main() обычно служит для задания начальных установок после включения/перезагрузки микроконтроллера и выполняется только один раз.
разумнее код будет выглядеть так:
char getchar(void)
{
char s;
s = UDR0;
if (!(s='')) // это если верить написанному ранее
{ ... }
}
или так:
char getchar(void)
{
return UDR0;
}
main()
{
char s;
while()
{
s=getchar();
if (s!='')
{ ... }
delay_ms(100);
}
}
или воспользоваться прерыванием. CodeWisardAvr позволяет это сделать (если проект сделан под CV).
Последний раз редактировалось sersne; 12.02.2011 в 13:43.
|
|
|
|
12.02.2011, 11:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.01.2007
Сообщений: 3,123
Сказал спасибо: 61
Сказали Спасибо 1,153 раз(а) в 624 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от code-by
|
да, отправляет (проверил в терминале на ПК). тогда может у меня ошибка в приеме на другом МК...
|
Программа приема может воспринимать 0 как конец строки, поэтому, если позволяет время, делать так:
Сообщение от zms2003
|
Типа 0x00AB перевести в 30 30 3А 3В и на входе парсить.
|
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:18.
|
|