Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Приём данных по UART с ПК

Сообщений 121 страница 150 из 154

121

Sergik07 написал(а):

В мануале по командам сим900 всё это есть.

Что и требовалось доказать... ;)

+1

122

Nord написал(а):

Что и требовалось доказать...

Ну не хочет народ читать мануалы. Это нас учили рыться в библиотеке и искать там истину. :D
Не даром сложилась такая поговорка "Читай Маркса". :crazyfun:

Отредактировано sva-don (2019-03-21 08:54:21)

+2

123

Каким терминалом можно отправить очередью две строки 
+CCLK: "00/01/04,21:49:51+02"<\r><\n>
<\r><\n>
OK<\r><\n>  ?

Достал СИМ900.

0

124

olegkaras написал(а):

Каким терминалом можно отправить

Любым подручным.
Выключаете отправку служебных символов и отправляете только то, что наберете в строке отправки.

0

125

Для примера:
Terminal v1.9b - снимаете "галочки" CR=CR+LF и +CR

Я так на Nextion отправляю, т.к. он не понимает строки, которые НЕ оканчиваются на &HFF-&HFF-&HFF...

0

126

А я вообще в

Nord написал(а):

Terminal v1.9b

настройки не менял, практически никогда..
А Putty использовать?.. или COM Port Toolkit??
Очередь из двух строк должна быть с задержкой или нет?

Отредактировано sevastopolets (2019-03-27 02:01:18)

0

127

Задержки в сим900 вроде бы нет, мне нужно с имитировать ответ от модуля.

0

128

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>  то железо принимает данные с пропусками , где какие гайки подкрутить что - бы этого не было , в смысле было но то что нужно.

0

129

olegkaras написал(а):

+CCLK: "00/01/04,21:49:51+02"<\r><\n>

  o.O
Насколько я в теме понимаю это не команда, это ответ модуля.
Все команды начинаются с префикса АТ.

0

130

olegkaras написал(а):

+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>”. Тогда уж надо разбираться кто начудил. 8-)

Отредактировано sva-don (2019-03-28 09:50:12)

0

131

Я не ясно написал. Это ответ , я его терминалом отправляю атмеге128 этим я имитирую ответ от сим900. Если вначале присутствует <CR><LF> то атмега128 не успевает корректно принять ответ.

0

132

Потому что у тебя флаг запрета и в обработчик сообщения уходит, а данные все идут. В приемнике проверяй , если нет строки , то и обрабатывать нечего..

0

133

Yuriy.pv написал(а):

Потому что у тебя флаг запрета и в обработчик сообщения уходит, а данные все идут. В приемнике проверяй , если нет строки , то и обрабатывать нечего..

Строка есть , только в место положенного <\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)

0

134

При приеме строки указать обязательную минимальную длину приема более двух символов.
При парсинге эти символы обходить.

0

135

olegkaras
Все верно, ты выхватил 2 посылки,  если в буфере пусто не ставь флаг обработки.

Отредактировано Yuriy.pv (2019-03-28 17:21:35)

0

136

Я вам товарищи верю . Вот если бы вы мне показали в каком месте программы это сделать , а то я не могу понять как это реализовать.

0

137

ну на примере этого кода можно так..

Код:

Принятые_данные_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)

+1

138

Или так без других изменений.

Код:
If Принятый_код_символа_usart <> 13 Or Счетчик_принятых_символов < 2 Then

+1

139

Вот в примере от 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
Вообще перестало работать.

0

140

вы сильно спешите смешивать асм с васиком )) там же наверное при входе в обработчик регистры сохраняются..? а вы погнали прыгать как попало..

0

141

Yuriy.pv написал(а):

вы сильно спешите смешивать асм с васиком )) там же наверное при входе в обработчик регистры сохраняются..? а вы погнали прыгать как попало..

Исследование USART Вот этот пример , посмотрите пожалуйста , и подскажите как правильно , это я от без знания смешиваю асм с васиком.

0

142

Сообщение №5 по ссылке - там все разложено без Ассемблера.
Все обсуждения крутятся вокруг этого способа приема.
Что еще нужно ? ;)

0

143

Nord написал(а):

Сообщение №5 по ссылке - там все разложено без Ассемблера.
Все обсуждения крутятся вокруг этого способа приема.
Что еще нужно ?

Нужно способ из поста №5 где  все разложено без Ассемблера применить к посту №14 по ссылке где все на Ассемблере  8-)

0

144

Зачем это ?!  :canthearyou:  o.O
Масло смешать с маслом ? ;)
Работайте с одним из вариантов (на Bascom понятнее) и будет вам счастье...
Ну, разве что только связь со скоростью 100 Мбит/с... ;)

0

145

Вот упрямый человечище. 8-)
Пишу подробно, без 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

Куда ещё проще? :flag:

Отредактировано sva-don (2019-03-30 09:41:47)

0

146

Согласен, я проверю все это в железе , если будут работать два аппаратных УАРТ + один программный , значит моя проблема решена , спасибо что не проходите мимо  :rolleyes:

0

147

sva-don написал(а):

Вот упрямый человечище. 
Пишу подробно, без 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 .

0

148

Объявите в начале программы declare sub

0

149

olegkaras написал(а):

У меня баском ругается на строки Call ModemData и Sub Modemdata .

Замените:
Call ModemData на Gosub ModemData
Sub Modemdata на Modemdata:
End Sub на Return

Или, как Yuriy.pv сказал...

0

150

olegkaras написал(а):

У меня баском ругается на строки Call ModemData и Sub Modemdata .

Звиняйте, забыл написать, что я использую CONFIG SUBMODE = NEW
При этом все подпрограммы должны быть выше главного раздела, т.е. описаны до их использования и декларировать их не нужно. Просто я так привык.
При этом совсем необязательно использовать инструкцию CALL. Можно просто ModemData.
Только в этом случае п/п Sub ModemData нужно поставить перед меткой Main:
Я поправил свой пост.

Отредактировано sva-don (2019-03-30 09:37:19)

0