|
AT86RF211
|
TR3000
|
RXQ1-433.9
|
ER400TRS
|
Рабочая
частота (МГц)
|
400-950
|
433,92
|
433,92 и
434,33
(2
канала)
|
433,92
|
Максимальная
скорость передачи
данных
(кбит/с)
|
64
|
115,2
|
20
|
19,2
|
Максимальная
дальность связи(м)
|
-
|
250
|
250
|
250
|
Внешняя
синхронизация
|
требуется
|
не
требуется
|
не
требуется
|
не
требуется
|
Напряжение
питания (В)
|
2,4
|
3
|
3
|
5
|
Вариант
исполнения
|
микросхема
|
микросхема
|
готовая
сборка
|
готовая
сборка
|
По
скорости передачи и рабочей частоте подходят все четыре варианта. Для
обеспечения максимальной простоты управления, AT86RF211, требующий
внешней синхронизации, как вариант не подходит. Из оставшихся трёх трансиверов
самыми удобными, в плане дальнейшего схемоэлектрического выполнения будут RXQ1-433.9
и ER400TRS, которые
являются уже готовыми сборками – трансиверами и не требуют дополнительных внешних
цепей. Отсутствие этих цепей так же гарантирует соответствие указанных
параметров, т.к. разброс номинальных значений используемых элементов сказывается
на стабильности этих параметров. Решающим моментом в выборе будет напряжение
питания. Напряжение питания величиной 5 В у ER400TRS
позволяет
использовать сам компьютер как источник стабилизированного напряжения питания.
Итак,
останавливаем выбор на трансивере ER400TRS. Подробные
технические параметры и схема включения в приложении 4.
Он
обладает следующими параметрами :
·
Рабочая
частота, МГц – 433,92
·
Максимальная
дальность связи, м – 250
·
Максимальная
пропускная способность, кбит/с – 19,2
·
Сопротивление
антенны, Ом – 50
·
Диапазон
рабочих температур, °С – от – 20 до +65
Эти параметры полностью удовлетворяют
исходным данным для проектирования. Выбранный трансивер представляет собой плоский
корпус с однорядным вертикальным расположением выводов.
Схематичное изображение конструкции
трансивера можно увидеть на рисунке 4 .
Рис.
4. Схематичное
изображение конструкции трансивера
Описание
интерфейса COM-порта (RS-232)
Последовательный
интерфейс для передачи данных в одну сторону использует одну сигнальную линию,
по которой информационные биты передаются друг за другом последовательно. Такой
способ передачи и определяет название интерфейса и порта, его реализующего. Эти
названия соответствуют английским терминам Serial Interface и Serial Port.
Последовательная передача данных может осуществляться как в асинхронном, так и
синхронном режимах.
При
асинхронной передаче каждому байту
предшествует старт-бит, сигнализирующий приемнику о начале очередной посылки,
за которым следуют биты данных и, возможно, бит паритета (контроля четности).
Завершает посылку стоп-бит, как показано на рисунке 5, гарантирующий
определенную выдержку между соседними посылками.
Рис.
5. Передача
одного байта последовательных данных
Старт-бит
следующего посланного байта может посылаться в любой-момент после окончания
стоп-бита, то есть между передачами возможны паузы произвольной длительности.
Старт-бит, имеющий всегда строго определенное значение (лог. 0), обеспечивает
простой механизм синхронизации приемника по сигналу от передатчика.
Подразумевается, что приемник и передатчик работают на одной скорости обмена,
измеряемой в количестве передаваемых бит в секунду. Внутренний генератор
синхронизации приемника использует счетчик-делитель опорной частоты, обнуляемый
в момент приема начала старт-бита. Этот счетчик генерирует внутренние стробы,
по которым приемник фиксирует последующие принимаемые биты. В идеале эти стробы
располагаются в середине битовых интервалов, что обеспечивает возможность
приема данных и при некотором рассогласовании скоростей приемника и
передатчика.
Для
асинхронного режима принят ряд стандартных скоростей обмена: 50, 75, 110, 150,
300, 600, 1200, 2400. 4800, 9600, 19200, 38400, 57600 и 115200 бит/с. Количество
бит данных может составлять 5, 6, 7 или 8 (5-и, 6-битные форматы мало
распространены). Количество стоп-бит может быть 1, 1,5 и 2 ("полтора
бита" подразумевает, естественно
только длительность стопового интервала).
Асинхронный
обмен реализуется с помощью COM-порта
с использованием протокола RS-232. Стандарт RS-232 использует несимметричные
передатчики и приемники - сигнал передается относительно общего провода -
схемной земли. Логической единице соответствует уровень напряжения на входе
приемника в диапазоне -12...-3 В. Логическому нулю соответствует напряжение в
диапазоне +3...+12 В. Между уровнями -3...+3 В имеется зона нечувствительности,
обусловливающая гистерезис приемника: состояние линии будет считаться
измененным только после пересечения соответствующего порога.
Рабочие
напряжения трансивера лежат в диапазоне 0 - 5 В. Т.е. высокому логическому
уровню (логической единице) соответствует напряжение 5 В , а низкому
логическому уровню (логическому нулю) соответствует напряжение 0 В. Видно, что
возникает необходимость согласования уровней напряжения трансивера и COM-порта.
Для этого будем использовать микросхему MAX232,
которая преобразует напряжение из +5 В в -10 В и из 0 В в 10 В
и обратно при том, что её напряжение питания +5 В. Подробно о параметрах и
схеме включения в приложении 5.
Исходя
из всего вышесказанного, можно составить структурную схему приёмо-передающего
модуля, которая изображена на рисунке 6.
Рис.
6. Структурная
схема приёмо-передающего модуля
3. Расчёт
электрической принципиальной схемы
Так
как связь модуля с компьютером будет осуществляться через последовательный
порт, то первым делом рассмотрим интерфейс портов. В таблице 2 приведено
назначение контактов разъемов СОМ-портов. Назначение контактов разъема DB25S
определено стандартом EIA/TIA-232-E, разъем DB9S определен стандартом
EIA/TIA-574.
Таблица
2
Обозначение вывода
|
Контакт разъема
|
Направление
вход/выход
|
Назначение вывода
|
DB25S
|
DB9S
|
PG
|
1
|
-
|
-
|
Protect Ground - Защитная земля
|
TXD
|
2
|
3
|
выход
|
Transmit Data -Передаваемые данные
|
RXD
|
3
|
2
|
вход
|
Receive Data -Принимаемые данные
|
RTS
|
4
|
7
|
выход
|
Request To Send - Запрос на передачу
|
CTS
|
5
|
8
|
вход
|
Clear To Send - Готовность модема к
приему данных для передачи
|
DSR
|
6
|
6
|
вход
|
Data Set Ready -Готовность модема к
работе
|
SG
|
7
|
5
|
-
|
Signal Ground - Схемная земля
|
DCD
|
8
|
1
|
вход
|
Data Carrier Detected -Несущая обнаружена
|
DTR
|
20
|
4
|
выход
|
Data Terminal Ready -Готовность
терминала (PC) к работе
|
Активному
состоянию сигнала ("включено") и логической единице передаваемых
данных соответствует отрицательный потенциал (ниже -3 В) сигнала интерфейса, а
состоянию "выключено"
и логическому нулю - положительный (выше +3 В). Назначение сигналов интерфейса
приведено в таблице 3.
Таблица 3
Сигнал
|
Назначение
|
PG
|
Защитная земля, соединяется с
корпусом устройства и экраном кабеля
|
SG
|
Сигнальная (схемная) земля,
относительно которой действуют уровни сигналов
|
TXD
|
Последовательные данные - выход
передатчика
|
RXD
|
Последовательные данные - вход
приемника
|
RTS
|
Выход запроса передачи данных;
состояние "включено" уведомляет модем о наличии у терминала данных
для передачи. В полудуплексном режиме используется для управления
направлением - состояние <включено> является сигналом модему на
переключение в режим передачи
|
CTS
|
Вход разрешения терминалу передавать
данныне. Состояние "выключено" аппаратно запрещает передачу данных.
Сигнал используется для аппаратного управления потоками данных
|
DTR
|
Выход сигнала готовности терминала к
обмену данными. Состояние "включено" поддерживает коммутируемый
канал в состоянии соединения
|
DSR
|
Вход сигнала готовности от
аппаратуры передачи данных (модем в рабочем режиме подключен к каналу я
закончил действия по согласованию с аппаратурой на противоположном конце
канала)
|
DCD
|
Вход сигнала обнаружения несущей
удаленного модема
|
RI
|
Вход индикатора вызова (звонка). В
коммутируемом канале этим сигналом модем сигнализирует о принятии вызова
|
|
|
|
При
использовании девяти контактного штекера DB9 для подключения к COM-порту
будем выполнять соединение по следующей схеме, изображённой на рисунке 7.
Рис.
7. Схема
подключения к COM-порту
Подключение
по такой схеме позволяет осуществлять как приём, так и передачу при минимальном
количестве задействованных выводов. Один провод для приёма (RXD),
второй для передачи (TXD) и
сигнальная земля, относительно которой изменяются уровни входных и выходных
сигналов.
Как
уже было сказано, для согласования уровней сигналов RS-232
и трансивера используем микросхему MAX232.
Рассмотрим её типовую схему включения, изображённую на рисунке 8.
Рис.
8. Типовая
схема включения MAX232
Очевидно,
что выход порта (TXD) будет подключаться к
одному из входов R (выводы 8 и 13) микросхемы MAX232,
а вход (RXD) к одному из выходов Т
(выводы7 и 14). Для передачи будем использовать вывод 13 - вход,
соответствующим выходом которого является вывод 12. Для приёма используем вывод
14 – выход, соответствующим входом которого является вывод 11. Такой вариант подключения
существенно упростит разработку печатной платы из-за удобного расположения
используемых выводов.
Теперь остаётся разобраться
с передачей преобразованного сигнала непосредственно к трансиверу. Для этого рассмотрим
его интерфейс. Трансивер имеет 9 выводов. Их назначение описано в таблице 4.
Таблица
4
№
вывода
|
Название
|
Назначение
|
1
|
Antenna
|
Вывод
для подключения антенны сопротивлением 50 Ом.
|
2
|
RF
Ground
|
Заземление
высокочастотного тракта (антенны). Соединяется с общей землёй.
|
3
|
RSSI
|
Индикатор уровня
принимаемого сигнала.
|
4
|
Busy
Output
|
Цифровой выход,
информирующий о том, что трансивер готов к получению информации от
компьютера.
|
5
|
Serial
Data Out
|
Цифровой информационный
выход, передающий информацию, принимаемую трансивером.
|
6
|
Serial
Data In
|
Цифровой
информационный вход трансивера.
|
7
|
Host Ready
Input
|
Цифровой вход,
информирующий трансивер о том, что компьютер готов принять информацию от
трансивера.
|
8
|
Vcc
|
Напряжение питания в
диапазоне 3.6 - 5,5 В.
|
9
|
Ground
|
Заземление питания.
|
Из таблицы видно, что два
вывода (1 и 2) используются для подключения антенны, два (8 и 9) для питания,
два (5 и 6) – информационные и три (3,4 и 7) – служебные (управляющие). Один из
информационных выводов является выходом приёмника (5- Serial
Data Out),
другой входом передатчика (6 - Serial
Data In).
Остаётся только подать преобразованное до нужного уровня напряжение с TTL
выхода
MAX232 на вход трансивера, а его выход соединить
со TTL входом MAX232.
Напряжение
питания трансивера и микросхемы MAX232
совпадают и равны +5 В, что позволяет подключать их к одному источнику питания
без использования дополнительного преобразования напряжения.
Полученная
схема модуля практически полностью совпадает с рекомендованной производителем
схемой, за исключением двух сглаживающих конденсаторов в цепи питания. Поэтому
будем использовать указанную в технической документации трансивера схему
включения.
Рассчитанная
электрическая принципиальная схема приёмо-передающего модуля изображена в
приложении 1 на рисунке П1.1.
4. Разработка
печатной платы приёмо-передающего модуля
Так
как высокочастотная часть только одна – это соединение антенны и антенного
входа трансивера, то особых требований к длине и ширине дорожек, а так же
расстоянию между дорожками не предъявляем. Выполняем разводку одним слоем и как
можно плотнее с целью уменьшения геометрических размеров приёмо-передающего
модуля. Площадку для крепления антенны располагаем непосредственно рядом с
соответствующим выводом трансивера и как можно ближе к краю печатной платы для
удобного вывода её из корпуса модуля.
Печатная плата изготавливается
из одностороннего фольгированного текстолита толщиной 1 мм методом травления. Со
стороны проводников плата покрывается диэлектрическим слоем лака за исключением
мест крепления (припаивания) элементов. Диаметр монтажных отверстий для
элементов равен 1мм. Для крепления разъёма питания DJK-02B
делаются прямоугольные отверстия размером 3х0,5 мм.
Разводка
печатной платы изображена на рисунке 9 в масштабе 2:1. Геометрические размеры
готовой печатной платы 47х40 мм.
Рис.9. Разводка
печатной платы
5. Обоснование
требований к электрическим параметрам источника питания и выбор возможного его
типа.
Требования
к источнику питания предъявляются с учётом полученного энергопотребления и
требуемой стабильности питающего напряжения.
Требуется
внешний источник питания, подключаемый к модулю через стандартный DC
разъём
DJK-02B.
Напряжение питания +5 В. Максимальный ток, потребляемый трансивером ER400TRS,
составляет 23 мА, а микросхемой MAX232 –
10 мА. С учётом дополнительных потерь и запаса по току, источник питания должен
отдавать в нагрузку ток не менее 50 мА. Значение напряжения питания не должно
отклоняться от номинального не более чем на 25мВ. Это требование, предъявляемое
трансивером к питанию. Учитывая это, рассчитаем максимально допустимый
коэффициент пульсаций:
К = Um/U0
где
Um –амплитуда отклонения
напряжения питания, U0 –
напряжение питания .
К=
0,025/5 = 0,005
Т.е.
требуется стабилизированный источник питания с коэффициентом пульсаций не
более 0,005.
Полученные
требования к источнику питания:
напряжение
питания - 5 В;
ток,
отдаваемый в нагрузку - не менее 50 мА;
6. Выбор типа антенны.
Для
осуществления связи подойдёт любая антенна для частоты 433,92 МГц. Другим
вариантом может быть самостоятельное изготовление антенны. Им и воспользуемся.
При этом отпадает необходимость монтажа разъёма для крепления антенны, т.к. в
этом случае она будет припаяна непосредственно к плате.
Будем
использовать рассчитанный вариант антенны для частоты 433,92 МГц, предложенный
в [6] и изображённый на рисунке 10.
Рис.
10. Эскиз
антенны
Антенна
выполняется из отрезков медной проволоки в эмалевой изоляции. Полная длина
антенны, вместе с катушкой индуктивности около 68 нГн, составляет 90 мм.
7. Выбор
и обоснование модели и протоколов взаимодействия компьютеров в сети.
Все
компьютеры одной сети должны быть настроены на одинаковую скорость работы в
радио эфире. Каждый компьютер сети должен иметь свой адрес, отличный от
остальных. Адресом компьютера может являться любое десятичное чисто в диапазоне
от 0 до 255. Это означает, что одной сети может принадлежать не более 256
компьютеров. Программно реализован пакетный обмен информацией. Такой принцип
обмена позволяет не монополизировать общий эфир одним компьютером в момент
передачи.
Разработанное
программное обеспечение позволяет
принимать и отправлять файлы, а также осуществлять обмен короткими текстовыми
сообщениями. Каждый пакет (порция информации) должен доставляться конкретному
получателю, в то время как у других пользователей доступ к этой информации должен
отсутствовать. Поэтому в пакете содержится как адрес получателя, так и адрес отправителя.
Для проверки достоверности принятых данных в пакет добавляется информация о
контрольной сумме. Для текстовых сообщений установим размер пакета равный 100
байтам. Структура такого пакета изображена на рисунке 11.
Рис.
11. Структура
пакета сообщения
Видно,
что текстовое сообщение не должно превышать 95 байт (символов).
При
обмене файлами компьютер-получатель должен иметь информацию о размере
получаемого файла и его имени. Поэтому в пакет добавляются 12 байт имени файла
и 4 байта, определяющие его размер. Каждая посылка несёт в себе 300 байт
информации файла. Структура пакета при передаче файлов изображена на рисунке 12.
Рис.
12. Структура
пакета передачи файлов
Между
передачей пакетов делается секундная технологическая пауза. Такие установленные
размеры пакетов позволяют надолго не занимать эфир и осуществлять попеременную
передачу всеми компьютерами сети.
8. Разработка алгоритмов
сетевой программы
Сетевая
программа должна работать четырёх режимах:
- приём
сообщения;
- отправка
сообщения;
- приём
файла;
- отправка
файла.
Прежде
чем отправлять пакет информации его нужно сформировать. Чтобы максимально
уменьшить объём служебной информации в пакете будем кодировать значение размера
файла и контрольной суммы. Рассмотрим принцип кодирования на примере. Допустим, что
размер файла составляет 8573291 байт. Разобьём последовательно это число на
части по две цифры, начиная с единиц.
8
| 57 | 32 | 91
Очевидно,
что число 91 означает количество единиц. Число 32 – количество сотен, 57 –
количество десятков тысяч и 8 – количество миллионов. Каждое число может
принимать значение от 0 до 99, это означает, что его можно описать одним байтом.
Поэтому на указание размера файла уходит 4 байта. Нужно заметить, что при этом
максимальное значение размера файла, которое можно передать 255999999. Т.е.
программа может передавать файлы размером не более 255999999 байт.
Аналогично
кодируется и контрольная сумма, но только тремя байтами. Этого достаточно, т.к.
подсчитывается сумма значений 318-ти байт и 318*255 = 81090 - максимальное
значение контрольной суммы. При передаче сообщений в пакет добавляется лишь
контрольная сумма и 2 адреса.
На
принимающей стороне программа,
читая соответствующие байты, восстанавливает значение размера и суммы,
перемножая значения байтов и их соответствующих множителей.
Размер
файла = 8*106 + 57*104 + 32*100 + 91 = 8573291 байт.
Перед
началом отправки какой-либо информации, нужно убедиться, что эфир свободен для
избежания возникновения коллизий (пересечения потоков). Если уже осуществляется
передача, то каждый ППМ, независимо от того в каком из режимов он сейчас
находится, выставляет флаг наличия входного сигнала в порту компьютера.
Поэтому, проверяя установлен ли флаг, можно установить состояние эфира.
Организуем эту проверку следующим образом. Обозначим переменную, которая будет
служить своего рода накопительным массивом. Через каждые 10 мили секунд
программа проверяет состояние флага. Если эфир свободен, т.е. флаг не
установлен, значение переменной увеличивается на единицу, если занят –
уменьшается. Переменная принимает только положительные значения, значит, при
постоянном уменьшении сохраняет значение ноль. Отправка начнётся после 0,5
секундного «простоя» эфира, т.е. когда значение переменной будет превышать 50. Алгоритм
проверки эфира изображён на рисунке 13.
Рис.
13. Алгоритм
проверки эфира
Цикл
проверки эфира завершён – начинается передача. Передающая сторона, сформировав
пакет в указанной в разделе 7 последовательности, по команде начинает передачу.
По различным причинам (помеха, сбой) целостность пакета и достоверность информации
во время передачи может быть нарушена. Поэтому необходимо организовать проверку
верности доставки. Для этого и передаётся контрольная сумма в составе каждого пакета.
По величине её значение равно сумме значений всех байт пакета за исключением
последних трёх, отведённых для самой суммы. Приняв пакет, программа вычисляет
сумму всех, кроме трёх последних, байт и сравнивает со значением контрольной
суммы, восстановленным из этих трёх байт. Если значения обеих сумм равны, то
это означает, что пакет доставлен верно, и программа уведомляет об этом
передающую сторону, посылая сообщение в виде массива из ста единиц. Если же
значения сумм не совпадают (доставлено не верное сообщение), то посылается
массив из ста нулей. После этого программа переходит в режим приёма для
получения следующего или этого же пакета, в зависимости от результата проверки.
Это уведомляющее сообщение не содержит в себе адресов получателя и отправителя,
т.к. за время проверки равенства сумм ни один другой компьютер сети не займёт
эфир, выжидая 0,5 секундного «простоя» эфира, и отреагирует на это сообщение
только передающая сторона, которая его ожидает. После каждой отправки пакета с
данными, программа переходит в режим приёма для получения уведомляющего
сообщения. Если в принятом сообщении количество единиц превышает 70%, то
программа переходит к отправке следующей порции информации. Если в нём более
70% нулей, то программа заново отправляет это же пакет. Критерий в 70% задан
для того, чтобы в случае частичного нарушения целостности и изменения значений
некоторых байт уведомляющего сообщения, программа на передающей стороне
зафиксировала верный результат. Потому как, в случае безошибочного приёма
пакета, принимающая сторона перейдёт в режим получения следующего пакета.
Программа
на передающей стороне читает из указанного пользователем файла порции
информации и затем передаёт их. Когда файл передан полностью, программа
возвращается в меню. На принимающей сторона программа, принимая эти порции,
записывает их последовательно в файл с именем, указанным в первом и каждом
последующем принимаемом пакете. Приняв файл полностью, программа так же
возвращается в меню выбора режима работы. Для передачи/приёма сообщений
используются те же принципы, только с другой структурой пакета, указанной в
разделе 7.
Далее изображён
алгоритм работы программы.
Краткое
описание программы
После
запуска программы, по её запросу, пользователь должен ввести номер своего
компьютера в сети выбрать скорость связи. После подтверждения выбора на экране
появляется меню выбора режима работы.
1
– работа с общениями
2
– работа с файлами
3
- выход
После
выбора пункта 1 (работа с сообщениями) появляется подменю : 1 – отправить
сообщение 2 – принять сообщение
Выбрав
нужное действие, пользователь вводит требуемую программой информацию, соблюдая,
указываемые при этом, требования.
Те
же действия и при выборе пункта 2.
После
выполнения выбранных операций программа переходит в главное меню.
Для
выхода в систему нужно выбрать пункт 3.
Заключение
В результате проведённой
работы был разработан приёмо-передающий модуль, отвечающий всем предъявленным к
нему требованиям. Его использование позволяет организовать радиосеть с числом
пользователей до 128. Компактные размеры, небольшой вес и низкое
энергопотребление модуля дают возможность использовать его в сочетании с
мобильным переносным компьютером (ноутбуком). Вариант такого применения:
менеджер крупного магазина или склада, перемещая по его территории, может в
реальном времени обновлять каталог товаров, что позволяет другим сотрудникам
или покупателям иметь самую свежую информацию.
Разработанное
сетевое программное обеспечение даёт возможность пользователям обмениваться
текстовыми сообщениями и файлами.
Использование
других программ, управляющих модулем через COM-порт,
может расширить спектр его применения.
ПРИЛОЖЕНИЕ
1
Электрическая
принципиальная схема приёмо-передающего модуля
ПРИЛОЖЕНИЕ
2
Перечень
элементов
ПРИЛОЖЕНИЕ
3
Полный текст
программного обеспечения с подробными комментариями
#include <dos.h>
#include <conio.h>
#include <io.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys\stat.h>
#include <iostream.h>
void main()
{
// Описание используемых переменных
unsigned char
buf[300],paket[321],filename[12];
unsigned char name[8],text[90],SMS[100],put[50];
int i,k,speed,regim,IP,IP_OUT,metka;
int mill,tys,sotni,ostatok;
unsigned int
handle,bytes,kusok,kuskov,paketsize=300;
unsigned long dlina,summ,summ_in;
unsigned char SUMM[100],S1[100];
clrscr(); //
Очистка экрана
//
Меню выбора скорости передачи и номера компьютера
printf("Выберите
нужную скорость:\n\n");
printf("
1 - 1200 bps\n 2 - 2400 bps\n");
printf(" 3 - 4800 bps\n 4 -
9600 bps\n");
printf(" 5 - 19200 bps\n\n");
scanf("%i",&speed);
// Ввод
номера данного компьютера
do
{
printf("\nВведите
номер компьютера(от 0 до 128): ");
scanf("%i",&IP);
if(IP>128) printf("\n !
Не более 128
!");
}
while
(IP>128);
// Вывод на экран информации о
выбранных параметрах
cout<<"-------------------------------------------------------------------";
printf("\nВыбранные
параметры:");
printf("\n\nНомер
компьютера: %i\n",IP);
if (speed
== 1) {speed=96; printf("Скорость связи: 1200
bps\n"); }
if (speed == 2) {speed=48; printf("Скорость связи: 2400
bps\n"); }
if (speed == 3) {speed=24; printf("Скорость связи: 4800
bps\n"); }
if (speed == 4) {speed=12; printf("Скорость связи: 9600
bps\n"); }
if (speed == 5) {speed=6; printf("Скорость связи: 19200
bps\n"); }
cout<<"-------------------------------------------------------------------";
// НАСТРОЙКА
ПОРТА
//
Установка скорости передачи
outportb(0x3fb,131);
//режим установки скорости
outportb(0x3f8,speed);
outportb(0x3fb,3);
//режим приёма/передачи
//
Выбор режима работы
printf("\n Порт
настроен.");
MENU:
printf("\nДля начала работы выберите
нужный пункт:\n\n\n");
printf("
1 – Работа с сообщениями \n");
printf("
2 – работа с файлами \n");
printf(" 3 - Выход\n");
scanf("%i",®im);
if (regim==1) goto CHAT;
if (regim==2) goto FILE;
if (regim==3) exit(1);
//------------------------------------------------------------------------
//
РЕЖИМ ОТПРАВКИ/ПРИЁМА сообщений
CHAT:
inportb(0x3fd); // снятие флага наличия
байта в приёмнике
clrscr(); // очистка экрана
// Выбор
нужной операции
printf("\n\nВыбирите
нужную операцию:");
printf("\n\n 1-
отправить сообщение | 2- принять сообщение\n");
scanf("%i",®im);
if (regim==1) goto SEND_SMS;
if (regim==2) goto RECEIV_SMS;
clrscr();
SEND_SMS:
// отправка сообщения
clrscr();
printf("\nВведите
ваше имя (не более 8 символов): ");
scanf("%s",&name);
// Ввод
номера получателя
printf("\nВведите
номер получателя (от 0 до 128): ");
scanf("%i",&IP_OUT);
//
Ввод текста сообщения
printf("\n\nВведите
текст сообщения (не более 85 символов) ");
printf("\nВместо
пробелов '_':\n");
scanf("%s",&text);
// Цикл
очистки массива сообщения
for(i=0;i<100;i++)
{
SMS[i]=0;
}
// Формирование
массива сообщения
SMS[0]=IP_OUT;
// адрес получателя
SMS[1]=IP;
// адрес отправителя
dlina=strlen(name); //
опр. длины имени
for
(i=2;i<(2+dlina);i++) // цикл добавления к массиву
{
// имени отправителя
SMS[i]=name[i-2];
}
metka=2+dlina;
SMS[metka]=':';
metka++;
dlina=strlen(text);
// длина текста сообщения
for
(i=metka;i<(metka+dlina);i++) // цикл добавления к массиву
{
// текста сообщения
SMS[i]=text[i-metka];
}
printf("\nВведено
сообщение :\n");
// Вывод
на экран введённого сообщения
for(i=2;i<100;i++)
{
printf("%c",SMS[i]);
}
// Подсчёт
контрольной суммы
summ=0;
for(i=0;i<97;i++)
{
summ=summ+SMS[i];
}
// Формирование
массива контрольной суммы и её добавление в
// сообщение
tys=summ/1000;
// сколько тысяч в сумме
sotni=(summ-tys*1000)/100; //
сколько сотен без тысяч
ostatok=summ-tys*1000-sotni*100; // остаток
SMS[97]=tys;
SMS[98]=sotni;
SMS[99]=ostatok;
// Проверка
свободен ли эфир и ожидание его освобождения
i=0;
do
{ if((inportb(0x3fd)&1)==0) i=i++;
else i=i--;
i=abs(i);
delay(10);
inportb(0x3fd); // сброс флага
}
while(i<50);
printf("\nЭфир
свободен.Отправка собщения.");
// Отправка
сообщения
SEND:
for(i=0;i<100;i++)
{
while(!(inportb(0x3fd)&32));
outportb(0x3f8,SMS[i]); //
запись в порт байта
}
// Принятие
массива контроля суммы
for(i=0;i<100;i++)
{
while(!(inportb(0x3fd)&1));
SUMM[i]=inportb(0x3f8);
}
//
Подсчёт процента единиц
k=0;
for(i=0;i<100;i++)
{
if(SUMM[i]==1)
k++;
}
//
Если единиц более 70% - сообщение доставлено верно
if
(k>70)
{
printf("\nСообщение
успешно доставлено");
goto CHAT;
}
else // если
менее 70% - повторное отправление
{
delay(1000);
goto SEND;
}
//----------------------------
RECEIV_SMS: //
режим приёма сообщений
clrscr(); // очистка
экрана
// Снятия
флага наличия байта в приёмнике, если он выставлен
inportb(0x3f8);
printf("\n Ожидание
сообщения");
// Цикл
очистки массива сообщений
AGAIN:
for(i=0;i<100;i++)
{
SMS[i]=0;
}
// Приём сообщения
for(i=0;i<100;i++)
{
while(!(inportb(0x3fd)&1));
SMS[i]=inportb(0x3f8);
}
// Проверяется
этому компьютеру пакет или нет
if
(SMS[0]==IP)
{
// проверка
контрольной суммы
summ=0;
summ_in=0;
for(i=0;i<97;i++)
{
summ=summ+SMS[i];
}
summ_in=(SMS[97]*1000+SMS[98]*100+SMS[99]);
if(summ==summ_in)
{
// если верное сообщение отправка массива единиц
for(i=0;i<100;i++)
{
while(!(inportb(0x3fd)&32));
outportb(0x3f8,1);
}
//
вывод полученного сообщения
printf("\nПолучено
сообщение от компьютера № %d\n",SMS[1]);
for
(i=2;i<97;i++)
{
printf("%c",S1[i]);
}
goto
MENU;
}
else
{
// если не верное
сообщение отправка массива нулей
for(i=0;i<100;i++)
{
while(!(inportb(0x3fd)&1));
outportb(0x3f8,0);
}
goto AGAIN;
}
}
else goto AGAIN;
// РЕЖИМ ПРИЁМА/ПЕРЕДАЧИ
ФАЙЛОВ
FILE:
clrscr(); // очистка экрана
// Вывод
подменю
printf("\n
Выберите:");
printf("n\
1- отправить файл 2- принять файл\n");
scanf("%i",®im);
if (regim==1) goto PEREDACHA;
if (regim==2) goto PRIOM;
PEREDACHA:
clrscr(); // очистка экрана
// Ввод
номера получателя
printf("\nВведите
номер получателя(от 0 до 128): ");
scanf("%i",&IP_OUT);
// Ввод
имени и пути
printf("\nВведите
полное имя файла(не более 12 символов):\n");
scanf("%s",&filename);
printf("\nВведите
путь к файлу (файл не более 60 мб):\n");
scanf("%s",&put);
//
Чтение файла или вывод ошибки чтения
if ((handle
= open(put, O_RDONLY | O_BINARY)) == -1)
{
printf("\nОшибка
открытия файла\n");
getch();
exit(1);
}
//
Определение длины файла
dlina=filelength(handle);
printf(" Длина
файла: %li \n",dlina);
//
Определения количества пакетов
kuskov=dlina/paketsize;
//
Если остаток то увеличиваем количество пакетов на 1
if
(paketsize*kuskov<dlina) kuskov=kuskov+1;
printf(" Всего пакетов = %i
\n",kuskov);
kusok=0;
//
Ограничение размера пакета если файл меньше его размера
if
(dlina<paketsize) paketsize=dlina;
//
Вычислене значений байтов размера файла
mill=dlina/1000000;
tys=(dlina-mill*1000000)/10000;
sotni=(dlina-mill*1000000-tys*10000)/100;
ostatok=dlina-mill*1000000-tys*10000-sotni*100;
//
Формирование пакета
paket[0]=IP_OUT;
// адрес получателя
paket[1]=IP;
// адрес отправителя
paket[2]=mill; //
paket[3]=tys; //
paket[4]=sotni; //
размер файла
paket[5]=ostatok; //
//
добавление имени
for(i=0;i<12;i++)
{
paket[i+6]=filename[i];
}
REED:
if ((bytes = read(handle,buf,paketsize)) == -1)
{
printf("Ошибка чтения\n");
getch();
exit(1);
}
else
{
kusok++;
}
//
Цикл добавления к массиву информации из файла
for
(i=18;i<318;i++)
{
paket[i]=buf[i-18];
}
// Подсчёт
контрольной суммы
summ=0;
for(i=0;i<318;i++)
{
summ=summ+paket[i];
}
// Формирование
массива контрольной суммы и её добавление в // сообщение
tys=summ/10000;
sotni=(summ-tys*10000)/100;
ostatok=summ-tys*10000-sotni*100;
paket[318]=tys;
paket[319]=sotni;
paket[320]=ostatok;
SENDFILE:
// Проверка
свободен ли эфир и ожидание его освобождения
i=0;
do
{ if((inportb(0x3fd)&1)==0) i=i++;
else i=i--;
i=abs(i);
delay(10);
inportb(0x3fd); // сброс флага
}
while(i<50);
// Передача пакета
for(i=0;i<321;i++)
{
while(!(inportb(0x3fd)&32));
outportb(0x3f8,paket[i]); // загрузка
байта в порт
}
// Принятие
массива контроля суммы
for(i=0;i<100;i++)
{
while(!(inportb(0x3fd)&1));
SUMM[i]=inportb(0x3f8);
}
//
Подсчёт процента единиц
k=0;
for(i=0;i<100;i++)
{
if(SUMM[i]==1)
k++;
}
//
Если единиц более 70% - сообщение доставлено верно
if (k>70)
{
gotoxy(30,12);
delline();
delay(1000);
// Вывод
на экран процента отправленной информации
if(kusok==kuskov)
{
printf("Отправлено 100
%");
}
else
{
printf("Отправлено %i
%",(100/kuskov)*kusok);
}
//
Проверка последний ли пакет и вычисление его размера
if
(kusok==kuskov) // если верно – файл доставлен
{ // вывод
сообщения
printf("\n\n\nФайл
успешно доставлен");
printf("\nДля
переходя в меню нажмите любую клавишу");
getch();
goto MENU;
}
if (kusok==(kuskov-1)) // если
верно - остался последний
{
// вычисление
размера последнего пакета
paketsize=(dlina-paketsize*(kuskov-1));
goto REED;
}
if (kusok<kuskov) goto REED;
}
else
{
goto SENDFILE;
}
//------------------
PRIOM:
// Cнятия флага наличия байта
в приёмнике если есть
inportb(0x3f8);
clrscr(); // очистка
экрана
printf("\n Ожидается файл\n\n\n");
kusok=0;
RECF:
//
Начало приёма при наличии сигнала в приёмнике
for(i=0;i<318;i++)
{
while(!(inportb(0x3fd)&1));
paket[i]=inportb(0x3f8);
}
//
Проверка по адресу пришёл файл или нет
//
Если нет то возврат в режим приёма
if(paket[0]==IP)
{
// Если
первый пакет, то вывод общей информации о файле
if(kusok==0)
{
IP_OUT= paket[1];
printf("\nПринимается файл от компьютера №
%d",paket[1]);
for(i=0;i<12;i++)
{
filename[i]=paket[i+6];
}
printf("\nИмя файла -
%s",filename);
dlina=paket[2]*1000000+paket[3]*10000+paket[4]*100+paket[5];
printf("\nРазмер файла - %li байт",dlina);
//
Создание файла для записи пакетов
if
((handle = open(filename, O_CREAT | O_TEXT)) == -1)
{
perror("\nОшибка создания файла");
getch();
exit(1);
}
}
else;
// Вычисление контрольной суммы
summ_in=paket[318]*10000+paket[319]*100+paket[320];
summ=0;
for(i=0;i<318;i++)
{
summ=summ+paket[i];
}
if(summ==summ_in)
{
//
Если верное сообщение отправка массива единиц
for(i=0;i<100;i++)
{
while(!(inportb(0x3fd)&32));
outportb(0x3f8,1);
}
//
О пределения количества пакетов
kuskov=dlina/paketsize;
//
Если остаток то увеличиваем количество пакетов на 1
if
(paketsize*kuskov<dlina) kuskov=kuskov+1;
printf("\nВсего пакетов = %i
",kuskov);
//
Ограничение размера пакета если файл меньше его размера
if (dlina<paketsize)
paketsize=dlina;
//
Выделение содержимого исходного файла из пакета
for(i=0;i<paketsize;i++)
{
buf[i]=paket[i+18];
}
//
Отсчёт принятых пакетов
kusok=kusok+1;
//
Запись пакета в файл
write(handle,buf,paketsize);
//
Определение количества оставшихся пакетов для приёма
gotoxy(30,20);
delline();
if(kusok==kuskov)
{
printf("Принято 100
%");
}
else
{
printf("Принято %i
%",(100/kuskov)*kusok);
}
//
Проверка последний ли пакет и вычисление его размера
if
(kusok==kuskov)
{
printf("\n\n\nФайл
успешно принят");
printf("\nДля
переходя в меню нажмите любую клавишу");
//
Закрытие доступа к файлу
close(handle);
getch();
goto MENU;
}
// Если
осталось принять один пакет, то вычисляется его размер
if (kusok==(kuskov-1))
{
paketsize=(dlina-paketsize*(kuskov-1));
goto REED;
}
if (kusok<kuskov) goto RECF;
}
else
{
//
Если не верное сообщение отправка массива нулей
for(i=0;i<100;i++)
{
while(!(inportb(0x3fd)&1));
outportb(0x3f8,0);
}
// повторный приём пакета
goto RECF;
}
}
//
файл не по этому адресу - возврат в режим приёма
else
goto RECF;
}
// КОНЕЦ ПРОГРАММЫ
ПРИЛОЖЕНИЕ
4
Официальная
техническая документация фирмы LPRS.
Микросборка
ER400TRS.
ПРИЛОЖЕНИЕ
5
Официальная
техническая документация фирмы MAXIM.
Микросхема
MAX232.
Список
литературы
1. ГОСТ
19.003-80. Единая система программной документации. Схемы алгоритмов и
программ. Обозначения условные графические.
2. Подбельский
В.В. Язык «Си++» . – М.: «Финансы и статистика», 1999. – 559 с.
3. Фролов
А.В., Фролов Г.В. Аппаратное обеспечение персонального компьютера. – М.:
Диалог-МИФИ, 1997. – 304 с.
4. Официальная
техническая документация фирмы LPRS.
Микросборка ER400TRS.
5. Официальная
техническая документация фирмы MAXIM.
Микросхема MAX232.
6.