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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Приём данных по UART с ПК


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

Сообщений 91 страница 120 из 154

91

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

Как из такой строки AT+CCLK="13/09/25,13:25:33+05" отобрать числа для дальнейшего использования ?


Здесь описание команды MID

+1

92

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

Как из такой строки AT+CCLK="13/09/25,13:25:33+05" отобрать числа для дальнейшего использования ?

Открываем BASCOM, в меню Помощь есть ветка Bascom language reference и в ней раздел STRING. Там достаточно команд, чтобы разобрать любую строку на части.
В приведённом примере скорее всего написан ответ модуля GSM с запросом текущей даты и времени, так вот ответ модуля надо привести так, как он есть на самом деле со всеми знаками.

+2

93

sasha_1973 Как в вашем примере правильно очистить переменную (Temp_usart_0_input_buffer_str) что бы принять новые данные ?

Отредактировано olegkaras (2019-03-14 22:01:24)

0

94

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

sasha_1973 Как в вашем примере правильно очистить переменную (Temp_usart_0_input_buffer_str) что бы принять новые данные ?


Это временный буфер, в котором собираются принятые данные.
После получения {13}+{10} (конец строки), данные копируются в "Usart_0_input_buffer_str", а "Temp_usart_0_input_buffer_str" очищается.
Тем самым освобождается место для приёма следующего пакета данных.


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

Вам главное успеть их обработать здесь, проще всего скопировать в другую строковую переменную (input_data_sim_module_str):

      If Usart_0_flag_data_input > 0 Then

          input_data_sim_module_str = Usart_0_input_buffer_str   'забираем принятые данные

          flag_data_sim_module = 1  'поднимаем флаг, что данные приняты

          Gosub Usart_0_clearing_buffer_receive    'готовим переменные для приёма следующих данных
      End If

      if flag_data_sim_module > 0 then

тут разбираете данные или командой "mid"

или если есть разделители

командой "split"

          flag_data_sim_module = 0
      end if

0

95

Бесконечное клонирование буферов - это моветон. Если данные не успевать обрабатывать, то никакой памяти никогда не хватит. ;)

0

96

sasha_1973 Дайте пожалуйста пример как работать с  split .

0

97

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

Дайте пожалуйста пример как работать с  split .

https://avrhelp.mcselec.com/index.html?split.htm

Одно неудобство - разделители в строке должны быть однотипными...
Для вашей строки AT+CCLK="13/09/25,13:25:33+05" это мало подойдет, тут лучше MID или ISR, или использовать их в паре.

Отредактировано Nord (2019-03-16 01:41:13)

0

98

Вижу неоднократно в примерах Александра такие строки

Код:
$baud = 4800
Ucsr0a.1 = 1      ' Двойная скорость работы USART, скорость трансляции = $baud * 2


Что это дает ?
Не проще ли $baud = 9600 ?

0

99

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

Вижу неоднократно в примерах Александра такие строки
Что это дает ?
Не проще ли $baud = 9600 ?


В Bascom 2.0.7.1 - 9600 при 1 МГц некорректно работает, в 2.0.8.1 ошибку исправили, а привычка осталась.

+1

100

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

sasha_1973 Дайте пожалуйста пример как работать с  split

Пример

Dim Buffer_gps As String * 200              'разбираемая на составляющие строковая переменная
  Dim Count_data_gps As Byte                  'счетчик массива строковых переменных
  Dim Data_gps_str(40) As String * 20      'массив строковых переменных

  Const Const_sumbol_split_gps = ","      'каким символом разделяются данные

  Count_data_gps = Split(Buffer_gps , Data_gps_str(1) , Const_sumbol_split_gps)
  Buffer_gps = ""

0

101

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

В Bascom 2.0.7.1 - 9600 при 1 МГц некорректно работает

Значит, при 8МГц  Ucsr0a.1 = 1  можно коцнуть и выставить сразу 9600, если я правильно понял ? ;)

0

102

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

Значит, при 8МГц  Ucsr0a.1 = 1  можно коцнуть и выставить сразу 9600, если я правильно понял ?


Точно в "10"  :cool:

При малых частотах МК, какие-то скорости ещё не работают, если не ошибаюсь на 1,8432 МГц не работает 115200

+1

103

Тогда еще вопрос... ;)
Вот здесь Исследование Ds1307 МК работают на 1МГц или "около этого"...
Это связано с DS1307 или с чем-то другим ?
На данный момент в проекте все работает при 8МГц...

Отредактировано Nord (2019-03-16 04:48:54)

0

104

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

Тогда еще вопрос...
Вот здесь Исследование Ds1307 МК работают на 1МГц или "около этого"...
Это связано с DS1307 или с чем-то другим ?
На данный момент в проекте все работает при 8МГц...

Отредактировано Nord (Сегодня 03:48:54)


Да ни с чем не связано, просто так расположились звёзды.

+1

105

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

Это временный буфер, в котором собираются принятые данные.
После получения {13}+{10} (конец строки), данные копируются в "Usart_0_input_buffer_str", а "Temp_usart_0_input_buffer_str" очищается.
Тем самым освобождается место для приёма следующего пакета данных.

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

Вам главное успеть их обработать здесь, проще всего скопировать в другую строковую переменную (input_data_sim_module_str):

      If Usart_0_flag_data_input > 0 Then

          input_data_sim_module_str = Usart_0_input_buffer_str   'забираем принятые данные

          flag_data_sim_module = 1  'поднимаем флаг, что данные приняты

          Gosub Usart_0_clearing_buffer_receive    'готовим переменные для приёма следующих данных
      End If

      if flag_data_sim_module > 0 then

тут разбираете данные или командой "mid"

или если есть разделители

командой "split"

          flag_data_sim_module = 0
      end if

При отправлении строки на RX1 - Usart_1_flag_data_input  = 0 а должен быть 1 ?

Отредактировано olegkaras (2019-03-16 22:28:37)

0

106

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

При отправлении строки на RX1 - Usart_1_flag_data_input  = 0 а должен быть 1 ?


Если > 0, значит что-то получили

0

107

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

Если > 0, значит что-то получили

Вот в вашем примере открываю протеус убераю связь между микроконтролерами , подключаю терминал , отправляю данные , данны отображаются только в переменной USART_0_FLAG_RESIVED_USART - значит что-то получили а переменная Usart_1_flag_data_input  = 0 , это как ?

0

108

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

данны отображаются только в переменной USART_0_FLAG_RESIVED_USART - значит что-то получили а переменная Usart_1_flag_data_input  = 0 , это как ?


Скиньте то, что у Вас не работает мне на mail, прям, как есть, ничего не изменяя.

0

109

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

подключаю терминал , отправляю данные


Если терминал Протеуса

http://sh.uploads.ru/t/O94b3.jpg

то он не передаёт {10} перевод каретки, соответственно, пакет не считается принятым.

Должно быть так

http://s9.uploads.ru/t/FHOhA.jpg

+1

110

Теперь понятно. Значит мне нужно как то сделать чтобы пакет принимался без десятки , ведь СИМ900 не пришлет в конце десятку . СИМ900 в конце присылает ОК , помогите заменить 10 - ку на ОК.

Отредактировано olegkaras (2019-03-19 21:47:05)

0

111

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

ведь СИМ900 не пришлет в конце десятку


SIM900 печатает данные не в ряд, а с новой строки, значит {13}+{10} присутствует

0

112

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

SIM900 печатает данные не в ряд, а с новой строки, значит {13}+{10} присутствует

Тоже столкнулся с этим безобразием. К сожалению формат ответа от GSM модуля имеет в своём составе много 10 и 13.
Вот наиболее типичный ответ:
<CR><LF>+CMD1:<данные><CR><LF>
<CR><LF>OK<CR><LF>
При этом я не стал заморачиваться. Сконфигурировал порт на приём в режиме буфера и принимал всё вот так:
'---------------------------------------- Чтение буфера -------------------------------------------------
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
При этом все символы с кодами <32  отсекались и в буфере был чистый ответ. Разбор строки ответа было уже делом простым.
Да, забыл добавить. В моём случае использовались два UART. Оба были настроены на буферизированный приём.
ПО одному МК общался с GSM модулем, а по втjрому была связь МК <-> ПК.
Всё работало одновременно без сбоев на скорости 9600.

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

0

113

Эти {13}+{10}  каким терминалом на компе можно запилинговать, хочу посмотреть все что отправляет СИМ900 .

0

114

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

Эти {13}+{10}  каким терминалом на компе можно запилинговать, хочу посмотреть все что отправляет СИМ900 .

Terminal 1.9b

я пользуюсь этим

0

115

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

При этом все символы с кодами <32  отсекались и в буфере был чистый ответ.


Ситуативный подход к решению !

Мне кажется, это не совсем правильно. Надо принимать всё, и правильно обрабатывать.

Хотя с другой стороны, на кой ляд универсальные решения.

0

116

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

При этом все символы с кодами <32  отсекались и в буфере был чистый ответ

C Таким подходом в буфере будет каша мола вида: "+CMD1:<данные>OK" - такое разбирать не чуть не легче.
<CR><LF> в конце надо оставлять или упрощать до одного из.

0

117

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

C Таким подходом в буфере будет каша мола вида: "+CMD1:<данные>OK" - такое разбирать не чуть не легче.

Элементарно Ватсон. :crazyfun:
Во первых всё это уже не в буфере, а в строке приёма, например StrRS.
Определяем длину строки X=LEN(StrRs).
Ищем позицию : Pos=CharPos(StrRs,":") и забираем код ответа если нужно. В данном случае CODE=Left(StrRs, Pos).
Затем с позиции : + 1 выделяем строку данных, т.е DATA=Mid(StrRs, Pos+1, X).
И если нужны чистые данные отсекаем последние два символа, т.е. ОК. Находим длину DATA, и командой Left забираем эту длину - 2 символа.
Всё.

+1

118

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

Надо принимать всё

Зачем рыться в мусоре, когда его можно отбросить заранее? :dontknow:

0

119

У меня такой вопрос , при обращении к СИМ900 нужно ли добавлять в конце {13}+{10} ?

0

120

olegkaras

The  "AT"  or  "at"  prefix  must  be  set  at  the  beginning  of  each  Command  line.  To  terminate  a Command line enter <CR>.     
Commands are usually followed by a response that includes. "<CR><LF><response><CR><LF>" Throughout this document, only the responses are presented,<CR><LF> are omitted intentionally.   

Префикс «AT» или «at» должен быть установлен в начале каждой командной строки. Для завершения командной строки введите <CR>.
Команды обычно сопровождаются ответом, который включает. «<CR> <LF> <response> <CR> <LF>» В этом документе представлены только ответы, <CR> <LF> намеренно опущены.

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

+2


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Приём данных по UART с ПК