Номер контакту
|
Призначення
|
Колір дроту
|
1
|
V BUS
|
Червоний
|
2
|
D-
|
Білий
|
3
|
D+
|
Зелений
|
4
|
GND
|
Чорний
|
Обплетення
|
екран
|
---
|
GND – корпус
«земля»
VBus - +5 В
D+ - шина для
передачі даних
D- - шина для
прийому даних.
Кабель для
підтримки повної швидкості шини (full-speed) виконується як кручена пара,
захищається екраном і він може використовуватися для роботи в режимі
мінімальної швидкості (low-speed). Кабель для роботи тільки на мінімальній
швидкості (наприклад, для підключення миші) може бути неекранованим.
1.3 Передача
даних
Інтерфейс USB
сполучає між собою хост (host - головний управляючий пристрій, до якого під'єднуються
однин або декілька USB-пристроїв) та безпосередньо самі пристрої. Хост знаходиться
усередині персонального комп'ютера і управляє роботою всього інтерфейсу. Для
того, щоб до одного порту USB
можна було підключати більше ніж один пристрій, застосовуються USB хаб (usb
hub
- пристрій, що забезпечує підключення багатьох USB присторів до хоста
комп'ютера). Кореневий хаб (root hub
– хаб, який стоїть в ієрархії USB пристроїв найвище) знаходиться всередині
комп'ютера і підключений безпосередньо до хосту комп'ютера. У інтерфейсі USB
використовується спеціальний термін "функція" - це логічно завершений
пристрій, який виконує яку-небудь специфічну процедуру. Топологія інтерфейсу USB
є набором з 7 рівнів: на першому рівні знаходиться хост і кореневий хаб, а на
останньому - тільки функції. Пристрій, до складу якого входить хаб
і одна або декілька функцій, називається складеним.
Порт хаба або
функції, що підключаються до хабу більш високого рівня, називається висхідним
портом, а порт хаба, що підключається до хабу нижчого рівня або до функції
називається низхідним портом.
Хост породжує всі
передачі даних по інтерфейсу. Дані передаються у вигляді пакетів. У інтерфейсі USB
використовується декілька пакетів:
·
пакет-маркер (token
paсket)
описує тип і напрям передачі даних, адресу пристрою і порядковий номер кінцевої
точки (кінцевої точка - частина USB-пристрою,
що адресується); пакети-маркери бувають декількох типів: IN,
OUT,
SOF,
SETUP;
·
пакет з даними (data
packet)
містить дані, що передаються;
·
пакет узгодження (handshake
packet)
призначений для повідомлення про результати пересилки даних; пакети узгодження бувають
декількох типів: ACK,
NAK,
STALL.
Таким чином
кожна транзакція складається з трьох фаз: фаза передачі пакету-маркера, фаза
передачі даних і фаза узгодження.
У інтерфейсі USB
використовуються декілька типів пересилань інформації:
·
управляюче пересилання (control
transfer)
використовується для конфігурації пристрою, а також для інших специфічних для
конкретного пристрою цілей;
·
потокове пересилання (bulk
transfer)
використовується для передачі відносно великого об'єму інформації;
·
пересилання з перериванням (iterrupt
transfer)
використовується для передачі відносно невеликого об'єму інформації, для якого
важлива своєчасна його пересилка. Має обмежену тривалість і підвищений
пріоритет щодо інших типів пересилання;
·
ізохронне пересилання (isochronous
transfer)
також називається потоковим пересилання реального часу. Інформація, що передається
в такому пересиланні, вимагає реального масштабу часу при її створенні, пересиланні
і прийомі.
Потокові пересилання
характеризуються гарантованою безпомилковою передачею даних між хостом
і функцією за допомогою виявлення помилок при передачі і повторного запиту інформації.
Коли хост
стає готовим передавати дані, він посилає функції OUT-пакет,
що супроводжується пакетом з даними. Якщо функція успішно отримала дані, вона
посилає хосту ACK-пакет, інакше
відсилається NAK- або STALL-пакет.
Управляючі
пересилання містять не менше двох стадій: стадія налаштування
і статусна стадія. Між ними може також розміщуватись стадія передачі даних. Стадія
налаштування використовується для виконання SETUP-транзакції,
в процесі якої пересилається інформація в кінцевій точці, якою управляють. SETUP-транзакція
містить SETUP-пакет,
пакет з даним і пакет узгодження. Якщо пакет з даними отриманий функцією
успішно, то вона посилає хосту ACK-пакет.
Інакше транзакція завершується.
Всі транзакції у
стадії передачі даних повинні проводитися в одному напрямі.
У статусній
стадії проводиться остання транзакція, яка використовує ті ж принципи, що і в
потокових пересиланнях. Напрям цієї транзакції протилежний тому, який
використовувався у стадії передачі даних. Статусна стадія служить для
повідомлення про результат виконання SETUP-стадії
і стадії передачі даних. Статусна інформація завжди передається від функції до хоста.
При управляючому записі (Control Write
Transfer)
статусна інформація передається у стані передачі даних статусної стадії
транзакції. При управляючому читанні (Control
Read
Transfer)
статусна інформація повертається у фазі узгодження статусної стадії транзакції після
того, як хост відправить пакет даних нульової довжини в попередній фазі
передачі даних.
Пересилання з
перериванням можуть містити IN-
або OUT-пересилання.
При отриманні IN-пакета функція може повернути
пакет з даними, NAK-пакет
або STALL-пакет.
Якщо у функції немає інформації про переривання, то у фазі передачі даних
функція повертає NAK-пакет.
Якщо робота КТ з перериванням припинена, то функція повертає STALL-пакет.
При необхідності переривання функція повертає необхідну інформацію у фазі передачі
даних. Якщо хост успішно отримав дані,
то він посилає ACK-пакет.
В протилежному випадку хост не відправляє узгоджувальний пакет.
Ізохронні
транзакції містять фазу передачі маркера і фазу передачі даних, але не мають
фази узгодження. Хост посилає IN-
або OUT-маркер,
після чого у фазі передачі даних контрольна точка (для IN-
маркера) або хост (для OUT-
маркера) пересилає дані. Ізохронні транзакції не підтримують фазу узгодження і
повторні пересилання даних у разі виникнення помилок.
1.4
Міст
USB-USB
1.4.1 Загальний
опис
Найлегший шлях
для з’єднання двох комп’ютерів – це використати USB-USB міст показаний на рис.3
та рис.4. Комутуючи два комп’ютери таким кабелем можна передавати файли з
одного комп’ютера на інший, і навіть, створити мережу для доступу в інтернет
через комп’ютер до якого підключені за допомогою такого кабелю (за умов, що цей
комп’ютер має вихід в інтернет).
Рис.3. Вигляд
USB-USB моста
інтерфейс
шина хост мережа
Щодо швидкості,
то мікроконтроллер USB моста може підтримувати стандарт USB 1.1 (12 Мбіт/с) або
USB 2.0 (480 Мбіт/с).
Рис.4. Вигляд
моста зсередини
1.4.2 Встановлення
USB-USB
міст
може працювати у двох режимах: режим прямого з’єднання та в режимі мережі (див.
рис.5).
Для режиму
прямого з’єднання передбачене програмне забезпечення, яке додається в комплекті
з кабелем. Воно дозволяє пересилати чи копіювати вибрані файли на\або з
віддаленого комп’ютера.
Процес
встановлення драйверів для USB-USB
кабелю
залежить від виробника. Потрібно буде, перш за все встановити драйвери, а також
програмне забезпечення, що йдуть в комплекті з кабелем на CD. Ця процедура повинна
бути здійснена на обох комп’ютерах, без підключеного кабелю.
Деякі виробники
постачають два різні файли установки, один для режиму прямого з’єднання, інший
– для режиму мережі. Інші виробники постачають тільки один установочний файл,
який підходить для обох режимів.
Рис.5. Вибір
режиму роботи з програми пересилки
В режимі мережі,
є можливість створити малу мережі між двома комп’ютерами. Після створення такої
мережі з’являється можливість організації спільних папок, принтерів та доступу
до Інтернет.
1.4.2
Використання USB-USB
моста
В даній
лабораторній роботі використовується PCLinq2 Hi-Speed USB Bridge Cable кабель
який дозволяє легко з’єднати два комп’ютери просто приєднавши кабель до кожного
з них. Перед тим як розпочати роботу з програмою PCLinq2 (див. рис.7) потрібно
в першу чергу запустити програму Setup на кожному з комп’ютерів.
Рис.6. Можливі
режими роботи PCLinq2 кабелю
Рис.7. Програма
пересилки PCLinq2, яка відповідає за взаємодію та файлову пересилку між двома
комп’ютерами по PCLinq2 Hi-Speed USB Bridge Cable кабелю
Додаток 1.
Код програми для
роботи із COM
портом
using System;
using System.IO;
using
System.IO.Ports;
using
System.Collections;
using
System.Threading;
namespace Termie
{
public sealed
class CommPort
{
SerialPort
_serialPort;
Thread
_readThread;
volatile bool
_keepReading;
//begin
Singleton pattern
static readonly
CommPort instance = new CommPort();
// Explicit
static constructor to tell C# compiler
// not to mark
type as beforefieldinit
static
CommPort()
{
}
CommPort()
{
_serialPort = new
SerialPort();
_readThread =
null;
_keepReading =
false;
}
public static
CommPort Instance
{
get
{
return
instance;
}
}
//end Singleton
pattern
//begin Observer
pattern
public delegate
void EventHandler(string param);
public
EventHandler StatusChanged;
public
EventHandler DataReceived;
//end Observer
pattern
{
if
(!_keepReading)
{
_keepReading =
true;
_readThread =
new Thread(ReadPort);
_readThread.Start();
}
}
private void
StopReading()
{
if
(_keepReading)
{
_keepReading =
false;
_readThread.Join();//block
until exits
_readThread =
null;
}
}
///
<summary> Get the data and pass it on. </summary>
private void
ReadPort()
{
while
(_keepReading)
{
if
(_serialPort.IsOpen)
{
byte[]
readBuffer = new byte[_serialPort.ReadBufferSize + 1];
try
{
// If there are
bytes available on the serial port,
// Read returns
up to "count" bytes, but will not block (wait)
// for the
remaining bytes. If there are no bytes available
// on the serial
port, Read will block until at least one byte
// is available
on the port, up until the ReadTimeout milliseconds
// have elapsed,
at which time a TimeoutException will be thrown.
int count =
_serialPort.Read(readBuffer, 0, _serialPort.ReadBufferSize);
String SerialIn
= System.Text.Encoding.ASCII.GetString(readBuffer,0,count);
DataReceived(SerialIn);
}
catch
(TimeoutException) { }
}
else
{
TimeSpan
waitTime = new TimeSpan(0, 0, 0, 0, 50);
Thread.Sleep(waitTime);
}
}
}
///
<summary> Open the serial port with current settings. </summary>
public void
Open()
{
Close();
try
{
_serialPort.PortName
= Settings.Port.PortName;
_serialPort.BaudRate
= Settings.Port.BaudRate;
_serialPort.Parity
= Settings.Port.Parity;
_serialPort.DataBits
= Settings.Port.DataBits;
_serialPort.StopBits
= Settings.Port.StopBits;
_serialPort.Handshake
= Settings.Port.Handshake;
// Set the
read/write timeouts
_serialPort.ReadTimeout
= 50;
_serialPort.WriteTimeout
= 50;
_serialPort.Open();
StartReading();
}
catch (IOException)
{
StatusChanged(String.Format("{0}
does not exist", Settings.Port.PortName));
}
catch
(UnauthorizedAccessException)
{
}
catch
(Exception ex)
{
StatusChanged(String.Format("{0}",
ex.ToString()));
}
// Update the
status
if
(_serialPort.IsOpen)
{
string p =
_serialPort.Parity.ToString().Substring(0, 1); //First char
string h =
_serialPort.Handshake.ToString();
if
(_serialPort.Handshake == Handshake.None)
h = "no
handshake"; // more descriptive than "None"
StatusChanged(String.Format("{0}:
{1} bps, {2}{3}{4}, {5}",
_serialPort.PortName,
_serialPort.BaudRate,
_serialPort.DataBits,
p, (int)_serialPort.StopBits, h));
}
else
{
StatusChanged(String.Format("{0}
already in use", Settings.Port.PortName));
}
}
///
<summary> Close the serial port. </summary>
public void
Close()
{
StopReading();
_serialPort.Close();
StatusChanged("connection
closed");
}
///
<summary> Get the status of the serial port. </summary>
public bool
IsOpen
{
get
{
return
_serialPort.IsOpen;
}
}
///
<summary> Get a list of the available ports. Already opened ports
/// are not
returend. </summary>
public string[]
GetAvailablePorts()
{
return
SerialPort.GetPortNames();
}
///
<summary>Send data to the serial port after appending line ending.
</summary>
/// <param
name="data">An string containing the data to send. </param>
public void
Send(string data)
{
if (IsOpen)
{
string
lineEnding = "";
switch
(Settings.Option.AppendToSend)
{
case
Settings.Option.AppendType.AppendCR:
lineEnding =
"\r"; break;
case
Settings.Option.AppendType.AppendLF:
lineEnding =
"\n"; break;
case
Settings.Option.AppendType.AppendCRLF:
lineEnding =
"\r\n"; break;
}
_serialPort.Write(data
+ lineEnding);
}
}
}
}