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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Использование модуля SIM800l


Использование модуля SIM800l

Сообщений 1 страница 30 из 224

1

Всем доброго времени суток.
Вопрос не один. Постараюсь задать последовательно.
На форуме очень много знатоков по работе с USART. Подход к SIM80l взял с чужой программы еще 3 года назад. Использую как кирпичики. Заметил многие это делают до сих пор.

Код:
'подпрограмма для разбора сообщения модуля
'=============================================================================
Sub Getline(s As String)
   S = ""
   Do
      Buf = Inkey()                                         'берем символ из буфера в формате ASCII
      Select Case Buf
 '         Case 0 : S = ""
 '         Case 13 : S = ""
          Case 10 : If S <> "" Then Exit Do                 'конец строки, значит выходит из подпрограммы
          Case Else : If Buf > 31 Then S = S + Chr(buf)     'печатаемые символы начинаются с кода 32 по таблице АСКИ, из них составляем строку
      End Select
  Loop
End Sub
'=========очистка буфера====================================================================
Sub Flushbuf()
 Waitms 100
 Do
 Buf = Inkey()                                              'забираем все из буфера
 Loop Until Buf = 0
End Sub

Суть первого вопроса.
Запрос баланса по USSD.

Код:
'узнаем баланс
'=================================================================================
Balanse:
  Print "AT+CUSD=1,{034}*105#{034}"
  Wait 1
  Getline Sk
  Getline Sk
  Getline Sk
  Getline Sk
  Getline Sk
  Waitms 100

  Gosub Баланс
'  Otvet = Sk
'  Print "Sk " ; Sk
'  Wait 1
'  Gosub Sendsms
  Flushbuf
Return

Это оператор ТЕЛЕ2. С МТС немного проще. Если задать "#100#", ответ придет на транслит. Передать его обратно нет труда. Но в данном случае ответ приходит в кодировке ACS2.
Простой подход дает результаты, но не стабильно. Иногда промахивается с началом цифровых символов.

Код:
'========Баланс==================================================================================
Баланс:
   Bred = Mid(sk , 12 , 128)
    Sim = 1
    Otvet = ""
    For Bal = 0 To 32
     Sim_str = Mid(bred , Sim , 4)
    Select Case Sim_str
      Case "0030" : Cifra = "0"
      Case "0031" : Cifra = "1"
      Case "0032" : Cifra = "2"
      Case "0033" : Cifra = "3"
      Case "0034" : Cifra = "4"
      Case "0035" : Cifra = "5"
      Case "0036" : Cifra = "6"
      Case "0037" : Cifra = "7"
      Case "0038" : Cifra = "8"
      Case "0039" : Cifra = "9"
      Case "002E" : Cifra = "."
      Case "002C" : Cifra = "."
    End Select
      Otvet = Otvet + Cifra
      Sim = Sim + 4
      Cifra = ""
    Next Bal

    Otvet = "Balans:" + Otvet
  Gosub Sendsms

Return

Подскажите. Как привязаться именно к цифровым символам? Или лучше. Начать брать символы после".

0

2

rom-i написал(а):

Но в данном случае ответ приходит в кодировке ACS2.

Что понимается под выделенным ? ;)
ASCII или юникод USC2 ?

0

3

Код:
Print "ATE0"                                            'без эха
Print "ATV0"                                                     'не текстовый ответ
Print "AT+CMEE=0"                                           'краткие ошибки
Print "AT+CMGF=1"                                           'текстовый формат СМС
Print "AT+CSCS=" ; Chr(34) ; "UCS2" ; Chr(34)               'смс в UCS2
Print "AT+CSMP=17,167,0,25"                           'Уже не помню для чего

СМС и USSD  будут приходить в UCS2, единообразно, т.е. легче разобрать.
Прием по UART надо делать через прерывание, если нужен режим IDLE.

Отредактировано sla174 (2019-05-05 20:07:31)

+1

4

Пример работы с SIM800L
Код:

$regfile = "m328pdef.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 128
$baud = 9600
Echo Off

Dim Buff(704) As Byte
Dim Buff_index_1 As Word
Dim Buff_index_2 As Word
Dim Rdy_rx_flag As Bit
Dim B As Byte
Dim 100ms2 As Word
Dim Str As String * 254
Dim Phone As String * 48
Dim Strk As String * 4
Dim J As Byte
Dim K As Byte

Declare Sub In_message(byval T As Word , S As String * 254)
Declare Sub In_txt(byval T As Word , S As String * 254)
Declare Sub Ucs2_win(s As String)

Config Timer1 = Timer , Prescale = 64 , Clear Timer = 1     ' 0,1 sec
Compare1a = 25000

On Urxc Rx_rdy
On Oc1a Sec01

Enable Urxc
Enable Oc1a
Enable Interrupts

Start Timer1
'------------------------------------------------------------

Print "AT+CMGR=1"        'прочитать 1 СМС
In_txt 100 , Str         'прочитать сообщение от модуля с таймаутом 10 сек в переменную str

If Left(str , 5) = "+CMGR" Then
	J = Len(textstr)
   	Strk = ","
	K = Instr(str , Strk)
	J = J - K
	Decr J
	str = Right(str , J)
	Strk = Chr(34)
	K = Instr(str , Strk )
	Decr K
	Phone = Left(textstr , K) 'номер отправителя в UCS2
	In_message 100 , str    'прочитать СМС от модуля с таймаутом 10 сек в переменную str с переводом в ASCII
end If

Ucs2_win Phone       'Преобразовать номер из UCS2 в ASCII


do
loop


end
'------------------------------------------------------------
Rx_rdy:
B = Udr
Select Case B
   Case 10 :
   Case 13 :   Set Rdy_rx_flag
   Case Else : If B >= 20 And B <= 127 Then
                  Incr Buff_index_1
                  If Buff_index_1 > 704 Then Buff_index_1 = 1
                  Buff(buff_index_1) = B
                End If
End Select
Return
'------------------------------------------------------------
Sec01:' тик в 0,1 сек для таймаута
Incr 100ms2
Return
'------------------------------------------------------------

'=============================================================================
Sub Ucs2_win(s As String * 254)
Local B As Byte
Local D As Byte
Local K As Byte
Local J As Byte
Local C As Word
Local Str1 As String * 4


J = Len(s)
D = 0

For K = 1 To J Step 4

Str1 = Mid(s , K , 1)
B = K + 1
Str1 = Str1 + Mid(s , B , 1)
   Incr B
   Str1 = Str1 + Mid(s , B , 1)
   Incr B
   Str1 = Str1 + Mid(s , B , 1)
   C = Hexval(str1)

   Select Case C
      Case 1105 : C = 184
      Case 1025 : C = 168
      Case Else : If C > 128 Then C = C - 848
   End Select
   Str1 = Chr(c)
   Incr D
   Mid(s , D , 1 ) = Str1

Next K
S = Left(s , D)
End Sub
'=============================================================================
Sub In_message(t As Word , S As String * 254)     'для чтения СМС

Local C As Word
Local J As Word
Local K As Word
Local B As Byte
Local Tempstr As String * 4

100ms2 = 1
S = ""
Tempstr = ""
Do
Loop Until T = 100ms2 Or Rdy_rx_flag = 1
J = Buff_index_1
Reset Rdy_rx_flag
K = 1

Do
   Incr Buff_index_2
   If Buff_index_2 > 704 Then Buff_index_2 = 1
   B = Buff(buff_index_2)

   If B = 0 Then Exit Sub

   Tempstr = Tempstr + Chr(b)

   If K = 4 Then
      C = Hexval(tempstr)
      Select Case C
         'Case 0 : C = 0
         Case 1105 : C = 184
         Case 1025 : C = 168
         Case Else : If C > 128 Then C = C - 848
      End Select
      S = S + Chr(c)
      Tempstr = ""
      K = 0
   End If

   Incr K
Loop Until Buff_index_2 = J

End Sub
'=============================================================================
Sub In_txt(t As Word , S As String * 254 )    'для общения с модулем

Local J As Word

S = ""
100ms2 = 1
Do
Loop Until T = 100ms2 Or Rdy_rx_flag = 1
J = Buff_index_1
Reset Rdy_rx_flag

Do
   Incr Buff_index_2
   If Buff_index_2 > 704 Then Buff_index_2 = 1
   S = S + Chr(buff(buff_index_2))
Loop Until Buff_index_2 = J

End Sub
'=============================================================================

Возможно код неоптимален и даже не совсем рабочий, писал по памяти.

0

5

Вся прграмма рассчитана на отправку аварийных сообщений. Стоять прибор будет на отопительной системе. Принимает по СМС всего четыре символа. Основные "?" передает по СМС состояние четырех датчиков температуры,  режимы работы системы. Это все прекрасно работает. "5" запрос баланса по USSD. Запрос делает, ответ получает. Иногда отсылает пустой ответ. Начал разбираться черезь терминал. Когда нормальный ответ, строка выглядит так.
+CUSD: 0, "сдесь пошел UCS2"
Первая цифра будет 12 символ.
Bred = Mid(sk , 12 , 128) прекрасно забирает нужную часть юникода. Соответственно присылает почти красивый ответ. После суммы баланса могут цифры, точки добавляться.
Когда ответ.
+CUSD:
1, "пошел UCS2" Пишу по памяти, как то так. Код уже идет не с 12 символа. Соответственно промахитается.

0

6

не понял вопрос: Вам надо принимать СМС в кириллице?
А не проще "переключить" сообщения оператора в латиницу?

' Для теле2 послать 1 раз с нужной симки *120# для перекл USSD в транслит
' Megafon *105*1250# и ответить 1

0

7

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

$crystal = 16000000

Стабильней было бы кварц на 14,7456 мГц.
Так 100% передача данных, на 16мгц иногда ошибки бывают.
А так если в сообщении одна цифра - то проще отфильтровать символы и оставить только цифры.

0

8

Александр Д.
На транслит переведен, и по началу все приходило на латинице. Покуда наши доблестные операторы не стали мусор к ответу USSD добавлять. Типа "Возьми кредит в банке на выгодных условиях. 500% годовых" на кириллице. Начались танцы с бубном. Но с этой темой вроде разобрался. Друг подсказал. Сначала брать по 4 символа из строки сдвигая на один до совпадения с первой цифрой UCS2. Дальше брать черезь 4 по 4 знака.

Код:
'========Баланс===============================================
Баланс:
    Sim = 1
    Val_numeric = 1
    Otvet = ""
    For Bal = 0 To 60
     Sim_str = Mid(sk , Sim , 4)
    Select Case Sim_str
      Case "0030" : Cifra = "0"
      Case "0031" : Cifra = "1"
      Case "0032" : Cifra = "2"
      Case "0033" : Cifra = "3"
      Case "0034" : Cifra = "4"
      Case "0035" : Cifra = "5"
      Case "0036" : Cifra = "6"
      Case "0037" : Cifra = "7"
      Case "0038" : Cifra = "8"
      Case "0039" : Cifra = "9"
      Case "002E" : Cifra = "."
      Case "002C" : Cifra = "."
      Case "0070" : Cifra = "p"
    End Select
      If Cifra <> "" Then Val_numeric = 4
        Otvet = Otvet + Cifra
      If Cifra = "p" Then Bal = 60
      Sim = Sim + Val_numeric
      Cifra = ""
    Next Bal

    Otvet = "Balans:" + Otvet
  Gosub Sendsms

Return

Так работает. По крайней мере десяток раз ответ нормальный. За одно обрубил конец  обработки строки при совпадении с символом "p". В ответе типа рубль.

0

9

Еще вопрс.
Как правильно рассчитывать память МК?
Имею ввиду
$hwstack = 160
$swstack = 160
$framesize = 60
Ни где не могу найти инфы по этой теме.

0

10

rom-i написал(а):

Покуда наши доблестные операторы не стали мусор к ответу USSD добавлять

Вот поэтому я и нагородил перекодировку в ASCII.


rom-i написал(а):

Ни где не могу найти инфы по этой теме.

http://bascomavr.3bb.ru/viewtopic.php?id=494

0

11

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

Стабильней было бы кварц на 14,7456 мГц.

Arduino Nano  :dontknow:

0

12

rom-i написал(а):

Ни где не могу найти инфы по этой теме.

Вот тут RDW весьма доходчиво разложил Вставить спецсимвол в строку

PS.  Предложение "хранителям" сайта ;) - сделать раздел, допустим "FAQ", в котором разместить подобного рода статьи, разъяснения и пр., чтоб не отсылать каждый раз к Справке...
Лучше даже комментарии отключить.

Отредактировано Nord (2019-05-06 22:28:46)

0

13

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

PS.  Предложение "хранителям" сайта  - сделать раздел, допустим "FAQ", в котором разместить подобного рода статьи, разъяснения и пр., чтоб не отсылать каждый раз к Справке...


Очень разумное предложение, но, подобных тем валом, а толку нуль !

С нашим менталитетом, проще спросить, чем искать !

0

14

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

С нашим менталитетом, проще спросить, чем искать !

А потому, что "подобные темы" надо искать в общей куче, а хочется узнать "вчера к обеду"... ;)

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

Очень разумное предложение, но, подобных тем валом, а толку нуль !

Раздел на Главной странице был бы на глазах.
Готов помочь с наполнением... ;)

0

15

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

Раздел на Главной странице был бы на глазах.


Вот есть, и кто туда заходит, в ответ -"ой, а я не видел"

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

Готов помочь с наполнением


И что или кто мешает ?

0

16

Nord

Давайте "пилотное название темы".

0

17

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

Вот поэтому я и нагородил перекодировку в ASCII.

$hwstack - $swstack - $framesize - подскажите новичку.


Все бы так сладко. В приложениях, когда в смс отправляешь/принимаешь только латиницу и цифры, то в формате PDU раздел данных (собственно полезный текст сообщения) приходит в 7-битной кодировке. Т.е. символ кодируется одним байтом. За это отвечает байт TP-DCS в PDU посылке.

0

18

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

то в формате PDU

Модуль переведен в режим UCS2, я с PDU повозился немного и решил не связываться с ним. Под UCS2 надо чуть больше оперативки, но обработка не такая изощренная.

0

19

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

то в формате PDU

Модуль переведен в режим UCS2, я с PDU повозился немного и решил не связываться с ним. Под UCS2 надо чуть больше оперативки, но обработка не такая изощренная.

0

20

А сможешь на своем проверить, отправить смс только из цифр? У меня при входящем сообщении, похоже, смс центр определяет тип кодировки входящего смс.
PS: перевод модема в UCS2 и выбор алфавита (кодировки)  не помогают. SIM800D. Ловлю текст смс сразу с индикатором нового смс, а не при чтении из памяти модуля.

0

21

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

А сможешь на своем проверить, отправить смс только из цифр?

Попозже, новый макет надо будет собрать.
На МТС и ТЕЛЕ2 смс центр отлавливает сообщения начинающиеся с * и # и обрабатывает их как USSD запрос, даже с телефона.

0

22

USSD да. Я про входящие смс. С командами для МК к примеру.
Мучаю теле2. Хочу еще время для синхронизации из входящих смс получать. В USSD времени нет.

0

23

Проверил. Модуль цифры отправляет, и единичные, и как числа (МТС) при кодировке в UCS2.
Смартфон не отправляет, считает запросами (ТЕЛЕ2).
В прошлом проекте пришлось команды писать просто словами, чтобы они начинались с букв.
Хотел добавить символы * и # в начало команды, как защита от ошибочного набора, но ТЕЛЕ2 такие СМС отправлять через некоторое время перестал, и по сей час не хочет.
Потом добавил DTMF(управление) и AMR (голосовые ответы).

0

24

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

Ловлю текст смс сразу с индикатором нового смс

Я ловлю незапрашиваемое "+CMTI", вычитываю первое СМС и удаляю все СМС.
При старте так же удаляю все СМС.

0

25

Проверил прием модулем цифр. Цифры и числа принимает нормально (в UCS2) при отправке с Мегафона.

0

26

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

Проверил прием модулем цифр. Цифры и числа принимает нормально (в UCS2) при отправке с Мегафона.

чорт! Как выяснить, дело в настройках модуля или смс центра?

0

27

Видимо поставить СИМ карту другого оператора и попробовать.

+1

28

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

Как выяснить, дело в настройках модуля или смс центра?

А если отправить SMS с телефона на этот модуль ?
Что будет на приеме ?
Вот чисто ради проверки...

0

29

Сбросил модуль до заводских настроек, ситуация не изменилась.
Оператор Теле2. Отправил смс с телефона на модуль с текстом "1111"

Индикатор нового сообщения:

Код:
+CMTI: "SM",1

Чтение СМС

Код:
AT+CMGR=1 +CMGR: 0,"",23
07919781340310F1240B919721276957F100009150317035352104B1582C06

OK

На МТС то же самое, дело в модуле.

Отредактировано MACTEPok (2019-05-13 08:08:17)

0

30

sla174, подскажи, какой ответ на запрос AT+CSMP? по умолчанию?
у меня

Код:
AT+CSMP? +CSMP: 17,255,0,0

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Использование модуля SIM800l