Как правильно (под O_CPU) прочитать СМС?
что так
Ql_SMSInitialize(); Ql_SetSMSFormat(QL_SMS_FMT_TXT); Ql_ReadSMS(sms_idx, &read_sms);
что эдак
AT+CMGF=1 AT+CMGR=1,0 или даже AT+CMGL="ALL"
в результате нет текстового режима +CMGR: "REC READ","94C6475627C6564735B435","","2011/10/31 13:44:59+16",208,64,0,8,"+79043490003",145,77 0053004D00530020043E0442043F044004300432043B0435043D043E0020
Тогда сам себе отвечаю
Полдня вчера просидел ломая голову. Подвела жадность. СМС посылал бесплатно с сайта ТЕЛЕ2 вот модуль и принимал всякую охинею ( хотя на трубку приходят как положено текстом ). С трубки на модуль все отсылается- получается отлично, в текстовом режиме.
CupuyC
Oct 31 2011, 15:10
Цитата(V125 @ Oct 31 2011, 13:05)

Как правильно (под O_CPU) прочитать СМС?
что так
Ql_SMSInitialize(); Ql_SetSMSFormat(QL_SMS_FMT_TXT); Ql_ReadSMS(sms_idx, &read_sms);
что эдак
AT+CMGF=1 AT+CMGR=1,0 или даже AT+CMGL="ALL"
в результате нет текстового режима +CMGR: "REC READ","94C6475627C6564735B435","","2011/10/31 13:44:59+16",208,64,0,8,"+79043490003",145,77 0053004D00530020043E0442043F044004300432043B0435043D043E0020
Тогда сам себе отвечаю
Полдня вчера просидел ломая голову. Подвела жадность. СМС посылал бесплатно с сайта ТЕЛЕ2 вот модуль и принимал всякую охинею ( хотя на трубку приходят как положено текстом ). С трубки на модуль все отсылается- получается отлично, в текстовом режиме.
Верно ли я Вас понял: Вы не можете прочитать СМС отправленную с сайта на модуль М10 в текстовом режиме?
Читая СМС что через ОЦПУ, что АТ командами результат одинаков.
1. Какая версия используемой прошивки? Попробую на ней, поскольку у меня на последней все нормально работает.
2. Вы шлете СМС кирилицей или англ. буквами?
На М12 тоже читает СМС:
Код
+CMGR: "REC READ","777","","2011/06/06 16:05:39+08"
Hello!
***
Besplatnye D-JINGLy! Zvonite 465!
Шлю текст английскими буквами, русскими и пытаться не стал. Если слать СМС с трубки (сразу не проверил) все отлично. Если с бесплатного сервиса ТЕЛЕ2 - приходит на модуль вереница циферок. Тоесть только PDU режим без вариантов. Попозжа проверю Мегафонов сервис. Модуль М12. Версия M12BR01A01N32_OCPU + моя писанина. Если подарите новую версию прошивки OCPU, буду признателен и неслыханно счастлив.
Видимо сервис передает в PDU режиме. Обычная трубка его преобразовывает в текст, а модуль не может.
Aleksandr_q
Oct 31 2011, 15:43
Запросите M12BR02A02N32_OCPU и OpenCPU_SDK_V3.3
Цитата(V125 @ Oct 31 2011, 19:30)

Шлю текст английскими буквами, русскими и пытаться не стал. Если слать СМС с трубки (сразу не проверил) все отлично. Если с бесплатного сервиса ТЕЛЕ2 - приходит на модуль вереница циферок. Тоесть только PDU режим без вариантов.
Скорее это юникод. Хотяб глазами в терминале попробуйте разобрать. Я сейчас ковыряюсь с квектелом с русскоязычными смс как раз с теле2 все нормально.
Даже если это Юникод (Bin,Hex,Dec,Oct) что я буду с ним делать? Так ведь хрен редьки не слаще. Там выше пример абракадабры, но я столько не выпью. Возможно другой оператор внесет ясность, но я полдня безуспешно бился с ТЕЛЕ2 и ничего не вышло.
Цитата(V125 @ Oct 31 2011, 20:05)

Даже если это Юникод (Bin,Hex,Dec,Oct) что я буду с ним делать? Так ведь хрен редьки не слаще. Там выше пример абракадабры, но я столько не выпью. Возможно другой оператор внесет ясность, но я полдня безуспешно бился с ТЕЛЕ2 и ничего не вышло.
О как. Ну если за полдня не вышло, значит не судьба.
Цитата(pau62 @ Oct 31 2011, 19:50)

Скорее это юникод. Хотяб глазами в терминале попробуйте разобрать. Я сейчас ковыряюсь с квектелом с русскоязычными смс как раз с теле2 все нормально.
Юникод, конечно. Первые 3 буквы не русские

а латинские: SMS
Дальше не стал разбирать. Наверное, сайт рекламу рус. дописывает, а если в смс есть хоть один русский символ, то, естественно, все в юникоде.
По поводу перекодировщика - это вообще не проблема, на этом форуме вопросы вроде обсуждались.
Каждый символ кодируется двумя байтами. Если первый байт 00, то это латиница, и второй байт определяет ascii-код символа.
Например 0053 - символ 0x53 - "S"
Таким образом, если Вы будете использовать СМС для управления и только в латинице, то самый примитивный алго видится таковым: если первые символы в скобках "00", то обрабатываем как юникод.
В этом случае сначала переводим в HEX по два символа (длина уменьшается в два раза.
Затем смотри по парам: если первый байт пары 0, то второй пишем в выходную строку.
Завершает строку нулем.
Т.о. останутся только латинские символы в виде c-строки.
Разобрались всем миром. Я даже и не подумал, что это может быть Юникодом. Вроде и перекодировать не сложно но пока не хоца, пока другие задачи.
Существует ли в ОЦПУ функция задержки наподобие delay_ms(); ?
Цитата(V125 @ Oct 31 2011, 21:11)

Разобрались всем миром. Я даже и не подумал, что это может быть Юникодом. Вроде и перекодировать не сложно но пока не хоца, пока другие задачи. Существует ли в ОЦПУ функция задержки наподобие delay_ms(); ?
Нет такой функции. Для этих целей можно написать свою функцию используя из time.h функцию, которая считает время. Вставить ее в цикл и получим delay().
Alechek
Nov 1 2011, 13:36
Цитата(CupuyC @ Nov 1 2011, 17:58)

Нет такой функции. Для этих целей можно написать свою функцию используя из time.h функцию, которая считает время. Вставить ее в цикл и получим delay().
В цикл?

А не подвесится весь модуль, если я сделаю, скажем, delay(10000ms) ?
Цитата(Alechek @ Nov 1 2011, 16:36)

В цикл?

А не подвесится весь модуль, если я сделаю, скажем, delay(10000ms) ?
Если у вас задача повесить модуль, то он конечно повесится. А если кодить понимая что и зачем делаешь...
Если надо защититься от криворукого програмиста, который может написать delay(1000000ms), то вставте в цинк одну строку с условием выхода из цикла, например если задано время задержки больше 1сек...
Цитата(Alechek @ Nov 1 2011, 17:36)

В цикл?

А не подвесится весь модуль, если я сделаю, скажем, delay(10000ms) ?
Там вообще-то есть Ql_Sleep
Модуль то не подвесится, хотя мне не приходило в голову проверять действие такой дичи.
Но это плохой стиль, нельзя так писать. Кучу евентов можно прозевать при таких писаниях.
/*****************************************************************
* Function: Ql_Sleep
*
* Description:
* Suspends the execution of the current task
* until the time-out interval elapses.
* Parameters:
* msec:
* The time interval for which execution is to
* be suspended, in milliseconds.
* Return:
* None
*****************************************************************/
void Ql_Sleep(u32 msec);
Но pau62 прав - евенты в оцпу обрабатываются поллингом, и пока Sleep работает, естественно, будут или пропущены, или, хуже того, переполнены (тоже не пробовал).
Sleep хороша для небольших задержек. Например, Stanley в своем екзампле софтовой реализации SPI использует Ql_Sleep(1) между дерганьем ног непосредсвенно записью в регистры ARM.
Я также использовал на старте своей программы Ql_Sleep(10) между командами настройки портов типа смены скорости и т.п.
Но если речь идет о больших интервалах, то это, естественно, абсурдно, т.к., боюсь, энергопотребление от этого не изменится.
Лучший способ, как на мой взгляд: настроить будильник и затем отключить модуль полностью с включением по будильнику. А еще надежнее - внешний PIC10, который будет этим заниматься.
ПС: по поводу вешанья - я такую задачу специально перед собой ставил, и не смог - не вешается он никак, а перезагружается.
А Stanley случаем не желает и нам показать свой софтовый SPI ? Очень хоца иметь уже готовый на вооружении. И не ради инженерного интереса (как где то в соседней ветке писали), а именно для копипаста.
Цитата(V125 @ Nov 1 2011, 21:27)

А Stanley случаем не желает и нам показать свой софтовый SPI ? Очень хоца иметь уже готовый на вооружении. И не ради инженерного интереса (как где то в соседней ветке писали), а именно для копипаста.

Уж не знаю, для чего может потребоваться софтовый SPI , в котором используются миллисекундные задержки.
И вот не понятно мне, Господа вообще чтоль в доки и примеры не смотрят?
У Квектела на эту тему как минимум 2 примера - про LCD и про собственно SPI, по-моему для обслуживания SD карты.
Первый я пробовал, он работоспособен, если делитель 4 не ставить, но это не квектеловская проблема имхо, а чипсетовая.
Во втором тоже грабель на первый взгляд не заметно.
Цитата
Очень хоца иметь уже готовый на вооружении
Хорошее оружие - это испытанное в бою оружие))))
Пробовать и обнюхивать надо, прежде чем применять.
А так этих софтовых спи в тырнете - граблями не сгрести. Да и сам принцип действия элементарен. Вовсе не обязательно заимствовать то, что написано для оцпу.
Достаточно просто в любом примере заменить процедуры типа " дернуть лапу вверх" на специфичные для контроллера.
Кстати, не пробовали в примере SPI тестировать остальные из 16 бит управляющего регистра из примера: в смысле, за какие ноги модуля они отвечают? У меня все руки не доходят.
Добавлено: сорри, сам уже нашел в sdconfig.h (заремлено, но понятно)
Медленный он, конечно. Сейчас хочу мини-роутер сделать: прикрутить по SPI езернет-контроллер ENC28J60, а на модуле поднять ppp из оцпу без стека, чтобы получать IP-пакеты с заголовком, менять IP и порты согласно таблице маппинга и отсылать в другой конец. Для моей задачи скорости хватит, но для серьезного обмена - врядли.
В LCD я пока не заглядывал, а вот эксемпла "про собственно SPI" в SDK у меня похоже нет. Видишь суслика? - Нет - И я не вижу. А он есть. Да писал я себе както софтовый под ТИНЮ85, но если за меня написали под ОЧПУ нафига мне тратить время и переписывать
Я только LCD от нокии прицепил.
по примерчику LCD.
Задача была проверить, нормально ли прицепится вся периферия для небольшой задачки.
Я с оцпу ковыряюсь недавно совсем.
А про регистры - это пример про SPI, я его не пробовал. насколько я понял, кроме тех 4 ног , этот регистр ничем не рулит.
Надо смотреть доки МТК.
Я рыть собираюсь в этом направлении, но сейчас другие проблемы на голову обрушились)))
PS установить бы еще соответствие между номерами GPIO по версии MTK и по Квектелу)))
Получается если во время отработки Ql_Sleep(u32 msec); придет событие СМС, то оно пропадет в небытие. pau62 уточните это уже проверено или предположение? Для чего нужен такой слип? Тогда как лучше укладывать модуль в спячку (под ОЦПУ), чтобы после просыпания моя СМСка принялась и обработалась?
Если в период спячки придет событие, то оно имхо никуда не денется, а вот если два - то у меня большие подозрения что первое потеряется. Собственно, проблема не в том, а в том, что , например, буффер принятых модемом или последовательным портом данных перезапишется.
Это только предположения, и, если я ошибаюсь, надеюсь, меня поправят. Это можно было и проверить, и я этим займусь, но просто сейчас другая работа навалилась.
Просто применение всяких Delay_ms ведет к написанию таких неэффективных поделок, что лучше сразу забыть о таком, если речь не о микросекундах.
Я тоже не проверял, но думаю аналогично - первое потеряется.
А какой смысл Вы видите в этой задержке? Т.е. чего Вы хотите добиться ее использованием?
Когда я делал на внешнем проце, то отправлял сообщения так (к синтаксису не придираться, может вырезал кривовато )
Код
printf("AT+CMGS=\"%s\"\n\r", ANumb);
delay_ms(200); //ждем >
printf("%s%c", Mess, CtrlZ);
Кстати если в ОЧПУ сделать по этому коду, то сообщение приходит почему то пустым, а на внешнем проце работает на ура. Задержка была нужна для ожидания символа приглашения > Теперь использовал встроенную ф-цию отправки и проблема отпала.
Код
Ql_sprintf(buf_num,"%s",ID_NUM_2); //определяем из СМС сообщения ID_NUM_2
Ql_SendTextSMS((u8*)(buf_num), (u8*)(buf_mess));
А все же как лучше укладывать модуль в спячку (под ОЦПУ) на час, на день?
Нигде не написано, что Sleep укладывает в спячку модуль, а не юэверьскую задачу.
Правильный метод - после отправки команды на передачу смс в евенте модемного порта проверять , не пришла ли эта галка, а когда пришла, передавать текст смс.
Как реально снижать потребление модуля под оцпу я тоже не разобрался пока.
Вот сейчас впервые подал питание через тестер (не включая кнопкой POWERKEY)- кажет 10миллиампер (как бы не мало), но в талмуде на модуль вроде бы указан 1 миллиампер. Или его нужно как то усыплять, чтоб получить 1мА.
10 mA - это с работающей задачей ОЦПУ? Или просто все отключено, а ток идет?
sleep ни в коей степени не укладывает сам модуль (GSM-часть) в спячку, для этого есть другие методы. А вот укладывает ли он в спячку задачу оцпу или просто делает задержку - надо пробовать по току потребления, я не могу сказать, т.к. пока не ставил задачей энергосбережение на своих разработках.
Цитата(V125 @ Nov 3 2011, 22:16)

Вот сейчас впервые подал питание через тестер (не включая кнопкой POWERKEY)- кажет 10миллиампер (как бы не мало), но в талмуде на модуль вроде бы указан 1 миллиампер. Или его нужно как то усыплять, чтоб получить 1мА.
Не включая? Странно очень. 1.5 ма жрет м75 в режиме спячки с сохранением регистрации в сети. Ну в моменты передачи конечно есть кратковременное повышение тока. (это не в опенцпу)
может это потребление демо-платы с ее стабилизаторами и драйверами портов?
Пардон накололся, еще MAX 3232 запитана, но у неё по ДШ 300 микроампер. Резать дорогу питания пока не буду.
Вот м10 и м12 не мерил, а м75 при работе вместе с внешним контроллером жрал у меня между сеансами передачи что-то около 13ма. Причем половину контроллер жрал.
Проверю еще раз конечно.
Каким обзазом порт DEBUG перестроить на 9600 (под ОЦПУ)?
Ql_SetUartBaudRate(ql_uart_port2,9600); - не помогает?
Я хочу прицепить GPS модуль на дебаг порт (на основном все нормально работает), и пытался изменить скорость именно так этой ф-цией. Но чего то не врублюсь. Данные с GPS модуля начинают поступать только после пересброса питания GPS модуля. Вот и уточнил. Может надо подтяжку RX к питанию соорудить??? Вот не принимает их Дебаг порт пока не передерну питание GPS.
Осцилом посмотреть бы.
А 3-й порт? Я в дебаг порт пока ничего не втыкал
Я пока не понял, что это за третий уарт, да и насчет ql_uart_port2 это Дебаг или не дебаг не уверен. Надо спросить у GeGeL. он разобрался с ними. Просто очень удобно GPS прицепить на дебаг, а с основного апгрейдиться.
если модуль боле-мене свежий, то 62pin -TXD3 63 - RXD3. Я им пользуюсь.
Работать с ним так же как и с 2-ым, только 3 вместо 2 писать.
В описании на М12, что у меня есть, порт 3 не упоминается, можно ДШ про М10 посмотреть. Если модуль старый, перепрошить можно попробовать.
В ДШ написано , что можно 2й порт использовать и как порт, и как дебаг порт, в зависимости от того как опции дебага установлены.
В тех примерах, что я смотрел, они установлены так, что не мешают использовать его как порт.
Может, и не стоит его под другие задачм использовать, мало-ли подебажить .
Можно и у первого объединить функции, просто глушить как-то передaчу с GPS по power key
Вот спасибо, подсказали про третий Уарт, я не доумился М10 доку посмотреть. А второй модемный порт это что такое? Я понимаю модемные порты просто мультиплексируются.
Не понимаю зачем он. Возможно при передачи данных в нем есть смысл.
P.S. имхо надо открывать какую-то тему про оцпу для чайников, а то тема про баги, а я что-то ничего в ней собственно про баги не нашел.
Тогда про баги, незнаю модуля или моих мозгов. Если я подключаю GPS модуль к основному порту -данные поперли , парсятся. Не выключая модуль перебрасываю GPSмодуль на Дебаг порт, тоже идут. Если же изначально подключить GPS на Дебаг-борода. Приходится "заводить" на основном и перебрасываться на Дебажный. Возможно существует какой то мне неизвестный приоритет обработки портов случаем EVENT_UARTDATA: Может надо как то принудительно включать Дебаг порт?
Это не баг.
Китайцы в своем трекере используют порт 3. Я использую порт 2 (out использую для дебаг в BASIC_MODE, in - для ввода GPS-данных). BASIC_MODE дебаг - это собствеенно обычный режим порта, никакого самопроизвольного дебага там нету, данные отправляются только при использовании функции Ql_DebugTrace. Ну, и Ql_SendToUart для него тоже работает, и евент по приему данных.
Выбор uart2 сделал из-за того, что в отличие от 1 и 3, в нем используется другой драйвер, и есть возможность задать Threshold по времени (в примере ниже - если аж 100 мс данных нет, то возникает евент). Это предупреждает деление входящих пакетов на части при "тормозах" в источнике. В GPS такого не наблюдал, а в сатресиверах - полно. И если нету хардверного трешхолда, то приходится писать процедуру объединения кусков с последовательных евентов, а это гимор.
Т.о., задав трешхолд, я в итоге при евенте от uart2 получаю ВСЮ ПАЧКУ NMEA (благо буфера 2048 хватает), и затем ищу, что надо (обычно GPRMC).
А то, что Вы описали, происходит из-за ошибок приема при старте по питанию источника (GPS-модуля). Их ОБЯЗАТЕЛЬНО надо очищать в евенте UARTFE!
Таких тонкостей в разработке софта множество, и именно они определяют качество работы устройства в большей степени, чем HW.
//на старте:
Ql_SetDebugMode(BASIC_MODE);
Ql_SetPortRts(ql_uart_port2, FALSE);
ret=Ql_SetUartBaudRate(ql_uart_port2,9600);
Ql_UartSetGenericThreshold(ql_uart_port2, TRUE, 512, 100);
Ql_UartGenericClearFEFlag(ql_uart_port2);
Ql_UartClrRxBuffer(ql_uart_port2);
Ql_SetPortRts(ql_uart_port2, TRUE);
//в обработчике евентов
case EVENT_UARTFE:
{
Ql_UartGenericClearFEFlag(ql_uart_port2);
}
break;
Спасибо, вроде понял. Хотя у меня GPS источник подключен постоянно, тоесть данные уже установились и прут. Вот поди попробуй сам все нюансы раскопать. ДШ всеже скудноват на пояснения.
Jawohl ! Alles in ordnung! Das ist phantastisch.
Для начинающих, испытывающих трудности с командной строкой:
Графическая оболочка для компиляции файла 'Example_helloworld.c' с папки 'Examle'
(используйте этот файл как main-файл вашего проекта, включая (include) в него другие необходимые c-файлы)
Скопируйте файлы manager.exe и timer.exe в папку размещения OpenCPU_SDK
Запустите manager.exe. Жмите кнопку 'Compile' для компиляции
После завершения компиляции (10-20 сек) будут отображены сообщения компилятора
После щелчка мышью по окну будет отображен лог компилятора (build.log),
строки с сообщениями об ошибках выделяются цветом.
Нацарапал вечером на скорую руку, если что - по ходу поправлю.
Цитата(GeGeL @ Nov 7 2011, 00:09)

Для начинающих, испытывающих трудности с командной строкой:
Надо SDK комплектовать этим менеджером. Только мне не зачто не удальсь бы в консоли набрать "helloWorld", да ещё с переключением регистра на заглавные буквы

. Поэтому я свою писанину загнал в example_at.c Теперь "make at" я набираю уже неглядя. Поэтому неначиначинающие, а просто замонавшиеся тарабанить в консоли могут скопипастить свои файлы в example_helloWorld.c и подменить #ifdef __EXAMPLE_HELLWORLD__ (а может и подменять не надо, я просто на всякий) Низкий Вам
GeGeL поклон от людей с перебинтоваными пальцами. А если еще Вы подправите, чтоб предупреждения выделялись желтым (как в анекдоте -не нравится желтая полоса зае...те зеленую).
Вот что интересно, я тож в этот ат все пишу. Потыркался проект с оригинальным именем создать - не вышло.
Пишу с помощью Notepad++, в нем же лог открыт постоянно. Компиляцию запускаю батником своим, чтоб 2 раза make не писать
Подменять ничего не надо - просто дописывать в HelloWorld свои процедуры.
Цитата(V125 @ Nov 7 2011, 10:00)

А если еще Вы подправите, чтоб предупреждения выделялись желтым (как в анекдоте -не нравится желтая полоса зае...те зеленую).
Желтую? Да никогда! Вобщем, зае...нил синюю...
Есть встроенная функция Ql_ReadADC. В упор не найду её "описание". Куда она возвращает считанные данные, какое Vref, как считать? Смутно догадываюсь, что надо читать ДШ на ARM7EJ, да вот не найду его никак.
Цитата
/******************************************************************************
* Function: Ql_ReadADC
*
* Description:
* Read the level value of adc pin.
*
* Parameters:
* adc_pin:
* [in] one value of 'QlADCPin'
*
* cb_adc:
* [in] callback, which will report the results.
* Return:
* QL_RET_OK indicates this function successes.
* Negative indicates failure. please see Error Code Definition.
******************************************************************************/
s32 Ql_ReadADC(QlADCPin adc_pin, OCPU_CB_READ_ADC cb_adc);
- из ql_pin.h
2800mv опора. а я вообще не знал что ацп помимо АТ команд читается, спасибо)))
есть АТ команды про ацп, там про опору и подтяжку на на ацп градусника есть
Спасибо. Тоже нашел, а то на терминал считывает, а куда возвращает данные непойму. Но кажется 2800mv это не опора, а MAX допустимая напруга на входе ADC
Запросите OPEN_CPU_DGD_V1.2.pdf из OpenCPU_SDK_V3.3, там добавлены почти все новые функции.
Что касается конкретно Ql_ReadADC, то одним из ее параметров есть указатель на callback-функцию, вызываемую ядром при завершении чтения. В нее и передается результат.
Причем это "нечестная" функция - она подает стандартную АТ-команду в служебный виртуальный порт, а при получении ответа вызывается callback с парсенным результатом.
Поэтому все опоры, тайминги и т.д. в точности совпадают с описанными для АТ-команды.
Мало того, при вызове Ql_ReadADC после чтения стандартный ответ на АТ-команду приходит ВО ВСЕ ОТКРЫТЫЕ порты модема, вызывая соответствующий евент.
Этим также балуются функции работы с смс (чтения, чтения списка).
Aleksandr_q
Nov 17 2011, 13:50
Уважаемые разработчики хочу вас поставить в известность о последних документах и прошивках OpenCPU
И так OPEN_CPU_DGD_V1.2
М12 с обычной памятью M12BR02A02N32_OCPU vs OpenCPU_SDK_V3.3
M12 c расширенной памятью M12BR03A01N128_OCPU
M12 c расширенной памятью + работа с SD картой M12BR02A02N128_OCPU_SD + спец SDK
Прошивки и документацию можно получить у официального дистрибьютора на территории России, Белоруссии и Украины - Rainbow Technologies,
http://www.rtcs.ru http://rainbow-m2m.com.ua
Как в OpenCPU производится запись/чтение энергонезависимой памяти модуля?