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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » Какими командами лучше организовать работу двух Сом портов


Какими командами лучше организовать работу двух Сом портов

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

1

Есть задача.
Нужно сделать телеграфный контроллер.
Использую Мегу162
Сом1 цепляется к ПК на скорости 9600
Сом2 цепляется на телеграфный канал на скорости 50
С ПК в контроллер по Сом1 присылаются байты. Контроллер фильтрует их:команды исполняет, а данные отправляет транзитом через Сом2 в телеграфный канал.
С телеграфного канала приходит только текст, в котором встречаются командные комбинации символов. Из этих комбинаций контроллер фильтрует только команду "Запрос автоответа"
Остальные команды фильтрует софт на ПК.
С Сом1 я использовал Inkey (см. код) - находил байты сравнивая буфер с 0, т.к. ни команды ни данные в моем протоколе не имеют нулевых байтов
Какую команду использовать для Com2 ? Тут могут с телеграфного канала и нулевой байт прислать.

Код:
$regfile = M162def.dat                                      'подключаем библиотек Мега162
$crystal = 2000000                                          'устанавливаем частоту системной синхронизации


Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 8 , Clockpol = 0       'настраиваем СОМ1
Config Com2 = 50 , Synchrone = 0 , Parity = None , Stopbits = 2 , Databits = 5 , Clockpol = 0       'настраиваем СОМ2

Open "com1:" For Binary As #1                               'открываем порт для связи с ПК                            '
Open "com2:" For Binary As #2                               'открываем порт для связи с телеграфныс каналом


'имена констант для команд поступающих  с ПК на контроллер

Const Datb_minus = &HA3                                     'установить минус на выходе Тлг                                   '
Const Datb_plus = &HAC                                      'установить плюс на выходе Тлг
Const Sbros_contr = &HAA                                    'програмный сброс контроллера
Const Pol_nast = &HA5                                       'прочитать настройки из контроллера
Const Pol_pol = &HA9                                        'получить полярность на телеграфном входе

'имена констант для ответных команд c контроллера на ПК

Const Per_pol_plus = &H90                                   'на телеграфном входе плюс
Const Per_pol_minus = &H97                                  'на телеграфном входе минус
Const Per_nast = &H81                                       'передача настроек на ПК

Dim Autootvet_svoy As String * 20                           'автоответ контроллера

Dim Buf_com1 As Byte                                        'входной буфер на СОМ1
Dim Buf_com2 As Byte                                        'входной буфер на Сом2

'проверяем значение байта в буфере
'если значение не равно 0, то поступил байт с ПК
'проверяем его значение, если команда то переходим на выполнение
'если данные для передачи, то передаем на ТЛГ выход

Buf_com1 = Inkey(#1)                                        'проверяем буфер
If Buf_com1 > 0 Then

Select Case Buf_com1                                        'проверяем значение
Case &HA3 : Goto D_minus
Case &HAC : Goto D_plus
Case &HAA : Goto Sbros
Case &HA5 : Goto P_nast
Case &HA9 : Goto P_pol
Case Else : Goto Tlg_send
End Select

End If                                                      'конец проверки

0

2

Не знаю, поможет ли тебе это, но принять можно. Я работаю с СОМ в основном в прерывании, и асмом, вот кусочек кода, требует вслюченного URXC:

Urxc_isr:

   sbis ucsr0a,7
   rjmp urxc_isr
   Incr Ii
   Modc(ii) = Udr

   If Ii = 1 And Modc(1) <> 30 Then Ii = 0

   If Ii = 2 And Modc(2) <> Mestn_blok Then Ii = 0

   If Ii = 6 Then
   Ii = 0
   Gosub Sum__6
   End If

Return
Чтобы не повисало(вдруг чего) делаешь выход из прерывания по таймеру, равмому времени приема одного символа на твоей скорости

0


Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » Какими командами лучше организовать работу двух Сом портов