**FUR-V2.0: руководство по использованию**

FUR — это сокращение от Fast-Uart-Reg, что означает «быстрый последовательный порт-регистр». Три слова в аббревиатуре описывают особенности этого компонента:
1. Быстрый: протоколы связи FUR основаны на ASCII-коде, который позволяет быстрее считывать данные по сравнению с 16-битными кодами.
2. Последовательный порт: компонент FUR основан на аппаратном обеспечении последовательного порта, которое присутствует в большинстве микроконтроллеров. Если вы умеете работать с последовательным портом, то сможете использовать FUR.
3. Регистр: концепция регистра используется для хранения и обработки данных в FUR. Это будет подробно объяснено ниже.

**Понимание концепции**
Прежде чем начать использовать FUR, необходимо понять концепцию регистров в нём. В микроконтроллерах регистры представляют собой логические устройства или физические элементы на кристалле. Например, SBUF — это регистр данных последовательного порта, который имеет адрес 0x99 и может быть адресован напрямую через инструкции.
В FUR используются только программные регистры. Они могут быть связаны с физическими регистрами или существовать виртуально. Версия V2.0 полностью раскрывает возможности сопоставления и позволяет свободно реализовывать пользовательские функции регистров.
Если вам всё ещё неясно, рекомендуется сначала ознакомиться с протоколом и постепенно изучать FUR.

**Протокол**
FUR использует протокол переменной длины, обеспечивая максимальную гибкость. Общий формат протокола следующий:
**[адрес@номер] операция = данные;**

- Адрес: адрес регистра, 16 бит, допустимые значения от 0 до 65535.
- Номер: номер микроконтроллера при многомашинной коммуникации, 8 бит, от 0 (широковещательный адрес) до 255.
- Операция: поддерживает «+», «−», «*», «/», «&», «|», «^», операции с битами и чтение/запись.
- Данные: данные для операций над регистрами, 16 бит или 16-битное шестнадцатеричное значение от 0x0000 до 0xFFFF.

### Операция сложения
**[адрес@номер]+=данные;**

Например, чтобы увеличить содержимое регистра с адресом 16 на микроконтроллере с номером 2 на 7, отправьте команду **[16@2]+=7;**.
Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]+=7;**.
Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]+=7;**.

### Операция вычитания
**[адрес@номер]-=данные;**

Например, чтобы уменьшить содержимое регистра с адресом 16 на микроконтроллере с номером 2 на 7, отправьте команду **[16@2]-=7;**.
Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]-=7;**.
Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]-=7;**.

### Операция умножения
**[адрес@номер]*=данные;**

Например, чтобы умножить содержимое регистра с адресом 16 на микроконтроллере с номером 2 на 7, отправьте команду **[16@2]*=7;**.
Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]*=7;**.
Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]*=7;**.

### Операция деления
**[адрес@номер]/=данные;**

Например, чтобы разделить содержимое регистра с адресом 16 на микроконтроллере с номером 2 на 7, отправьте команду **[16@2]/=7;**.
Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]/=7;**.
Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]/=7;**.

### Операция И
**[адрес@номер]&=данные;**

Например, чтобы установить младшие 4 бита содержимого регистра с адресом 16 на микроконтроллере с номером 2 равными 0, отправьте команду **[16@2]&=0xFFF0;** или **[16@2]&=65520;**.
Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@2]&=0xFFF0;** или **[16@2]&=65520;**.
Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16@2]&=0xFFF0;** или **[16@2]&=65520;**.

### Операция ИЛИ
**[адрес@номер]|=данные;**

Например, чтобы установить младшие 4 бита содержимого регистра с адресом 16 на микроконтроллере с номером 2 равными 1, отправьте команду **[16@2]|=0x000F;**, **[16@2]|=15;** или даже **[16@2]|=0xF;**.
Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]|=0x000F;**, **[16@0]|=15;** или даже **[16@0]|=0xF;**.
Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]|=0x000F;**, **[16]|=15;** или даже **[16]|=0xF;**.

### Операция исключающего ИЛИ
**[адрес@номер]^=данные;**

Например, чтобы инвертировать D7 бит содержимого регистра с адресом 16 на микроконтроллере с номером 2, отправьте команду **[16@2]^=0x0080;**, **[16@2]^=128;** или даже **[16@2]^=0x80;**.
Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]^=0x0080;**, **[16@0]^=128;** или даже **[16@0]^=0x80;**.
Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]^=0x0080;**, **[16]^=128;** или даже **[16]^=0x80;**.

### Операции с битами
**[адрес@номер].параметр=данные;**

Например, чтобы установить D7 бит содержимого регистра с адресом 16 на микроконтроллере с номером 2 равным 1, отправьте команду **[16@2].7=1;**.
Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0].7=1;**.
Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16].7=1;**.

### Операция чтения
**[адрес@номер]?;**

Например, чтобы прочитать содержимое регистра с адресом 16 на микроконтроллере с номером 2, отправьте команду **[16@2]?;**.
Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]?;**.
Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]?;**.

### Операция записи
**[адрес@номер]=данные;**

Например, чтобы записать значение 596 в регистр с адресом 16 на микроконтроллере с номером 2, отправьте команду **[16@2]=596;**.
Если есть только ведущий и ведомый, можно использовать широковещательную передачу **[16@0]=596;**.
Если номер неизвестен и есть только ведущий и ведомый, номер можно опустить и отправить команду **[16]=596;**.

### Заключение
Основные операции FUR аналогичны обычным операциям с переменными, поэтому их легко запомнить. В следующей таблице приведены три примера, иллюстрирующие эту точку зрения:
| Тип операции | Операция с переменной | Операция FUR |
| :--: | :--: | :--:|
| Присвоение | value=156; | [12]=156; |
| Сложение | value+=156; | [12]+=156; |
| Исключающее ИЛИ | value^=5; | [12]^=5; |

## Методы переноса и низкоуровневое подключение

## API функций

## Дополнительные команды
Помимо перечисленных команд, FUR также предоставляет несколько часто используемых команд.

### Запрос ID
**[id]?;**
Обратите внимание: когда используется один к одному, эту команду можно использовать для запроса идентификационного номера целевого устройства. Однако в конфигурации один ко многим её нельзя использовать, поскольку несколько ведомых устройств могут одновременно реагировать на команду, вызывая хаос на шине.