Последовательная связь PIC-PIC

Мне нужно отправить всю информацию о порте с одного изображения на другое, используя последовательный порт.

в настоящее время используется скорость передачи данных 9600 бит/с. на pic18f4550 работает на частоте 20 МГц.

я использовал этот код для отправки и получения данных одного порта.

отправлять:

while(1)
{
    TXREG=PORTB;
    while(PIR1.TXIF==0);
    delay_ms(100);
} 

и получите:

while(1) 
{
       while(PIR1.RCIF==0); 
       PORTB=RCREG;
}

на части tx PORTB устанавливается как вход, а на RX PORTB устанавливается как выход.

Мне нужно отправить/получить информацию обо всех портах. Как это можно сделать?

Вам нужно создать пакетный протокол, а не просто отправлять необработанный байт.
любая помощь хо сделать это?
Придумайте протокол, затем реализуйте его. Существует много протоколов, используемых повсюду, вы можете реализовать уже написанный. Или просто придумать свое. Протоколы для этих простых вещей относительно просты — просто оберните свои данные во что-то узнаваемое.
извините за беспокойство, но не могли бы вы указать мне правильное направление?
Вот протокол, который я написал для Arduinos. Это не будет работать на PIC, но вы можете использовать основу того, как это работает, чтобы написать свой собственный: github.com/MajenkoLibraries/ICSC
В то время как протокол для чего-либо более сложного важен для отправки только PORTB, каждый байт последовательного порта может быть PORTB

Ответы (1)

Вам нужно написать простой протокол передачи.

По сути, вам нужно придумать способ, чтобы один PIC сказал другому: «Это начало данных, вот данные, а это конец данных». Это может быть так же просто, как запуск и завершение потока данных идентифицируемыми символами, в идеале символами, которые никогда не будут в вашем потоке данных, или более сложным, когда у вас есть заголовок, описывающий данные, которые вот-вот поступят, и контрольная сумма, чтобы убедиться, что данные были получены правильно.

Самый понятный (для нас) метод — отправить данные в виде чистого текста ASCII, возможно, в виде шестнадцатеричной строки. Таким образом, для 4 портов вы должны отправить 8 символов 0-9A-F, за которыми следует возврат каретки, чтобы отметить конец данных, скажем, поток, например:

017F36AB<cr>
017F36AB<cr>
017F26AB<cr>
017F26AB<cr>
017FA6AB<cr>

и т. д.

Затем ваш принимающий PIC должен декодировать каждый символ в 4-битное значение и объединять пары символов в одно 8-битное значение.

Простейшим методом приема было бы определение массива, достаточно большого для приема всех символов (в данном случае 8 байт). По мере поступления персонажей вы смотрите, является ли это персонажем. Если это так, то вы декодируете символы в своем массиве. Если это 0-9 или AF, то вы перемещаете символы в своем массиве на одну позицию вниз (теряя самый старый), а затем добавляете новый символ в верхнюю часть вашего массива. Это называется скользящим окном , где у вас есть 8-байтовое «окно» для поступающего потока данных, а данные «скользят» за пределы окна.

Более сложная схема была бы такой, как я написал для своей библиотеки ICSC для Arduino, которая определяет отправляющую и принимающую станции (чтобы обеспечить связь между множеством микросхем), команду, блок данных переменной длины и окончательную контрольную сумму. Формат пакета, который я придумал:

(Все значения являются 8-битными, а символические имена являются стандартными значениями ASCII.)

Преамбула:

 76543210
+--------+
| SOH    |
+--------+
| SOH    |
+--------+
| SOH    |
+--------+
| SOH    |
+--------+

Пакет:

 76543210
+--------+
| SOH    |
+--------+
| DestID |
+--------+
| OrigID |
+--------+
| Cmd    |
+--------+
| DatLen |
+--------+
| STX    |
+--------+
| Data 0 |
| Data 1 |
| ...    |
| Data N |
+--------+
| ETX    |
+--------+
| Cksum  |
+--------+
| EOT    |
+--------+

Контрольная сумма — это сумма всех байтов между (но не включая) SOH и ETX, модуль 256.

Специальный адрес назначения 0x00 является широковещательным. Все станции будут получать и реагировать на сообщения, отправленные на этот адрес.

Следует избегать адресов, эквивалентных символам ASCII SOH и т. д.

Прием и идентификация пакетов осуществляется через 6-байтовое скользящее окно, идентифицирующее заголовок пакета. По мере поступления байтов они попадают в верхнюю часть окна и спускаются вниз по мере поступления новых байтов. Если первым байтом окна является SOH, последним байтом — STX, а Dest ID — либо 0x00, либо ID принимающей станции, предполагается, что поступает допустимый пакет. С этого момента байты DatLen затем считываются в буфер данных. Если следующие три байта не равны ETX, действительной контрольной сумме и EOT, пакет отклоняется. В противном случае выполняется функция, связанная с Command.