Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

У меня модули передают измеренные данные с прибора и текущие координаты на сервер.
В программе прописан алгоритм соединения с сервером, передача пакета (256-512байт) на сервер получение подтвеждения приема от сервера переход в ожидания новой порции данных от прибора.
собственно все по ДШ и семплам от производителя.
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт май 24, 2012 09:19:34
Откуда: Ярославль

Сообщение holy_0dmin »

Pavel_1978 писал(а):У меня модули передают измеренные данные с прибора и текущие координаты на сервер.
В программе прописан алгоритм соединения с сервером, передача пакета (256-512байт) на сервер получение подтвеждения приема от сервера переход в ожидания новой порции данных от прибора.
собственно все по ДШ и семплам от производителя.
Так вот я и хочу узнать как именно написано у вас. Не код, а описание алгоритма, наподобие того, что я сделал в первом сообщении.
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 830
Зарегистрирован: Пт ноя 16, 2007 11:21:37

Сообщение Pavel_1978 »

1. включаю модуль жду от него готовность.
2. передаю АТЕ) чтоб отрубить эхо.
3. проверяю регистрацию и уровень сигнала сети.
в это время отупляется GPS
4. в зависимости от оператора подключаю GPRS и проверяю выданый IP
5. включаю TCP соединение с сервером.
после каждого пакета запращиваю статус соединения...
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт май 24, 2012 09:19:34
Откуда: Ярославль

Сообщение holy_0dmin »

Pavel_1978
Так, уже лучше. Но это общая последовательность, а меня интересует алгоритм с учетом архитектуры AVR, т.е. бесконечный главный цикл, прием данных по UART через прерывания и т.п.
Допустим, отправили команду. Дальше что? Цикл, в котором собираем по символам строку ответа и смотрим, всё ли правильно?
Или в прерывании посимвольно собирается строка ответа и потом каким-то образом определяется на какой именно запрос был ответ?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Здравствуйте!
Скажите, а как в текстовую строку подставить препроцессорную константу?
В девайсе есть строка, определяющая его название и двухзначный номер. Вот как всунуть туда этот номер, определенный через #define ?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Вложенным макросом через конкатерацию строк попробуй
Fucking static initialization order fiasco
Контактная информация:
Реклама
aam
Собутыльник Кота
Аватара пользователя
Сообщения: 2994
Зарегистрирован: Сб фев 20, 2010 14:00:12
Откуда: Москва

Сообщение aam »

Пытался писать так:

Код: Выделить всё

#define LD_NUM 3
#define TO_STR(s) # s
#define CONCAT_STR(a, b) a ## b
char const str_Dev_Info[]=TO_STR(CONCAT_STR(MDIOv1.0 LD, LD_NUM));
В итоге выводится строка

Код: Выделить всё

CONCAT_STR(MDIOv
(...закончился индикатор)
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Это по макросам
Конкатенацию нужно во внешний макрос пихать, чтобы она первой выполнялась. Если так попробовать?:

Код: Выделить всё

#define LD_NUM 3
#define TO_STR(s) # s
#define CONCAT_STR(a, b, c) a ## b ## c
char const str_Dev_Info[]=CONCAT_STR(<TO_STR(MDIOv1.0 LD,>,LD_NUM,<)>)
Точно не помню, как запятую и скобку в аргумент макроса вкорячить, если не получится, как я написал - можно скобку и запятую тоже через макросы определить
Fucking static initialization order fiasco
Контактная информация:
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

Код: Выделить всё

#define LD_NUM 3
#define str(s) #s
#define TO_STR(s) str(s)
char const str_Dev_Info[]= "MDIOv1.0 LD" TO_STR(LD_NUM);
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

В последнем варианте 2 и 3 строки можно объединить в одну.
Контактная информация:
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

если делать вот так:

Код: Выделить всё

#define LD_NUM 3
#define TO_STR(s) # s
char const str_Dev_Info[]= "MDIOv1.0 LD" TO_STR(LD_NUM);
то получится MDIOv1.0 LDLD_NUM вместо MDIOv1.0 LD3
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

a_skr, в Вашем случае тоже также получится. Т.к. TO_STR(LD_NUM) превратиться в #LD_NUM, затем в исходный код подставится "LD_NUM", за место ожидаемого "3".

А

Код: Выделить всё

#define TO_STR(s) str(s)
вообще бессмысленный макрос. Он будет просто клонировать один в один.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

a_skr писал(а):если делать вот так:
Да, это всё странно, но, похоже, Вы были правы:

Код: Выделить всё

wiselord@wiselord home $ cat q.c 
#define LD_NUM 3
#define TO_STR(s) #s
char const str_Dev_Info[]= "MDIOv1.0 LD" TO_STR(LD_NUM);

wiselord@wiselord home $ gcc -E q.c 
# 1 "q.c"
# 1 "<command-line>"
# 1 "q.c"

char const str_Dev_Info[]= "MDIOv1.0 LD" "LD_NUM";



wiselord@wiselord home $ cat q.c 
#define LD_NUM 3
#define str(s) #s
#define TO_STR(s) str(s)
char const str_Dev_Info[]= "MDIOv1.0 LD" TO_STR(LD_NUM);

wiselord@wiselord home $ gcc -E q.c 
# 1 "q.c"
# 1 "<command-line>"
# 1 "q.c"

char const str_Dev_Info[]= "MDIOv1.0 LD" "3";
Последний раз редактировалось WiseLord Чт июн 26, 2014 14:02:26, всего редактировалось 5 раз.
Контактная информация:
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

Аlex писал(а):...вообще бессмысленный макрос. Он будет просто клонировать один в один.
Если бы не проверял, не написал бы сюда. Проверено в C++ Builder и avr-gcc.

ps. Вот, по ссылке с предыдущей страницы:
Существует также еще один случай, когда применяется второй проход. Его можно использовать для подстановки аргумента с его последующей стрингификацией при использовании двухуровневых макросов. Добавим макрос 'xstr' к рассмотренному выше примеру:
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
xstr (foo)
Здесь значение 'xstr' заменяется на '"4"', а не на '"foo"'. Причиной этому служит то, что аргумент макроса 'xstr' заменяется при первом проходе (так как он не использует стрингификацию или объединение аргумента). В результате первого прохода формируется аргумент макроса 'str'. Он использует свой аргумент без предварительного просмотра, так как здесь используется стрингификация.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Код: Выделить всё

#define LD_NUM 3
#define TO_STR(s) #s
char const str_Dev_Info[]= "MDIOv1.0 LD" TO_STR(LD_NUM);
Этот код не работает, потому что препроцессор, видимо, работает как-то так (двигаемся по тексту слева направо):

Код: Выделить всё

char const str_Dev_Info[]= "MDIOv1.0 LD" TO_STR(LD_NUM);
char const str_Dev_Info[]= "MDIOv1.0 LD" #LD_NUM;
char const str_Dev_Info[]= "MDIOv1.0 LD" "LD_NUM";
А в случае варианта

Код: Выделить всё

#define LD_NUM 3
#define str(s) #s
#define TO_STR(s) str(s)
- как-то так:

Код: Выделить всё

char const str_Dev_Info[]= "MDIOv1.0 LD" TO_STR(LD_NUM);
char const str_Dev_Info[]= "MDIOv1.0 LD" str(LD_NUM);
char const str_Dev_Info[]= "MDIOv1.0 LD" str(3);
второй проход с начала, так как остались необработанные директивы препроцессора (возвращаемся к str):

Код: Выделить всё

char const str_Dev_Info[]= "MDIOv1.0 LD" #3;
char const str_Dev_Info[]= "MDIOv1.0 LD" "3";
P.S. Смотрю, Вы тоже дополнили своё сообщение ссылкой на второй проход.
Контактная информация:
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

прошу прощения, если я не в тот раздел спрашиваю, но мучаюсь уже три дня, перерыл весь гугл, не могу понять, как в си узнать размер массива в eeprom
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Размер массива Вы должны знать заранее, сами. Там этот размер нигде не указывается. Поконкретнее вопрос можно сформулировать? Какая задача перед Вами стоит?
Fucking static initialization order fiasco
Контактная информация:
Опытный кот
Сообщения: 884
Зарегистрирован: Пн июл 08, 2013 22:59:45

Сообщение kelod »

делаю термометр на терморезисторе, следовательно нужно знать зависимость сопротивления от температуры, это храню массивом, а что бы была возможность поменять резистор и не перепрошивать контроллер, храню массив в eeprom, плюс количество точек в графиках зависимостей может быть различно, поэтому задаю его самостоятельно, при создании массива, а вот при чтении нужно узнать размер массива в eeprom, можно конечно создать отдельную переменную, но я думал можно узнать количество элементов, как это есть в обычном си
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Проще всего и лучше по быстродействию задействовать отдельную ячейку EEPROM (самую первую или самую последнюю) со значением размера массива. Иначе количество элементов можно узнать только перебором значений и сравнений их со значением стертой ячейки EEPROM, но при этом можно ошибиться (если значение массива совпадет со значением стертой ячейки).
Последний раз редактировалось Pink-Pank Пт июн 27, 2014 09:59:10, всего редактировалось 2 раза.
Fucking static initialization order fiasco
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

kelod писал(а):это храню массивом... задаю его самостоятельно, при создании массива
Приведите код, который вы пишете для этого. Я вам покажу, где там размер массива.
Ставим плюсы: )
Ответить

Вернуться в «Разные вопросы по МК»