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

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

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

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



Ломается обмен по USART

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

1

День добрый!
Есть программа, выполняющая некие действия и одновременно ожидающая обмена по USART
Если приходит стартовый байт (100), происходит переключение на обмен данными.
Все это работало, пока не был добавлен оператор waitms 100.  Обмен данными теперь  не происходит.
Что здесь не так?

Код:
Do

  Rwait = Ischarwaiting()
  If Rwait = 1 Then                                         'we got something
     Rchar = Inkey()                                        'get it
     If Rchar = 100 Then
      Inputbin A(1) , 4
      Gosub Razbor
      Gosub Retdata
     End If
     Evo = 0
   Else                                                     'normal work. No exchange

 waitms 100 ' этот оператор имитирует загруженность другими вычислениями
  End If

Loop

0

2

происходит сбивка приёма данных, вы же весь процесс останавливаете на 10 долю секунды (большая задержка), а данные же продолжают втекать, а принимать вы не успеваете
если процессы внутренние велики по времени, то приём надо организовывать по прерыванию

0

3

идёт переполнение приемного буфера МК (2 байта)
в таких случаях используйте прерывание по наличию символа в буфере приёмника uart

я моём конкретном случае, я использовал флаг, который потом анализировал в ходе программы (были боkее критичные к обслуживанию интерфейсы, чем uart)

Код:
 On Urxc V_buffere_uart_est_simvol       ' прерывание при получении символа из ПК

 Enable Interrupts

...

V_buffere_uart_est_simvol:
  Urxc_f = 1                  ' Установим флаг = в буфере есть символ!
Return

...


Priem_iz_pk:                  ' приём данных от ПК  =============================

 Disable Int0                 ' чтобы не прерывало процесс приема данных от ПК
  Disable Urxc
  Reset Watchdog

  Led_rx_uart = 1

  Inputbin Data_my
  If Data_my <> 224 Then Goto Priem_iz_pk_end       ' Это ошибка

  Inputbin Markers
  If Markers > 4 Or Markers < 1 Then Goto Priem_iz_pk_end       ' Это ошибка

  Inputbin Data_1 : Inputbin Data_2 : Inputbin Data_3

 ' Это - стартовый байт и маркеры верны

'  Print "!! Принято от ПК: "
'  Print "M" ; Markers ; "  D1=" ; Data_1 ; " D2=" ; Data_2 ; " D3=" ; Data_3

  Enable Int0                 ' Включить, что бы всё остальное заработало

 Priem_iz_pk_end:

  Urxc_f = 0                  ' сброс флага
  Led_rx_uart = 0
  Enable Urxc

Goto Start_prg

0

4

Ясно. Буфер 2 байта, а посылка у меня 5.
А имеет смысл экспериментировать с увеличением буфера командой
Config Serialin = Buffered , Size = 20  ?
Что-то с ней тоже ничего не работает. Хотя, хелп к ней я еще не полностью изучил, может недочитал что.

0

5

не знаю про увеличение - разве это к аппаратному uart как-то относится? :)

уменьшите скорость обмена в сторону уменьшения

0

6

к аппаратному uart как-то относится?

В том-то и дело:

Configures the hardware UART to use a buffer for input

В хелпе целых два примера с не слишком очевидной логикой.

0

7

в своё время сколько не пытался я использовать баскомовскую система буфферизации, а кроме глюка одного большого - более ничего не получил
бросил я это дело (разбираться) и проблем меньше

0

8

Прикрутил задержку после первого байта.
Но вообще на следующем проекте надо бы разобраться - стандартное решение всегда лучше.

0