Мне нужно отправить всю информацию о порте с одного изображения на другое, используя последовательный порт.
в настоящее время используется скорость передачи данных 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 устанавливается как выход.
Мне нужно отправить/получить информацию обо всех портах. Как это можно сделать?
Вам нужно написать простой протокол передачи.
По сути, вам нужно придумать способ, чтобы один 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.
Маженко
Сурадж Бхавал
Маженко
Сурадж Бхавал
Маженко
Кенни