В мануале по командам сим900 всё это есть.
Что и требовалось доказать... 
Программирование ATMEL в BASCOM. |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » Приём данных по UART с ПК
В мануале по командам сим900 всё это есть.
Что и требовалось доказать... 
Что и требовалось доказать...
Ну не хочет народ читать мануалы. Это нас учили рыться в библиотеке и искать там истину. 
Не даром сложилась такая поговорка "Читай Маркса". 
Отредактировано sva-don (2019-03-21 08:54:21)
Каким терминалом можно отправить очередью две строки
+CCLK: "00/01/04,21:49:51+02"<\r><\n>
<\r><\n>
OK<\r><\n> ?
Достал СИМ900.
Каким терминалом можно отправить
Любым подручным.
Выключаете отправку служебных символов и отправляете только то, что наберете в строке отправки.
Для примера:
Terminal v1.9b - снимаете "галочки" CR=CR+LF и +CR
Я так на Nextion отправляю, т.к. он не понимает строки, которые НЕ оканчиваются на &HFF-&HFF-&HFF...
А я вообще в
Terminal v1.9b
настройки не менял, практически никогда..
А Putty использовать?.. или COM Port Toolkit??
Очередь из двух строк должна быть с задержкой или нет?
Отредактировано sevastopolets (2019-03-27 02:01:18)
Задержки в сим900 вроде бы нет, мне нужно с имитировать ответ от модуля.
sevastopolets спасибо товарищ , COM Port Toolkit с этим терминалом мне удалось с имитировать передачу от СИМ900.
sasha_1973 - Вам вопрос по вашему примеру. Если я с терминала в железо отправляю +CCLK: "00/01/04,21:49:51+02"<\r><\n> все работает четко , а если так как по факту отправляет
СИМ900 <\r><\n>+CCLK: "00/01/04,21:49:51+02"<\r><\n> то железо принимает данные с пропусками , где какие гайки подкрутить что - бы этого не было , в смысле было но то что нужно.
+CCLK: "00/01/04,21:49:51+02"<\r><\n>
Насколько я в теме понимаю это не команда, это ответ модуля.
Все команды начинаются с префикса АТ.
+CCLK: "00/01/04,21:49:51+02"<\r><\n>
<\r><\n>
OK<\r><\n> ?
Олег, это не команда. Это ОТВЕТ от модуля.
Такая команда выглядит вот так: AT+CCLK? и просит сеть выдать время и дату.
На неё модуль должен ответить строкой: +CCLK:<time> OK, где строка time выглядит следующим образом: "yy/MM/dd,hh:mm:ss±"
Строка time придёт только тогда, когда сеть поддерживает выдачу клиентам текущего времени и даты, в противном случае ответ будет просто ОК.
Структура ответа всегда вот такая:
<CR><LF>+CMD1:<parameters><CR><LF>
<CR><LF>OK<CR><LF>
или
<CR><LF><parameters><CR><LF>
<CR><LF>OK<CR><LF>
Забыл написать, что ответ может быть и таким:
"ERROR" или “+CME ERROR:<err>”. Тогда уж надо разбираться кто начудил. 
Отредактировано sva-don (2019-03-28 09:50:12)
Я не ясно написал. Это ответ , я его терминалом отправляю атмеге128 этим я имитирую ответ от сим900. Если вначале присутствует <CR><LF> то атмега128 не успевает корректно принять ответ.
Потому что у тебя флаг запрета и в обработчик сообщения уходит, а данные все идут. В приемнике проверяй , если нет строки , то и обрабатывать нечего..
Потому что у тебя флаг запрета и в обработчик сообщения уходит, а данные все идут. В приемнике проверяй , если нет строки , то и обрабатывать нечего..
Строка есть , только в место положенного <\r><\n>+CCLK: "00/01/04,21:49:51+02"<\r><\n> принимается примерно <\r><\n>+CK: "00/01/04,21:49:51+02"<\r><\n> , в таком слючае нужно что бы флаг не уходил пропустить первые <\r><\n> а определять конец строки и перевод коретки по <\r><\n> которые приходят в конце а те что приходят в начале <\r><\n> - нужно игнорировать , пройти мимо (додать к строке ).
Отредактировано olegkaras (2019-03-28 13:55:49)
При приеме строки указать обязательную минимальную длину приема более двух символов.
При парсинге эти символы обходить.
olegkaras
Все верно, ты выхватил 2 посылки, если в буфере пусто не ставь флаг обработки.
Отредактировано Yuriy.pv (2019-03-28 17:21:35)
Я вам товарищи верю . Вот если бы вы мне показали в каком месте программы это сделать , а то я не могу понять как это реализовать.
ну на примере этого кода можно так..
Принятые_данные_usart:
'-------------------------------------------------------------------------------
Принятый_код_символа_usart = Udr0 ' Забираем содержимое аппаратного буфера USART
If Принятый_код_символа_usart <> 13 Then ' Проверяем, не является ли этот символ "Enter"
Буфер_приема_usart_str = Буфер_приема_usart_str + Chr(принятый_код_символа_usart) ' Если нет, то добавляем его в буфер принятого по USART сообщения
Incr Счетчик_принятых_символов ' Считаем количество принятых символов
Else ' Иначе выключаем приём и ставим метку, что приём закончен (принято всё сообщение), можно что-то делать с принятым
if Incr Счетчик_принятых_символов > 2 then
Disable Urxc ' Выключаем приём, пока не обработаем принятое сообщение
Счетчик_принятых_символов = 0 ' Сбрасываем счётчик символов, готовим к следующему приёму
Флаг_есть_принятое_сообщ_usart = 1 ' Если символ оказался "Enter", тогда флаг устанавливаем в 1. "Enter"- конец сообщения
End If
End If
'-------------------------------------------------------------------------------
Return
Отредактировано Yuriy.pv (2019-03-28 17:24:13)
Или так без других изменений.
If Принятый_код_символа_usart <> 13 Or Счетчик_принятых_символов < 2 Then
Вот в примере от sasha_1973 есть такие строки , как их подкорректировать ?
!cpi R17 , 13 'Если приняли ""конец строки" "
!BREQ Exit_input_data_usart
!cpi R17 , 10 'Если приняли "перевод каретки"
!Breq Copy_bufer_usart 'Input_sumbol
Я пробовал заменить на
!cpi R17 , 13 'Если приняли ""конец строки" "
If Подхват_13 = 1 Then
!BREQ Exit_input_data_usart
Подхват_13 = 0
Else
!BREQ Perehod_13
End If
!cpi R17 , 10 'Если приняли "перевод каретки"
If Подхват_10 = 1 Then
!Breq Copy_bufer_usart 'Input_sumbol
Подхват_10 = 0
Else
!BREQ Perehod_10
End If
Perehod_13:
Подхват_13 = 1
Return
Perehod_10:
Подхват_10 = 1
Return
Вообще перестало работать.
вы сильно спешите смешивать асм с васиком )) там же наверное при входе в обработчик регистры сохраняются..? а вы погнали прыгать как попало..
вы сильно спешите смешивать асм с васиком )) там же наверное при входе в обработчик регистры сохраняются..? а вы погнали прыгать как попало..
Исследование USART Вот этот пример , посмотрите пожалуйста , и подскажите как правильно , это я от без знания смешиваю асм с васиком.
Сообщение №5 по ссылке - там все разложено без Ассемблера.
Все обсуждения крутятся вокруг этого способа приема.
Что еще нужно ? 
Сообщение №5 по ссылке - там все разложено без Ассемблера.
Все обсуждения крутятся вокруг этого способа приема.
Что еще нужно ?
Нужно способ из поста №5 где все разложено без Ассемблера применить к посту №14 по ссылке где все на Ассемблере 
Зачем это ?!
Масло смешать с маслом ? 
Работайте с одним из вариантов (на Bascom понятнее) и будет вам счастье...
Ну, разве что только связь со скоростью 100 Мбит/с... 
Вот упрямый человечище.
Пишу подробно, без ASM.
CONFIG SUBMODE = NEW
Конфигурируем порт:
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config SERIALIN = BUFFERED , size = 50 'Размер выбирается такой, как нужно. Для примера 50, но не более 255
Подпрограмма приёма строки:
Sub Modemdata
StrRS = ""
While _RS_HEAD_PTR0 <> _RS_TAIL_PTR0 'Проверка кольцевого буфера. Цикл будет работать пока не совпадут указатели начала и конца буфера, что означает полную выборку из него.
Rs = Inkey()
If Asc(Rs) > 32 Then 'Отсекаем ненужные символы
StrRS = StrRS + Rs 'Формируем строку
End If
Waitms 10
Wend
End Sub
Определяем переменные:
Dim StrRS As String * 50 'Сама строка с длиной равной объёму буфера
Dim RS As String * 1 'Переменная для чтения символа из буфера
Dim FlagStr As Byte
Сама программа чтения:
Main:
FlagStr = Ischarwaiting() 'Если пришёл ответ от модуля
If FlagStr = 1 Then
ModemData
End If
CLEAR SERIALIN 'На всякий случай чистим буфер
(Здесь разбираем команду на запчасти)
CONFIG POWERMODE = IDLE 'Уснём
GoTo Main
Stop
Куда ещё проще? 
Отредактировано sva-don (2019-03-30 09:41:47)
Согласен, я проверю все это в железе , если будут работать два аппаратных УАРТ + один программный , значит моя проблема решена , спасибо что не проходите мимо 
Вот упрямый человечище.
Пишу подробно, без ASM.Конфигурируем порт:
Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config SERIALIN = BUFFERED , size = 50 'Размер выбирается такой, как нужно. Для примера 50Определяем переменные:
Dim StrRS As String * 50 'Сама строка
Dim RS As String * 1 'Переменная для чтения символа из буфера
Dim FlagStr As ByteСама программа чтения:
Main:FlagStr = Ischarwaiting() 'Если пришёл ответ от модуля
If FlagStr = 1 Then
Call ModemData
End If
CLEAR SERIALIN 'На всякий случай чистим буфер
(Здесь разбираем команду на запчасти)CONFIG POWERMODE = IDLE 'Уснём
GoTo Main
StopПодпрограмма приёма строки:
Sub Modemdata
StrRS = ""
While _RS_HEAD_PTR0 <> _RS_TAIL_PTR0 'Проверка кольцевого буфера
Rs = Inkey()
If Asc(Rs) > 32 Then 'Отсекаем ненужные символы
StrRS = StrRS + Rs 'Формируем строку
End If
Waitms 10
Wend
End SubКуда ещё проще?
Отредактировано sva-don (Сегодня 08:13:52)
У меня баском ругается на строки Call ModemData и Sub Modemdata .
Объявите в начале программы declare sub
У меня баском ругается на строки Call ModemData и Sub Modemdata .
Замените:
Call ModemData на Gosub ModemData
Sub Modemdata на Modemdata:
End Sub на Return
Или, как Yuriy.pv сказал...
У меня баском ругается на строки Call ModemData и Sub Modemdata .
Звиняйте, забыл написать, что я использую CONFIG SUBMODE = NEW
При этом все подпрограммы должны быть выше главного раздела, т.е. описаны до их использования и декларировать их не нужно. Просто я так привык.
При этом совсем необязательно использовать инструкцию CALL. Можно просто ModemData.
Только в этом случае п/п Sub ModemData нужно поставить перед меткой Main:
Я поправил свой пост.
Отредактировано sva-don (2019-03-30 09:37:19)
Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » Приём данных по UART с ПК