HP-50g: основы работы с последовательным портом (COM)

В статье мы рассмотрим основы работы с последовательным портом для калькулятора HP-50g. Но вначале немного о том, что из себя представляет соединительный кабель, как его приобрести или изготовить самостоятельно.

HP-50g схема соединительного кабеля для последовательного портаМодели калькуляторов HP-50g оснащены последовательным COM-портом (RS-232), для которого, в отличие от прежней модели 48, производитель не поставляет в комплекте соединительный провод.

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

Кроме простого способа приобретения кабеля в магазине аксессуаров HP (англ.), открытая GPLv3 лицензия позволяет вам повторить конструкцию собственными силами, вооружившись необходимыми компонентами и паяльником, а также модернизировать её по своему усмотрению. Вот, например, принципиальная схема на базе микросхемы MAX232, которой радиолюбителю может оказаться достаточно для выполнения работы. С неё, собственно, и начался проект в свое время.

Необходимо также упомянуть об особенностях последовательного порта калькулятора.

  • Поддерживаются соединения только по линиям Rx, Tx и GND
  • Напряжение +/-5в (вместо обычных 12в)

Кабель для последовательного порта HP-50gПоскольку я посчитал, что 20 долларов за готовый кабель-адаптер - это более выгодно, чем покупка компонентов с последующим их монтажом и пайкой, то шнур был приобретен еще 2 года назад вместе с нуль-модемным переходником ("мама-мама"), позволяющим воткнуть его в порт компьютера. Если такого порта у вас нет, то подойдет и любой переходник USB-COM.

Далее примеры будут содержать маленькие скрипты на Питоне, который является стандартом де-факто для написания относительно простых программ подручными средствами под Linux. Если вы работаете с Windows, то вначале установите Питон или воспользуйтесь другими вами предпочитаемыми средствами, позволяющими считывать и записывать данные из последовательного порта. Например, можно и вовсе обойтись программой Hyperterminal, позволяющей отображать полученные из последовательного порта данные.

Пересылка строки из HP-50g на компьютер

Программа для HP-50g на UserRPL будет иметь очень простой вид

«
  -33 CF     @ Флаг "передача по проводу"
  -78 SF     @ Флаг "использовать последовательный порт" (а не USB)
  9600 BAUD  @ Скорость 9600 бод
  0 PARITY   @ 0 - без контроля четности
  "HELLO"    @ Строка для передачи
  XMIT       @ Отсылаем
  -78 CF     @ Возвращаем флаг "использовать USB"
»

На компьютере принимать ASCII-строку из 5 байт будет Питон-скрипт, я назвал соответствующий файл recv.py.

#!/usr/bin/env python
import serial
 
ser = serial.Serial(
    port = '/dev/ttyS0',
    baudrate = 9600,
    parity = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    bytesize = serial.EIGHTBITS
    )
s = ser.read(5)
print s
ser.close()

Для обладателей USB-переходника вместо "железного" COM-порта, значение параметра port будет примерно таким '/dev/ttyUSB0'. Подробнее см. статью о подключении HP-50g к компьютеру под Linux.

Под Windows то же значение будет соответствовать номеру реального или виртуального COM-порта, например port = 'COM1'.

Наконец, компьютер и калькулятор соединены кабелем. Теперь запускаем из командной строки recv.py, скрипт ждет приема.
python recv.py
На калькуляторе запускаем нашу программу пересылки строки.

Если все в порядке, то на экране калькулятора появится единица (или 0, если отправить строку не получилось), а на консоли компьютера появится слово HELLO.

Прием строки, посланной с компьютера

Программа приема несколько изменится

«
  -33 CF     @ Флаг "передача по проводу"
  -78 SF     @ Флаг "использовать последовательный порт" (а не USB)
  9600 BAUD  @ Скорость 9600 бод
  0 PARITY   @ 0 - без контроля четности
  14         @ Длина принимаемой строки в байтах
  SRECV      @ Приём
  -78 CF     @ Возвращаем флаг "использовать USB"
»

На компьютере посылать строку будет скрипт send.py.

#!/usr/bin/env python
import serial
 
ser = serial.Serial(
    port = '/dev/ttyS0',
    baudrate = 9600,
    parity = serial.PARITY_NONE,
    stopbits = serial.STOPBITS_ONE,
    bytesize = serial.EIGHTBITS
    )
 
ser.write('Hello from PC!')
ser.close()

Теперь запускаем всё наоборот: сначала программу на калькуляторе, затем скрипт на компьютере. Если все сделано верно, то на экране HP-50g в нижней строке будет 1 (или 0 при ошибке), а во второй - полученный текст.

HP-50g получение строки через последовательный порт

Конечно, показанные примеры достаточно примитивны и рассчитаны на начинающего. Однако, руководствуясь аналогичными принципами, изучив другие немногочисленные команды управления последовательным портом (BUFLEN, OPENIO и т.д.), вы сможете в дальнейшем не только реализовать установленные производителем того или иного устройства протоколы обмена, но и разрабатывать свои собственные.

File attachments: