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

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

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

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



GSM СССР

Сообщений 61 страница 90 из 104

1

Вопрос прям наболевший за сутки, нужна передача по USB 8 бит, маленький код, дескриптор и т.п. Кто может видел с описанием на нашенском ). А то пробежался и все варианты очень жрут много памяти. Не могу найти по минимум кода и простоты передачи данных. Может я принцип не понял, объясните мне пожалуйста, там каждый раз при приёме и ответе нужно указывать принято и ждать подтверждение?).
Вообщем нужна связь с ПК по USB, софт на ПК можно написать ... интересует как можно принять и отправить 8 бит, с минимум кода в библиотеке.
Может конечно я ря тревожусь и Ва потревожу, но такая ситуация. Есть можем SIM300, контроллер atmega8, хочу сделать себе мобилу знатную и блатную (спортивную). Хватит мне памяти МК, если я экран не буду использовать, только RX/TX общение с модемом и по USB временами СМСить, врятли хватит на чтение голосом СМС.

Приложение для ознакомления:

Телефонный аппарат:
http://cs315219.vk.me/v315219419/7b9a/RdME_AOz5js.jpg
модем, микрофон, динамик:
http://cs315219.vk.me/v315219419/7b7f/7OvpN8Ot9Ps.jpg
Перемотанный в 270 Ом звонок:
http://cs315219.vk.me/v315219419/7b4f/cA7tN5S07FY.jpg
Вытравленная пробая плата, позже весь проект выложу вместе с исходником Lay 6
http://cs315219.vk.me/v315219419/7b88/0glq4LYVGEI.jpg
Девайс в начальной стадии, звонок уже работает, мини инвертор пашет ), всё как в атс 4 сек пауза / 1 сек звонок.
http://cs315219.vk.me/v315219419/7bcb/BP9UY6fZhxw.jpg

0

61

sva-don, что мне даст отчет?
Лучше бы разъяснили алгоритм работы в баскоме, раз у вас всё получается.
Я видел много людей на просторах инета, которые не могли оседлать буферизацию баскомовскую (в их число вхожу и я). Любопытство мучает.
Вот сконфигурировали мы порт под буферизацию, сразу возникает вопрос: где указывать переменную в которую приходят данные и как они туда попадают (по средству чего (прерывания или чего)) ?

зы: а так, у меня есть устройство, которое уже работает около года 24/7 без запинок с SIM900.

Отредактировано RDW (2013-09-02 19:06:11)

0

62

В натуре, вы чё попутали?!!! Нет этой буферизации вообще, есть только бит, который нужно срочно забрать, пока второй неупал на место первого, пропусков между битами уйма, буферами тут не пахнет ! :hobo:

Отредактировано Ev3658 (2013-09-02 21:29:28)

0

63

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

Вот сконфигурировали мы порт под буферизацию, сразу возникает вопрос: где указывать переменную в которую приходят данные и как они туда попадают

Все просто. После конфигурации в SRAM отводится область с размером вашего буфера. Подпрограммы из библиотеки (вы можете их там найти) mcs.lib перехватывают прерывание от порта и перемещают принятый байт в буфер.
Вытащить их оттуда можно обращаясь непосредственно к внутренней переменной _RS232INBUF0, либо в цикле переписать буфер в другой массив при помощи Inkey, так, как я показывал выше. Очистка буфера Clear SerialIn. Все.
Попробуйте на большой скорости принимать поток данных из порта? Уверен, что можно много потерять, а тут все происходит прозрачно и незаметно для пользователя. Ему необходимо только периодически просматривать наличие символа в буфере командой Ischarwaiting. Еще раз привожу код для чтения из буфера.

Код:
If Ischarwaiting() = 1 Then                           'Есть символ
 For I = 1 To 8                                             'Прочтем буфер
   D(I) = Inkey()
   Waitms 1
 Next
Clear SerialIn                                              'Очистим буфер для следующего приема

Что тут сложного? Не понятно.
В одной из моих разработок контроллер принимает управляющую команду от ПК длинной 32 байта. Без буфера сделать это было бы можно, но весьма затруднительно. С буфером все намного проще.

0

64

Вообще очень странно всё выглядит.
Буфер как раз нужен чтобы из него забирать/обрабатывать готовые данные и совершать действия, а тут получается переливание из пустого в порожнее...на эти 32 байта тоже нужно время, чтобы перенести их ещё куда-то..
Оператор "Inkey()" работает с первым доступным портом у МК (из профиля) и тут всё упирается по скорости в "Waitms 1" - это скорость чтения/перегонки данных занимает 1кГц. С таким кодом, если у вас идет поток данных (без перерыва), то весьма быстро всё переполнится. Всё очень медленно. Для тех же 9600 нужна скорость 104,17us (а если представить, что обычно народ стремится работать быстрее - то и меньше задержка нужна).
Так же должна быть обязательно информация о количестве данных в буфере, иначе непонятно сколько их вынимать от туда - это я в коде вообще не вижу, идет слепое чтение данных. Если передаются не текстовые данные, а скажем бинарные, то вообще трудно понять где там конец. Такая информация не реализована.
Вот в этом весь и затык!

Кстати, что будет, когда буфер переполнится? Данные в буфере просто перезаписываться будут по кругу или попросту теряться?

0

65

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

If Ischarwaiting() = 1 Then                           'Есть символ
For I = 1 To 8                                             'Прочтем буфер
   D(I) = Inkey()
   Waitms 1
Next
Clear SerialIn                                              'Очистим буфер для следующего приема

Не работает с Atmega8, ну никак не хочет, бесполезно.

Код:
 

$regfile = "m8def.dat"
$crystal = 14745600
$hwstack = 16
$swstack = 64
$framesize = 32
$baud = 19200


Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 8
.....
If Ischarwaiting() = 1 Then 
For P = 1 To 8                                            
   Tbuff(p) = Inkey()
   Waitms 1
 Next
 Modem = ""
 For P = 1 To 8
   Modem = Modem + Chr(tbuff(p))
   Next
Clear Serialin                                              
End If

А да, может это кому под силу понять и перевести?

Отредактировано Ev3658 (2013-09-03 12:53:32)

0

66

по быстрому можно перевести так

0

67

Вот собственно и ответ на мои вопросы:

_RS_HEAD_PTRW0, байт, который хранит глава буфер

_RS_TAIL_PTRW0 байт, который хранит хвоста буфера

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

_RS_BUFCOUNTW0 байт, который содержит число байтов в буфере.


Как понимаю:

_RS_HEAD_PTRW0 - позиция стартового значения данных в буфере;
_RS_TAIL_PTRW0 - позиция конечного (последнего) значения данных в буфере;
_RS_BUFCOUNTW0 - общее количество байт сохраненных в кольцевом буфере.

Из выше перечисленного получаются: буфер не может превышать объём больше байта.
Как-то странно..

И если использовать другие буфера то меняем на увеличение нуль на другие цифры (например: _RS_BUFCOUNTW1..2..3..4..)?

0

68

Кстати, теперь непонятен следующий момент, если мы быстро забираем при помощи "Inkey" данные из буфера (зная переменную о количестве байт полученных (_RS_BUFCOUNTWх)), то по идеи мы можем строить конвеер (забрали данные сколько могли или ждем, чтобы в буфере было данных не меньше какого-то количества (некий процент от общего объёма) и потом его принимаем/обрабатываем).
Это у нас получается всё по части приёма (используется прерывание).

А вот с отправкой буферной непонятно, используется таймер, чтобы прерывание генерить и отправлять данные стабильно?

0

69

Вообщем сам я не понял как этот UART или как его там в Bascom AVR называется, но самый быстрый без ошибочный (очень млао ошибок), не зависающий метод вот:

Код:
Goto programma


Sim300:

Tbuf = 0
Do
   Tbuf = Tbuf + 1
   Select Case B
       Case 10 : If S <> "" Then
                     Modem = S
                     S = ""
                     Do
                        B = Inkey()
                     Loop Until B = 0
                     Exit Do
                     End If
                  Case Else
         If B > 32 Then
            Tbuf = 0
            S = S + Chr(b) 
         End If
    End Select
    If Tbuf > 25000 Then
           Exit Do
            End If
  B = Inkey()
   Loop
return

programma:

Do
B = Inkey()
If B > 0  Then Gosub Sim300  
...

loop

Причём сразу забираем из буфера, вставляем в с троку и забираем остаток, а если задержалось, то возвращаемся. Лимит 25000 подобрал опытным путём, просто просматривал переменную в задержках, обычно как раз так и происходит, если выше, то надолго, а значит можно пробежаться по программе и заново забрать символ. Используйте на здоровье! Другое всё не предсказуемое зависалово и кидалово на стабильность (((

0

70

Пока это всё применимо только к передачи "текста".

Не вижу в коде ограничение "S", возможно переполнение.

Отредактировано RDW (2013-09-04 08:59:58)

0

71

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

Вообще очень странно всё выглядит.
Буфер как раз нужен чтобы из него забирать/обрабатывать готовые данные и совершать действия, а тут получается переливание из пустого в порожнее...на эти 32 байта тоже нужно время, чтобы перенести их ещё куда-то..
Оператор "Inkey()" работает с первым доступным портом у МК (из профиля) и тут всё упирается по скорости в "Waitms 1" - это скорость чтения/перегонки данных занимает 1кГц. С таким кодом, если у вас идет поток данных (без перерыва), то весьма быстро всё переполнится. Всё очень медленно. Для тех же 9600 нужна скорость 104,17us (а если представить, что обычно народ стремится работать быстрее - то и меньше задержка нужна).
Так же должна быть обязательно информация о количестве данных в буфере, иначе непонятно сколько их вынимать от туда - это я в коде вообще не вижу, идет слепое чтение данных. Если передаются не текстовые данные, а скажем бинарные, то вообще трудно понять где там конец. Такая информация не реализована.
Вот в этом весь и затык!
Кстати, что будет, когда буфер переполнится? Данные в буфере просто перезаписываться будут по кругу или попросту теряться?

Начнем по порядку.
"Перегонка данных в другой массив вовсе не обязательна. Этот пример приведен для альтернативы. Кстати вставка Waitms 1 там совсем не нужна и появилась скорее всего по ошибке, вставлял для отладки.
Можно пользоваться внутренними переменными, которые вы сами уже нашли, хотя я их вам приводил выше. Там есть адреса начала и конца буфера, количество байт в нем и непосредственно сам буфер.
Думаю, что вряд ли найдется задача когда из ПК в МК течет непрерывный поток данных. В любом случае передача пакетирована и останется кусочек времени для выполнения других задач.
Для примера скажу, что программа чтения приведенная выше работает с процессором на частоте 1,8432 МГц и на скорости 19200 без всяких всяких сигналов управления потоком. Сбои отсутствуют. Мало того, команды передаются из локальной сети через преобразователь RS - Ethernet.
При переполнении буфера реакцию системы не изучал, т.к. в этом не было необходимости. Логично было бы предположить, что данные должны перезаписываться.

Отредактировано sva-don (2013-09-04 09:37:54)

0

72

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

Не работает с Atmega8, ну никак не хочет, бесполезно.

Каким образом организован цикл опроса? Из программы не видно. Это DO ... LOOP?

0

73

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

Как понимаю:
_RS_HEAD_PTRW0 - позиция стартового значения данных в буфере;
_RS_TAIL_PTRW0 - позиция конечного (последнего) значения данных в буфере;
_RS_BUFCOUNTW0 - общее количество байт сохраненных в кольцевом буфере.
Из выше перечисленного получаются: буфер не может превышать объём больше байта.
Как-то странно..

Начало правильное, только не забывайте об очень важной переменной _RS232OUTBUF0. Это сам массив данных. Не хотите перегонять его в другой используйте эту переменную. Например обращение к первому элементу буфера _RS232OUTBUF0(1) и т.д.
С чего вдруг получился вывод о том, что буфер хранит один байт?

0

74

Защита от переполнения будет проблематичной в цикле, так как затормозит и будет пропуск символов. В принципе если будут глюки в передачи, то можно впихнуть например сюда:

Код:
If Tbuf > 25000 Then
           If Len(s) > 30 Then
             S = ""
                     Do
                        B = Inkey()
                     Loop Until B = 0
             Exit Do
             End If
           Exit Do
            End If
  B = Inkey()
   Loop
Return

0

75

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

Начало правильное, только не забывайте об очень важной переменной _RS232OUTBUF0. Это сам массив данных. Не хотите перегонять его в другой используйте эту переменную. Например обращение к первому элементу буфера _RS232OUTBUF0(1) и т.д.

Разве не достаточно используя INKEY просто читать данные из массива/буфера (ведь оно там автоматически (за нас всё сделано) чтобы передавалось с учетом кольцевидности буфера)? Макс. что нужно - это знать его заполненность.

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

С чего вдруг получился вывод о том, что буфер хранит один байт?

В описании написано, что размерность буфера байт. Если я неправильно понимаю - это хорошо.

На счет потока данных, например у меня устройство связывается с сервером по GPRS и может как отправлять, так и принимать приличный объём данных. Да в протоколе заложена сегментация пакетов, которой управляет/задаёт сам сервер, но алгоритм так сделан, что всё стремится к меньшей передачи управляющих кодов и больше данных (пакет уменьшается только в случае повышения ошибок (правда пока такого не было)), в любом случае поток в 20КБ - реален. Т.ч. делать нужно так, чтобы работало как часы.

На счет "Waitms 1": в примерах баскома задержка тоже стоит зачем-то..

В любом случае, спасибо, sva-don, за наставление на путь истинный. :D Есть пища для ума..надо поиграться в живую.

0

76

А может расшифруете про эти переменные? А то скоро пригодится в более точной науке выражения творчества )))

0

77

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

А может расшифруете про эти переменные? А то скоро пригодится в более точной науке выражения творчества )))

_RS232INBUF0        Byte ()    'Массив данных с размерностью заданной в Config
_RS_HEAD_PTR0     Byte       'Адрес начала буфера в памяти
_RS_TAIL_PTR0      Byte       'Адрес конца  буфера в памяти
_RS_BUFCOUNTR0  Byte       'Количество принятых байт

0

78

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

_RS_HEAD_PTR0     Byte       'Адрес начала буфера в памяти
_RS_TAIL_PTR0      Byte       'Адрес конца  буфера в памяти
_RS_BUFCOUNTR0  Byte       'Количество принятых байт


Вот опять всплывает тот факт, что буфер не может превышать объём больше байта (макс ёмкость 255 байт), ибо ячейки не "WORD". Хорошо, если такое ограничение только для АТМег, а для ХМег по другому.. И может не "адрес", ибо в среднем объём SRAM 512 байт...

0

79

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

Вот опять всплывает тот факт, что буфер не может превышать объём больше байта (макс ёмкость 255 байт), ибо ячейки не "WORD". Хорошо, если такое ограничение только для АТМег, а для ХМег по другому.. И может не "адрес", ибо в среднем объём SRAM 512 байт...

А ну ка включаем лампочку в голове  8-)
_RS_HEAD_PTR0     Byte       'Адрес начала буфера в памяти. Т.е. буфер может располагаться по адресу от 0 до 255. На усмотрение компилятора. Не данные, а АДРЕС начала буфера!
_RS_TAIL_PTR0      Byte       'Адрес конца  буфера в памяти.
_RS_BUFCOUNTR0  Byte       'Количество принятых байт.
Из всего этого следует, что мах размер буфера может быть 255 байт!
Ну как же буфер может быть равен одному байту! Что это за буфер такой?
Например буфер размером 8 байт будет иметь следующие параметры. Адрес конечно я задаю произвольно, компилятор ему присвоит свой. Переменные будут следующими, (все в десятичном):
_RS_HEAD_PTR0 = 120. Т.е. начало буфера будет располагаться по адресу SRAM = 120.
_RS_TAIL_PTR0 = 127. Конец буфера в SRAM по адресу 127. Т.е. выделена память с адреса 120 по 127. Итого размер буфера = 8 байт.
Зная эти два числа можно читать буфер прямо из памяти командами ассемблера если уж так это необходимо для скорости.

Отредактировано sva-don (2013-09-05 16:10:52)

0

80

Так я о том же написал. :D И что он не может быть больше 255 байт, при том, что объём ОЗУ в среднем 512 и больше байт! Вдруг я захочу буфер в 2КБ и что будет, ошибка? Странно как-то всё...

0

81

Ev3658, вместо мата лучше бы попробовал понять, что люди тут пишут и подтвердить это практикой. Я бы рад был бы и сам это сделать, но пока под рукой нет похожих проектов/железа, да и лень что-то накрыла сильно (ковырять само железо).  :(

Отредактировано RDW (2013-09-06 08:57:17)

0

82

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

Так я о том же написал.  И что он не может быть больше 255 байт, при том, что объём ОЗУ в среднем 512 и больше байт! Вдруг я захочу буфер в 2КБ и что будет, ошибка? Странно как-то всё...

Да, странно, но так разработчики BASCOMа решили. :dontknow:

0

83

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

Да, странно, но так разработчики BASCOMа решили.

Никогда не видел буфера RAW даже в 255 байт в реальной программе например под Win. Буфер нужен для того, что бы не терять байты при обработке принятого.

0

84

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

Да, странно, но так разработчики BASCOMа решили.

Ну я написал метод, там массивы ограничивают принятие всех этих данных. Может и флешка нужна ))))
Только ответ и засрали ))) Эххх...
Так эти переменные прям в тексте? Синтаксис уже не бэйсика.

0

85

Ну всё, я теряюсь... проект помещается ))) почти, выкладываю наглядно:

Код:
$regfile = "m8def.dat"
$crystal = 14745600
$hwstack = 16
$swstack = 64
$framesize = 32
$baud = 19200

'Config Timer0 = Timer , Prescale = 1024 , Compare A = Set , Clear Timer = 1
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 , Clockpol = 0
'Config Serialin = Buffered                                  , Size = 32

Declare Sub Nokia_init()
Declare Sub Nokia_clear()
Declare Sub Nokia_text(byval Nokia_x As Byte , Byval Nokia_y As Byte , Byval Nokia_text As String , Byval Nokia_inversion As Byte)


Nokia_spi_data Alias Portb.1                                'MOSI       - можно задать любую ножку
Nokia_spi_clock Alias Portb.2                               'SCK        - можно задать любую ножку
Nokia_cs Alias Portb.0                                      'CS         - можно задать любую ножку
Display_reset Alias Portd.7                                 'LCD_RESET  - можно задать любую ножку
Display_reset = 1
Nokia_cs = 1

Dim W As Iram Word At 8 Overlay
Dim Nokia_data_9 As Integer


Dim X As Byte



'порты экрана
Config Portd.7 = Output
Config Portb.0 = Output
Config Portb.2 = Output
Config Portb.1 = Output


Config Portc.3 = Output                                     'подсветка и питание набирателя
Config Portc.4 = Input                                      'начало набора номера

Config Portd.2 = Output                                     ' питание микрофона и звуки
Config Portd.4 = Output                                     ' Таймер Звука Занято И Т.п.



'порт положения трубки
Config Portd.3 = Input
'порты звонка
Config Portd.5 = Output
Config Portd.6 = Output
'алиасы
Faza1 Alias Portd.5
Faza2 Alias Portd.6

Faza2 = 0

Trubka Alias Pind.3
Naborcifri Alias Pinc.2
Pitanienabiratela Alias Portc.3
Prerivanienabiratela Alias Pinc.4
Microfon Alias Portd.2
Dinamik Alias Portd.4

Dim P As Byte
Dim O As Byte
Dim N As Byte                                               'переменные для набирателя
Dim N1 As Byte                                              'переменные для набирателя
Dim Buff As Byte
Dim B As Byte
Dim Cifra(11) As Byte
'Dim Trubka As Byte
Dim Nabor As Byte                                           'состояние положена/снята трубка
Dim T As Byte
Dim T1 As Integer
Dim Tbuf As Integer                                         'антизависание в чтение буфера
Dim Zvonok As Byte
' Если Zvonok:
'0-трубка положена
'1-трубка снята без поступления звонка
'2-поступление звонка при положенной трубки
'3-трубка снята в ответ на звонок
'4-трубка положена после ответа на звонок
'5-режим набора номера
'
'
'




Dim Modem As String * 30
Dim S As String * 30
Dim Text1 As String * 16
Call Nokia_text(1 , 1 , "-==[GSM СССР]==-" , 1)
'Disable Urxc
Call Nokia_init()
Call Nokia_text(1 , 2 , ">AT" , 1)
Text1 = "AT"
Gosub Inicilizacija
Call Nokia_text(1 , 3 , ">ОК" , 1)
Print "AT"
Text1 = "AT+CHFA=1"
Call Nokia_text(1 , 4 , ">AT+CHFA=1" , 1)                   '0-телефон, 1-гарнитура (выходы у модема)
Gosub Inicilizacija
Call Nokia_text(1 , 5 , ">OK" , 1)
Text1 = "AT+CLVL=100"
Call Nokia_text(1 , 6 , ">AT+CLVL=100" , 1)

Gosub Inicilizacija
Call Nokia_text(1 , 7 , ">ОК" , 1)
Wait 1
Call Nokia_clear


Goto Programma:
'======================== ПОДПРОГРАММА =====================
'блок, которому в переменную Text1 указать команду можема, он будет ждать ответ ОК и повторять через каждые 25000 циклов комманду в переменной Text1 - пока не дождётся ОК
Inicilizacija:
Do
B = Inkey()
If B > 0 Then Gosub Sim300
If Modem = "OK" Then Exit Do
T1 = T1 + 1
If T1 = 25000 Then Print Text1
Loop
Return

'==================== Звонок ==============================
Zumer:
If Zvonok = 1 Then
   Waitms 1                                                 'общая задержка для 4х сек.
   T1 = T1 + 1
   If T1 <= 30 Then
      Faza1 = 1
      Faza2 = 0
      Pitanienabiratela = 0
      Waitms 35                                             'пауза фазы +
      Faza1 = 0
      Faza2 = 1
      Pitanienabiratela = 1
      Waitms 35                                             'пауза фазы -
      Faza2 = 0
   End If
   If T1 = 4000 Then T1 = 0                                 'пауза между звонком (в литре сказано должно 4 сек. но опрос буфера выгребает секунду-две
End If
Return


'=================== Подрограмма набора номера (заранее лучше обнулить N - номер ячейки массива N1 - кол-во тактов набирателя Nabor - шаг набора цифры/номера, запоминает 11 цифр в Cifra(n)
Nabornomera:

Pitanienabiratela = 1                                       'включение питания номеронабирателя
If Nabor = 0 And Naborcifri = 1 Then
    If Prerivanienabiratela = 0 Then
      N1 = N1 + 1
      Nabor = 1
   Waitms 50
   End If
End If

If Prerivanienabiratela = 1 And Nabor = 1 Then
   Nabor = 2
   Waitms 50
End If

If Nabor = 2 And Naborcifri = 1 Then Nabor = 0


If N1 <> 0 And Naborcifri = 0 Then
   If Prerivanienabiratela = 1 Then
      If N1 = 10 Then N1 = 0
         N = N + 1
         Cifra(n) = N1
         If N = 12 Then
            N = 1
            For P = 1 To 11
            Cifra(p) = 0
            Next P
      End If
      Gosub Informacia
      Nabor = 0
      N1 = 0
   End If
End If
Return



'======================  ВЫВОД ГРАФИЧЕСКОЙ ИНФОРМАЦИИ =====================
Informacia:
   'Call Nokia_clear()
   Call Nokia_text(1 , 1 , "-==[GSM СССР]==-" , 1)
   Call Nokia_text(1 , 2 , "Данные с модема:" , 0)
   Call Nokia_text(1 , 3 , "                " , 0)

   Call Nokia_text(1 , 8 , "=RADIOKSTOVO.RU=" , 1)
'тех.информация для отладки набора номера /переменные N/N1/порт Ц2/порт Ц4

   If Left(modem , 6) = "+CLIP:" Then
      Text1 = Mid(modem , 8 , 12)
      Call Nokia_text(1 , 3 , Text1 , 0)

   End If

      Text1 = Left(modem , 16) + Str(tbuf)
      Text1 = Text1 + "   "
      Call Nokia_text(1 , 6 , Text1 , 0)


'===вывод номера
Call Nokia_text(1 , 4 , "Набранный номер" , 0)
For P = 1 To 11
      Text1 = Str(cifra(p))
     Call Nokia_text(p , 5 , Text1 , 0)
Next P

Return

'================================ РАБОТА С БУФЕРОМ И ОПРОСОМ МОДЕМА ========================================
Sim300:

Tbuf = 0
Do
   Tbuf = Tbuf + 1
   Select Case B
       Case 10 : If S <> "" Then
                     Modem = S
                     S = ""
                     Do
                        B = Inkey()
                     Loop Until B = 0
                     Exit Do
                    End If
                  Case Else
         If B > 32 Then
            Tbuf = 0
            S = S + Chr(b) :
         End If
    End Select
    If Tbuf > 25000 Then
           If Len(s) > 30 Then
             S = ""
                     Do
                        B = Inkey()
                     Loop Until B = 0
             Exit Do
             End If
           Exit Do
            End If
  B = Inkey()
   Loop
Return

'================ Подпрограмма режима ожидания===============================================================
Ozhidanie:
If Left(modem , 4) = "RING" Or Left(modem , 5) = "+CLIP" Then       'поступление звонка
         If Zvonok = 2 Then Zvonok = 0                      'если звонок появился и трубка положена, перевести в 1
         If Zvonok = 5 Then Print "ATH"                     'если в режиме набирания номера
End If

If Trubka = 1 And Zvonok = 0 Then Zvonok = 1
If Zvonok = 1 Then                       'если снята трубка, то идём в набор номера
Gosub Nabornomera
Gosub Pravilanabora
Return


Pravilanabora:
If Zvonok = 0 Then
   Text1 = "ATH"
   Gosub Inicilizacija
End If

If Zvonok = 1 Then
   Text1 = "ATH"
   Gosub Inicilizacija
   N1 = 0                                                   'Сбрасываю разные данные.
   N = 0
   Zvonok = 5
   Gosub Nabornomera
End If

If Zvonok = 5 Then
   Gosub Nabor Nomera                                       'зацикливаем

Return


'================ Подпрограмма режима разговора===========================================================
Razgovor:

Return

'========================================================================================
'========================================================================================
'========================================================================================
'========================================================================================





Programma:
Do
'B = Ischarwaiting()
B = Inkey()
If B > 0 Then Gosub Sim300                                  'Getline Modem

Tbuf = 0

T = T + 1

If T = 254 Then
   T = 0                                                    'тупй=ой внутренний таймер, так, нужен для
   If Zvonok <> 5 Then Gosub Informacia

End If













'Waitms 1

Loop




$include "Nokia-1100 Library.inc"
End

Отредактировано Ev3658 (2013-09-06 16:05:27)

0

86

А ещё тут и тут и даже тут

Отредактировано Ev3658 (2013-09-06 16:40:42)

0

87

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

Только ответ и засрали ))) Эххх...

Ну ты извини нас, но нужно было как то прояснить ситуацию с буфером. Больше не будем.  :idea:

0

88

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

ой, помню я тоже как-то радовался очень одному мной "изобретенному", быстрому и простому алгоритму приема данных с порта, всё было супер, пока не собрал второе устройство, где ничего вообще не работало
тут главное - повторяемость

и вообще, с баскомом надо быть аккуратнее, он очень тормозной, а данные надо принемать без задержек

Подскажи, почему с модема приходит "ОК" я его вижу на экране "ОК" принимаю left(modem,2)="OK" или IF modem="OK" .... неважно как, переменная доходит до условия, но условия не распознаёт ОК

0

89

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

Подскажи, почему с модема приходит "ОК" я его вижу на экране "ОК" принимаю left(modem,2)="OK" или IF modem="OK" .... неважно как, переменная доходит до условия, но условия не распознаёт ОК

А "ОК" на русском или английском?

0

90

Что бы понять почему "ок" не распознается, можно его вывести для начала в бинарном виде. За частую, модули делают китайцы и индусы (прошивки), так или иначе надо учитывать кривизну. Бывает один ответ на команду чистый "ОК", а на другую с пробелом(и) или при разных ситуация на одну и туже команду может быть разный ответ. Следовательно алгоритм должен учитывать все эти нюансы "глючности".

0