Доброго всем времени суток.
Совсем недавно начал осваивать контроллеры, выбор остановил на AVR и Bascom. Нехитрые устройства вроде мигалок выходят наура. Задумал усложнить себе задачу, и сваять реле с управлением по команде SMS. В железе воплотил. А вот с программой прошу помоч. Несколько раз переписывал с нуля, Железо рабочее 100%, подключение тоже правильное (АТ команды передаются на GSM модуль, и принимаются контроллером от него). В некоторых вариантах прошивки, SMS о включении приходило, но не более того.
Буду признателен любой помощи: совету, правке кода...
Собственно вопрос в том, почему тини невсегда корректно принимает строку???
'BASCOM-AVR 2.0.5.0
'SIM300 DZ
'ATTINY 2313
$regfile = "attiny2313.dat"
$crystal = 4000000
$baud = 9600
$hwstack = 20
$swstack = 8
$framesize = 24
Config Serialin = Buffered , Size = 12
Config Portb = Input
Config Portb.1 = Output
Config Portd = Input
Rele Alias Portb.1
Dim B As Byte
Dim I As Byte
Dim Q As Byte
Dim R As Byte
Dim Stemp As String * 12
Dim Sret As String * 36
Declare Sub Getline(s As String)
Declare Sub Showsms(s As String )
Declare Sub Delsms(s As String )
Declare Sub Sendsms(s As String )
Declare Sub Dorele
Q = 0
R = 0
Reset Rele
Enable Interrupts
'настройка gsm модуля-----------------------------------------------------------
Do
Print "AT" 'посылаем АТ
Getline Sret
Waitms 100
Loop Until Sret = "OK" 'выход при ответе ОК
Print "AT+CMGF=1" 'текстовыйформат SMS
Getline Sret
Waitms 100
Print "AT+CSDH=0"
Getline Sret
Waitms 100
Print "AT+CPMS=" ; Chr(34) ; "SM" ; Chr(34) 'местохранения SMS
Getline Sret ' ответ - sm 0,20....
Getline Sret 'OK
Waitms 100
Gosub Sendsms 'переходим к отправке SMS
'главный цикл-------------------------------------------------------------------
Do
Getline Sret 'получаем строку
I = Instr(sret , ":")
If I > 0 Then
Stemp = Left(sret , I)
Select Case Stemp
Case "+CMTI:" : Showsms Sret 'если в строке есть "+CMTI:" идем читать SMS
End Select
End If
Loop
'прием строки-------------------------------------------------------------------
Sub Getline(s As String)
S = ""
Do
B = Inkey()
Select Case B
Case 0
Case 13
Case 10 : If S <> "" Then Exit Do 'выход по принятии 10 при условии, что в строке есть символы
Case Else
S = S + Chr(b) 'составляем строку
End Select
Loop
End Sub
'чтение SMS---------------------------------------------------------------------
Sub Showsms(s As String )
I = Instr(s , ",") 'определение номера sms в списке
I = I + 1
Stemp = Mid(s , I)
Print "AT+CMGR=" ; Stemp ' показать SMS
Getline S
Waitms 100
Do
Getline S
Select Case S
Case "rele" : Gosub Dorele ' если в тексте sms есть "rele" то идем управлять реле
Case "OK" : Exit Do
Case Else
End Select
Loop
Gosub Sendsms
Gosub Delsms
End Sub
'удаление SMS-------------------------------------------------------------------
Sub Delsms(s As String )
Do
Print "AT+CPMS?" 'удаляем sms
Getline Sret
Getline Stemp 'пока ниодного
Waitms 100
I = Instr(sret , ",") 'не останется
I = I + 1
Stemp = Mid(sret , I)
I = Val(stemp)
If I = 0 Then Exit Do 'выход если количесво сообщений = 0
Print "AT+CMGD=" ; Stemp
Getline Stemp
Waitms 100
Loop
End Sub
'отправка SMS-------------------------------------------------------------------
Sub Sendsms(s As String )
Waitms 100
Print "AT+CPBR=1" 'читаем номер из первой ячейки
Getline Stemp
Waitms 100
I = Instr(stemp , "+79")
Stemp = Mid(stemp , I , 12) 'извлекаем номер
Waitms 100
Print "AT+CMGS=" ; Chr(34) ; Stemp ; Chr(34)
If R = 0 Then
Stemp = "OFF"
Else
Stemp = "ON"
End If
If Q = 0 Then ' при включении отправляет "POWER ON"
Print "POWER ON"
End If
If Q = 1 Then
Print "RELE " ; Stemp ; Chr(26) 'если команда коректная отправляет RELE ON/OFF
End If
If Q = 2 Then
Print "ERROR 01" ; Chr(26) 'это при некоректной комманде
End If
Getline Sret
Getline Stemp
Q = 1
End Sub
'действие с реле----------------------------------------------------------------
Sub Dorele
I = Instr(stemp , "rele")
I = I + 5
Sret = Mid(stemp , I , 1)
I = Val(sret)
If I = 0 Then
R = 0
Reset Rele
End If
If I = 1 Then
R = 1
Set Rele
End If
If I > 1 Then
Q = 2
End If
Gosub Sendsms
End SubОтредактировано Виктор (2011-05-27 11:08:38)