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

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

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

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


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


Принять протокол с прибора

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

1

Здравствуйте!  Прошу помощи, ситуация такая, Связка прибор, компьютер, и контроллер atmega8, всё это соединено 485 портом. Программа на компьютере опрашивает данные с прибора (4 байта номер устройства в сети, потом отправляет 10H для отдачи показаний) отображаются данные в программе, а atmega должна просто слушать и отображать на led индикатор именно данные после 10H. После того как прибор получил 10H, отдаёт данные в таком виде =000200$

Getchar:
Comchar = Inkey()
                                               
If Comchar = &H20 Then
Comchar = &H01
End If

If Comchar = &H10 Then                             ' старт приёма пакета
Comchar = 0
Flagbuf = 1
End If

If Comchar = &H24 Or Comchar = &H25 Then  ' окончание приёма пакета
Comchar = 0
Flagbuf = 0
End If

If Flagbuf = 1 And Comchar => &H30 And Comchar =< &H39 Then   ' вырезаем служебные символы
Buff = Buff + Chr(comchar)
End If

If Flagbuf = 0 Then
Ind = Val(buff)
Vidacha1 = Str(ind)

Print Buff                                     ' для контроля того что творится в буфере
Buff = ""
Vidacha1 = ""

End If
return

Всё хорошо принимается, но выглядит это так:
200
семь пустых строк
200
Как избавиться от пустых строк? Или как-то изменить алгоритм приёма пакета?

0

2

Вам надо почитать про оператор "ISCHARWAITING".
INKEY - просто читает данные из порта, причем неважно, есть там данные или нет.
Есть ещё "WAITKEY", она работает на подобии как "INKEY", но делает проверку буфера, можно её использовать вместо "INKEY", но у "WAITKEY" есть один недостаток, на нём останавливается выполнение основного потока кода. Если нужно ещё что-то делать, пока нет данных, то лучше через "ISCHARWAITING" делать.

0

3

А вообще в вашем случае, правильнее использовать связку "ISCHARWAITING" + "INPUTBIN" (через массив, если нужно с буфером). И не забывать про "$TIMEOUT", а то может код аварийно подвесится. "$TIMEOUT" настраивается относительно скорости передачи и частоты МК, ставим скажем значение 1000 и смотрим, если всё работает - ок, можно значит попробовать уменьшить значение (чтобы срабатывало быстрее).

Отредактировано RDW (2018-08-10 15:05:19)

0

4

Большое спасибо за совет, принять получилось вот таким образом.

Getchar:

$timeout = 10000
Inputbin Buff
Vidacha1 = Left(buff , 16)           'обрезаем не нужное
Vidacha2 = Right(vidacha1 , 7)
Ind = Val(vidacha2)
Print Vidacha2

Return

Но появилась одна проблема, в строке ответа от прибора есть точка, когда пытался принимать по символам планировал считать в каком байте точка и соответственно зажигать точку на индикаторе...    а сейчас при преобразовании строки в число к примеру 20.0    я получаю только число 20. Переменная ind - long. Как быть, подскажите пожалуйста ещё раз.

0

5

Прибор передает данные не в бинарном виде, всегда только в текстовом? Если в тексте, то "INPUTBIN" использовать необязательно и хранить всё в числовых байтах (можно тогда в обычной строке).
Если нужно преобразовать массив в строку или на оборот, то пользуемся принципом "оверлей".

Код:
Dim Array(5) As Byte
Dim My_string As String * 4 At Array Overlay

Только надо учитывать, что строковая переменная должна всегда заканчиваться нулём (конец строки, особенность Баскома) - это надо учитывать при заполнении строковой переменной через массив байт..

0

6

Да, прибор передаёт значения в строке. Т.е для того чтобы мне избавиться от запятой и посчитать в каком байте она надо разобрать строку оверлей, а потом собрать заново выкинув запятую?    Пока не соображу как..   по оверлей мало как-то примеров на форуме

0

7

Огромное спасибо за помощь с приёмом пакета!  Разобрался как пере собрать строку  по этому примеру http://bascomavr.3bb.ru/viewtopic.php?id=282.   Сейчас всё отлично принимается и отображается.

0


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