реклама на сайте
подробности

 
 
> USART запрос/ответ, как принять массив через функцию getchar() ?
mr_smit
сообщение Dec 17 2011, 17:20
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 22-07-09
Пользователь №: 51 457



Здравствуйте. Необходимо обмениваться данными с устройством. Каждые 250 мс необходимо отправить:
Запрос: 82 10 F1 21 01 A5
и получить:
Ответ: 80 F1 10 26 61 01 3B 90 41 04 00 00 00 00 47 80 00 00 00 52 52 80 18 00 8E 00 5C 00 00 00 00 00 00 00 00 00 FF FF DD A4 47 02 CE

Данные в ответе выделены зеленым (меняются). Длинна ответа не меняется. Как принять этот массив???

В CVAVR использую мастер начальной настройки. Там создается кольцевой буффер. Т.е. первый байт который попал в буффер первым из него и выйдет. Запрос этого байта через функцию getchar(). Никак не соображу как реализовать. Т.е. получается мне надо вызвать эту функцию "длинна массива" раз. Или создать ещё один промежуточный буффер и в него считывать при каждом вызове getchar() ? Или может какой алгоритм существует. Короче запутался.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mr_smit
сообщение Dec 18 2011, 18:20
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 22-07-09
Пользователь №: 51 457



AHTOXA, спасибо!!!!!
Код
void SendCommand (flash unsigned char *command)

Работает!!!
Код
flash unsigned char startCommunication[] = {0x81,0x10,0xf1,0x81,0x03,0};

Работает!!!!

А может можно как то переделать функцию SendCommand так чтобы не дописывать 0 в комманды? Просто я с этими указателями чего то путаюсь sad.gif

А вот этот кусок вообще не понимаю:
Код
while (*command) {}

каким макаром тут проверка на ноль идет blink.gif Это же указатель на первый элемент массива. Причем тут ноль?

P.S. Да, не сам писАл. Нашел пример.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 18 2011, 21:26
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(mr_smit @ Dec 18 2011, 20:20) *
А может можно как то переделать функцию SendCommand так чтобы не дописывать 0 в комманды? Просто я с этими указателями чего то путаюсь sad.gif


Переделать можно, например так:

Код
void SendCommand (unsigned char *command, unsigned char length) {
  while (length--) {
    while(!(UCSRA & (1<<UDRE)));  // ждем окончания передачи байта
    UDR = *command++;
  }
}


B вызывать соотв.:
Код
SendCommand(startCommunication, 5);



Цитата(mr_smit @ Dec 18 2011, 20:20) *
А вот этот кусок вообще не понимаю:
Код
while (*command) {}

каким макаром тут проверка на ноль идет blink.gif

P.S. Да, не сам писАл. Нашел пример.


*command = чтение байта по указателю command и если там 0, то получается while (0) - цикл заканчивается.

Цитата(mr_smit @ Dec 18 2011, 20:20) *
Это же указатель на первый элемент массива. Причем тут ноль?


На первый байт он указывал на входе в функцию.
Код:
Код
UDR = *command++;

означает, что в UDR пишется байт по указателю, затем указатель инкрементируется (++ - постинкремент).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- mr_smit   USART запрос/ответ   Dec 17 2011, 17:20
- - AHTOXA   Да, заведите второй буфер, для пакета. Заведите сч...   Dec 17 2011, 19:08
- - ILYAUL   80 F1 10 26 , а вот 0x26 это счётчик передаваемых ...   Dec 17 2011, 20:33
|- - mr_smit   Цитата(ILYAUL @ Dec 17 2011, 23:33) 80 F1...   Dec 17 2011, 21:24
|- - AHTOXA   Кольцевой буфер оставьте, он вам никак не мешает. ...   Dec 18 2011, 05:13
- - mr_smit   Просто я не понимаю каким образом мне вызывать get...   Dec 18 2011, 06:24
- - mr_smit   В общем убрал кольцевой буффер и сделал вот так: К...   Dec 18 2011, 09:07
- - mr_smit   И еще: Кодunsigned char startCommunication[...   Dec 18 2011, 12:14
- - AHTOXA   Цитата(mr_smit @ Dec 18 2011, 15:07) Выда...   Dec 18 2011, 14:06
|- - AHTOXA   Цитата(mr_smit @ Dec 19 2011, 00:20) А во...   Dec 18 2011, 21:06
- - sigmaN   ЦитатаКодwhile (*command) {} там наверно д...   Dec 18 2011, 20:39
- - mr_smit   Ну примерно понял. Спасибо. И ещё. Как лучше орган...   Dec 19 2011, 07:48
- - sigmaN   ЦитатаЗавести переменную битовую как флаг разрешен...   Dec 19 2011, 08:16
- - mr_smit   Цитата(sigmaN @ Dec 19 2011, 11:16) Вот т...   Dec 19 2011, 08:48
- - mr_smit   У меня тут вопрос появился. Нигде не смог найти т...   Dec 20 2011, 11:07
- - toweroff   как обычно, наверное... знаковый байт, старший бит...   Dec 20 2011, 12:17
- - mr_smit   Ладно, мне надо вычесть 40. Т.е. 40 dec в hex буде...   Dec 20 2011, 17:35
|- - Палыч   Цитата(mr_smit @ Dec 20 2011, 21:35) Ладн...   Dec 20 2011, 17:56
|- - toweroff   Цитата(mr_smit @ Dec 20 2011, 21:35) Кодi...   Dec 20 2011, 18:48
- - mr_smit   Цитата(toweroff @ Dec 20 2011, 21:48) а н...   Dec 20 2011, 19:27
|- - toweroff   Цитата(mr_smit @ Dec 20 2011, 23:27) Реши...   Dec 20 2011, 19:44
- - mr_smit   Цитата(toweroff @ Dec 20 2011, 15:17) ......   Dec 20 2011, 19:51
- - XVR   Жуть, столько телодвижений вместо того, что бы про...   Dec 21 2011, 11:18
|- - toweroff   Цитата(XVR @ Dec 21 2011, 15:18) signed c...   Dec 21 2011, 11:57
- - mr_smit   Цитата(XVR @ Dec 21 2011, 14:18) Жуть, ст...   Dec 21 2011, 18:10
|- - toweroff   Цитата(mr_smit @ Dec 21 2011, 22:10) А в ...   Dec 21 2011, 18:14
|- - _Артём_   Цитата(mr_smit @ Dec 21 2011, 20:10) Спас...   Dec 21 2011, 21:09
- - mr_smit   Просто вроде как sizeof должна возвращать длину ма...   Dec 21 2011, 22:03
|- - _Артём_   Цитата(mr_smit @ Dec 22 2011, 00:03) Прос...   Dec 21 2011, 23:11
|- - XVR   Цитата(_Артём_ @ Dec 22 2011, 03:11) Но в...   Dec 22 2011, 10:24
- - mr_smit   Всем спасибо!   Dec 22 2011, 19:31


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 11:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.014 секунд с 7
ELECTRONIX ©2004-2016