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

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

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

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


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


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

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

1

Привет, мужики. Решил я управлять предусилителем с ПК по UART. Например, громкость имеет 42 значения, тембры имеют по 14 значений. Чтобы МК понимал, что конкретно я хочу регулировать, я отправляю в UART строку, вида - V1, V2... и т.д. (для VOLUME); T1, T2, T3... и т.д. (для TREBLE), B1, B2, B3... и т.д. (для BASS). По моей задумке, первый символ в начале, должен работать как указатель. Остальное, непосредственно как значение. Перечитав кучу тем здесь и того, что нагуглил, пришёл к выводу, что придётся мне делать вот так.
А именно - колхоз, вида:

Код:
   If U_in = "V0" Then
   If U_in = "V1" Then
   If U_in = "V2" Then
   If U_in = "V3" Then

Неужели придётся 42 значения делать только для громкости??
Не найдётся ли случайно хитрого алгоритма, чтобы сделать например как в PureBasic?
Символ "V" принимаем постоянно, а значением после символа уже манипулируем.

Код:
SetGadgetText(10,"V"+Str(GetGadgetState(0)))  ; получаем параметры, нужный текст + значение из гаджета

Хотелось бы описать приём на стороне МК, примерно так же.

Код:
If U_in = "V"+переменная Then

Это вообще возможно?

Отредактировано sevastopolets (2018-03-22 23:31:14)

0

2

Может скажу крамолу, но можно передать просто байт-значение самой переменной.
Допустим:
с 0 до 14 - один параметр,
с 20 до 34 - другой,
с 40 до 82 - третий...
А потом чрез select case отсортировать
select case X
   case 0 to 14
    -----делаем что то для первого параметра-----
   case 20 to 34
    -----вычисляем значение отняв 20 и делаем что то для второго параметра-----
   case 40 to 82
    -----вычисляем значение отняв 40 и делаем что то для третьего параметра-----
end select

0

3

Есть много способов. К примеру можно исключить первый символ функций DELCHAR и затем преобразовать строку в число функцией Val.

0

4

Спасибо, мужики. Оба варианта рассматривал. Но хотелось бы максимально упростить.
Пробовал отсекать оператором RIGHT, но беда в том, что вернулся к тому с чего начал.
Отсекать придётся каждый раз значение, по приёму этого безобразия.

Код:
   If U_in = "V0" Then
   If U_in = "V1" Then
   If U_in = "V2" Then
   If U_in = "V3" Then
pavel1969 написал(а):

с 0 до 14 - один параметр,
с 20 до 34 - другой,
с 40 до 82 - третий...
А потом чрез select case отсортировать
select case X
   case 0 to 14
    -----делаем что то для первого параметра-----
   case 20 to 34
    -----вычисляем значение отняв 20 и делаем что то для второго параметра-----
   case 40 to 82
    -----вычисляем значение отняв 40 и делаем что то для третьего параметра-----
end select

К этому я тоже пришёл. Думал использовать вместо символа впереди - цифру идентификатор. Но по сути это тоже самое.
Я сейчас сумбурно как-то излагаю, но думаю что суть понятна.

Возможно ли сделать вот так?? --> If U_in = "V"+ЗНАЧЕНИЕ Then

Ну или подобную конструкцию.
Если никак, то буду думать над изменением алгоритма приёма, скорей всего.  :'(

Отредактировано sevastopolets (2018-03-23 00:08:57)

0

5

Может использовать мои символы-указатели в программе МК как константы, а потом принимая данные, не сразу в лоб использовать, а для начала разложить (конвертировать) и потом уже использовать?

0

6

Можно еще упростить и свести все к 6-ти командам.
Регулировка обычно идет 2-мя кнопками (+1) и (-1) к параметру.
Допустим : 10 - это -1, 11 - это +1.
А на приемной стороне МК пусть сам считает сколько раз ему нажали + или -  :)

0

7

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

Возможно ли сделать вот так?? --> If U_in = "V"+ЗНАЧЕНИЕ Then

В принципе возможно все.
Но зачем усложнять алгоритм?
В данном случае, нужно передать текстовое значение. Отделить буквенный идентификатор, а цифровую часть использовать как значение.
По мне, так проще сразу передать значение.

0

8

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

По мне, так проще сразу передать значение.

Согласен. Но я вот упёрся в свой, так называемый ID и всё тут!!  :D
Спасибо. Буду дальше кумекать. К чему то прийду в конце концов.

0

9

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

Отделить буквенный идентификатор, а цифровую часть использовать как значение

Если посылка имеет вид ,например,"V14" можно попробовать разложить строку на значения:

Код:
Dim A As String * 3                                         'сюда принимаем всю посылку "V14"
Dim B As String * 1                                         'сюда кладём символ "V"
Dim C As String * 2                                         'сюда кладём значение "14"

Input A
B = Left(a , 1)
C = Mid(a , 2 , 2)
If B ="V" Then
...
End if


Дальше уже как пожелаете.Например,если В="V",а С="14"-выставляем громкость на 14.Так?

Отредактировано Sergik07 (2018-03-23 17:09:24)

0

10

Как обычно, решение пришло во сне... Гы-ы-ы  ;)

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

If U_in = "V"+переменная Then

Вот эту строку можно записать так:
If U_in = "V" AND переменная=12345  Then
То есть, математический (+) заменить на логический AND.

0

11

Если я правильно понимаю, то UART передает байты, а что в этих байтах - число или строка, ему фиолетово.
И принимающая сторона уже разгребает полученное.

Я к чему: первый принятый байт - идентификатор.
Что там будет - воля программиста, но для МК, например, отправленная "А" - это 65, ни больше ни меньше... ;)

Второй байт - значение. Даже если в отправке будет "B", то МК прочитает 66...

Как расценивать принятое, как число или как строку - воля программиста.

Я правильно понял задачу ? ;)

0

12

Да, UART передает байты (но не всегда, можно так настроить, то будет и больше, но обычно 8 бит).

Отталкиваться от первого байта или другого - нельзя. Если произойдёт сбивка данных (помеха, неконтакт или тупо задержка в обработке), то МК должен это понять и корректно реагировать, приводить в чувства себя для следующего пакета.
Основные принципы передачи - это:

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

0

13

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

То есть, математический (+) заменить на логический AND

Надо попробовать.

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

а что в этих байтах - число или строка, ему фиолетово

Отправляю строку. Пока так удобнее.

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

Как расценивать принятое, как число или как строку

Как отправили, так и принимаем. Воля программиста.  8-)

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

Я правильно понял задачу ?

Задача - отделить мух от котлет  :D
Как я себе это на данный момент вижу - принимаю, например "V22". Отсекаю первый символ. По нему МК будет понимать, что нужно регулировать громкость. А оставшиеся два символа, это непосредственно само значение громкости, которое МК потом отправит дальше.

P.S. принимаю данные с помощью Ischarwaiting() и Inkey(). Клею строку. Повторюсь, но как потом эту принятую и склеенную строку, грамотно расклеить?
Признаться честно, думал будет легче.  :D
Помощь и конструктивная критика, по прежнему приветствуется.

0

14

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

принимаю данные с помощью Ischarwaiting() и Inkey()

Просто input А не подходит? Пост №9

Отредактировано Sergik07 (2018-03-23 17:03:23)

0

15

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

Просто input А не подходит?

Пока нет. По задумке, программа не должна прерываться.

0

16

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

Задача - отделить мух от котлет

Я делаю (в текущем проекте) так (использую стыренный из примеров Александра код):
- передача по два байта в посылке
- принимаю посылку, первый байт информационный, второй - "13" (дес) - конец посылки
- в первой посылке код команды
- во второй посылке значение для команды

Если значения не требуется, вторая посылка игнорируется.

Пример:
127, 13, 100, 13 - лампу (127) включить со значением ШИМ 100
128, 13, <любое значение>, 13 - выключить лампу (128), вторая посылка игнорируется

Пока система не смонтирована, но в имеющемся варианте работала без сбоев.

+1

17

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

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

Это все понятно, но актуально при непрерывном потоке данных.
Тут же - "вялотекущая шизофрения" и супер-пупер контроля не требуется... ;)

0

18

Победил только что вот так. Тупо в лоб:

Код:
If Ischarwaiting() = 1 Then                  'проверка наличия команды в буфере UART

   Getline U_in                                     'вытаскиваем содержимое буфера в переменную U_in

   L_value = 1                                     'количество отсекаемых символов слева
   R_value = 2                                     'количество отсекаемых символов справа
   Leftstring = Left(u_in , L_value)        'отсекаем командой LEFT, символ слева
   Rightstring = Right(u_in , R_value)   'отсекаем командой RIGHT, символы справа

   If Leftstring = "V" Then                    'если левый отсечённый символ = "V"
   Vol_value = Val(rightstring)              ' то преобразовываем правую часть оставшейся строки (2 символа/знака) в число
   Vol_enc = Vol_value                         'копируем значение "служебной" переменной в нужную переменную, для обработки
   'Gosub ... ушли на выполнение
   End If

   If Leftstring = "T" Then
   Vol_value = Val(rightstring)
   Tre_enc = Vol_value
   'Gosub ... Ушли на выполнеине
   End If

   If Leftstring = "B" Then
   Vol_value = Val(rightstring)
   Bas_enc = Vol_value
   'Gosub ... Ушли на выполнение
   End If

Понятное дело, что после тестов и причесать можно будет.  :rolleyes:

Перечитав всё ещё раз, Sergik07 был ближе всех к правде. Спасибо!!

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

B = Left(a , 1)
C = Mid(a , 2 , 2)
If B ="V" Then

-----------------------------------------------------------
P.S. - Для новичков, дополнил код комментариями.
Спасибо всем откликнувшимся.
Работает всё именно так, как мне и было нужно.

Отредактировано sevastopolets (2018-03-23 20:28:31)

0

19

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

Победил только что вот так. Тупо в лоб

Я для своего алгоритма использовал (в нужных объемах) код отсюда Исследование USART, пост 5.

0

20

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

Перечитав всё ещё раз, Sergik07 был ближе всех к правде. Спасибо!!Sergik07 написал(а):B = Left(a , 1)C = Mid(a , 2 , 2)If B ="V" Then-----------------------------------------------------------

Я бы все-таки ушел от String...
UART, как ни крути, а передает байт, т.е. число от 0 до 255.
Для МК глубоко фиолетово, что означают эти числа - число или текст... ;)
С числом проще работать.

0

21

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

Пока нет. По задумке, программа не должна прерываться.

Как она будет прерываться?
Пользуюсь таким кодом:

Код:
      If Ischarwaiting(#1) = 1 Then                         
         Ring = Inkey(#1)

         If Ring = "$" Then
    
            Input #1 , Name_fail Noecho

         End If

      End If

В вашем случае "$" меняем "V" и всё. Потом Name_fail переводим в число через Val и подставляем куда надо. У меня так говорилка управляется. За три года глюков не было.

+1

22

Не могу разобраться, что за сказка началась... ;)
В ходе работы с проектом столкнулся с неправильной передачей данных от МК...
Решил проверить.

В результате вот такой код (для проверки)

Код:
$Regfile="m32adef.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32
$baud = 9600

Dim a As Byte
a = 0

Do

Print "Проба передачи"
Wait 1
Print "Значение = "; a
Wait 1
a = a + 20

Loop

End

Выдает вот такое
http://sa.uploads.ru/t/gk4IZ.jpg
Дня два-три назад все было нормально...

0

23

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

что за сказка началась...

Я конечно не эксперт, но если сыплет такие "кирпичи", то:
1. Проверить кабель
2. Проверить конвертер UART > USB (если таковой присутствует в проекте)
3. Назначить ножки под софтовый UART и ещё раз проверить кабель и переходник
4. На худой конец - сменить программу Terminal, например на Putty или COM Port Toolkit (пользуюсь всеми)

Отредактировано sevastopolets (2018-05-14 23:04:53)

0

24

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

1. Проверить кабель2. Проверить конвертер UART > USB (если таковой присутствует в проекте) 3. Назначить ножки под софтовый UART и ещё раз проверить кабель и переходник4. На худой конец - сменить программу Terminal, например на Putty или COM Port Toolkit (пользуюсь всеми)

1. Проверял. Он же используется и в других случаях.
2. Конвертер живой.
3. Софтовый заводить не хочется, т.к. аппаратный свободен и в нем больше уверенности.
4. Терминал работает в остальных случаях нормально.

С дисплеем Nextion МК общается без проблем, дисплей с ПК через переходник так же.
Связка МК - ПК потребовалась недавно и сразу такие грабли...

При использовании (ранее) Mega8 МК и ПК общались через переходник нормально...
Возможно, эта бяка возникла из-за конкретного Mega32. Попробую сменить на другой однотипный.

0

25

Тактирование от внутреннего генератора или кварца?
Почему в терминале выбрано управление потоком XON/XOF?

0

26

Пётр написал(а):

Тактирование от внутреннего генератора или кварца?
Почему в терминале выбрано управление потоком XON/XOF?

Тактирование от внутреннего генератора.

XON/XOF было включено не мной, так было в программе с первых запусков.
Переключение здесь ситуацию не меняет, за исключением нижних двух позиций (там вообще лажа ;) ).

Думаю, надо копать в сторону UDRE...
Настанут выходные (надеюсь) - сяду поплотнее...

0

27

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

.....Дня два-три назад все было нормально...


Вот это поможет:
Config Com1 = baud , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0

Но без кварца лучше не делать, будет жуткая нестабильность.

0

28

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

Вот это поможет:Config Com1 = baud , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0
Но без кварца лучше не делать, будет жуткая нестабильность.

Попробую и с кварцем.

С дисплеем работает без кварцев и доп. строчек...
Mega8 работает без кварцев и доп. строчек хоть с дисплеем, хоть с компом...

Сенкс, будем пробовать... ;)

0

29

Если есть логический анализатор, подключите его распознаванием протокола USART и посмотрите что покажет.

0

30

Пётр написал(а):

Если есть логический анализатор

На работе приборы есть, но вывезти не дадут...

Тут вопрос только в передаче от МК.
Принимает он четко и без ошибок, но в этом случае используется прием по прерыванию (из исследований Александра).

Поэтому я и нацелился на отправку с учетом состояния UDRE.

0


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