Технический форум по робототехнике.
lorry » 28 фев 2016, 02:55
Scorpio, пожалуйста, поясните, что вы подразумеваете под XOR и KC? Я не совсем понимаю о чем идет речь.
XOR это сложение по модулю 2, КС как я понимаю это контрольная сумма. Или не так? Просветите. Может мы говорим об одном и том же только разными словами?
Scorpio » 28 фев 2016, 08:33
Да, все верно. XOR (исключающее ИЛИ) - это последовательное сложение по модулю 2 всех байт строки. Примитивно, но в нашем случае вполне достаточно. Под КС я имел в виду более сложные алгоритмы подсчета контрольной суммы.
lorry » 28 фев 2016, 11:10
И как используете XOR для передачи данных?
Scorpio » 28 фев 2016, 18:48
В конце пакета вставляется байт XOR всех предыдущих байт. Он проверяется на стороне приемника.
Myp » 28 фев 2016, 19:22
передача 3х цифр с контроллера на компьютер это детский примитив
в программе на пк принимаются данные из компорта и принятые строки складывается в буфер, размер которого делается с нужным запасом.
из буфера строки берутся по очереди и парсятся на значения, это элементарно, вот так в делфи например:
var
s:string;
list:TStrings;
begin
list :=TStringList.Create;
s :='123;567;1023'; //исходная строка
ExtractStrings([';'], [' '], PChar(s), list); //строка разбивается по разделителю ; или любому другому какой нравится.
end;
в TStrings лежат 3 значения которые преобразуются в число например StrToInt(list[0])
Добавлено спустя 14 минут 14 секунд:
кстати, со стороны контроллера программа передачи значений напряжения данных ещё проще будет
Serial.print(analogRead(analogIn1));
Serial.print(";");
Serial.print(analogRead(analogIn2));
Serial.print(";");
Serial.println(analogRead(analogIn3));
Dmitry__ » 28 фев 2016, 19:40
Myp писал(а):из буфера строки берутся по очереди и парсятся на значения
Так XOR и есть самый простой парсер

Умрешь различать начало и конец чисел без доп. символов. Я так понимаю, в твоем случае, строки - это CR/LF символы? Ну так XOR делает тоже самое, плюс элементарная проверка на корректность. Такшта - XOR - минимально возможный элемент передачи данных по послед. шинам в нашем шумном мире

Scorpio » 28 фев 2016, 20:44
А зачем в данном случае передавать в символьном виде? По запросу от ПК передал 6 байт параметров + XOR.
Dmitry__ » 28 фев 2016, 20:56
Scorpio писал(а):А зачем в данном случае передавать в символьном виде?
Так многие и не знают что можно передавать не символами, printf же

Байты для них - хакерство, вот и непонимание xor-ов и crc.
Добавлено спустя 6 минут 29 секунд:Scorpio писал(а):По запросу от ПК передал 6 байт
Ой, забыл, угадай название след. темы? "Как преобразовать двоичный код в десятичный"

lorry » 29 фев 2016, 01:08
Scorpio писал(а):В конце пакета вставляется байт XOR всех предыдущих байт. Он проверяется на стороне приемника.
Понято, но ведь это то же что и использовать символ окончания пакета, разве что это еще одна дополнительная проверка на правильность передачи.
Dmitry__ » 29 фев 2016, 01:19
lori писал(а):Понято, но ведь это то же что и использовать символ окончания пакета
Это еще и увеличение в 2 раза передаваемых байт, т.к. цифра в ASCII занимает байт, а байтом можно передать 2 десятичные цифры.
Scorpio » 29 фев 2016, 06:17
lori писал(а): но ведь это то же что и использовать символ окончания пакета
Символ окончания пакета м.б. только в символьном терминале. Он д.б. всегда одинаковый. XOR же всегда разный, т.к. зависит от содержания пакета. Если длина пакета заранее известна, то символ окончания не нужен. А XOR позволяет контролировать, что данные не искажены. UART запросто может передать неверное число, если скорость синхронизации приемника и передатчика разойдуться или линия слишком длинная. Многое зависит от физического уровня. RS232 или 485 или это просто TTL. Будет там скрутка или экранированные провода и т.д и т.п. Это я больше для топикастера пишу, остальные собеседники и так в курсе.
Myp » 01 мар 2016, 01:39
Dmitry__ писал(а):Умрешь различать начало и конец чисел без доп. символов.
Во многой мудрости много печали.
функция типа serial.read читает строку и кладёт её в буфер. не надо не начало ни конец искать, оно само всё делает, на ардуине делаешь Serial.println и всё.
функция ExtractStrings разбирает эту строку на части, тоже знать ничё не надо, просто поставь ; в нужном месте.
Dmitry__ писал(а):в нашем шумном мире

насколько много шума будет в шине между мегой328 и преобразователем uart->usb которые распаяны на одной ардуине на расстоянии в 1-2 см друг от друга?
ЗЫ
но вобще, у меня на работе, ребята делают свои штуковины в которых процессоры на одной плате по модбасу через 485 общаются, хотя там максимум 10 сантиметров дистанция, задача сводится к отображению текста на символьном экране, а корпус девайса стальной экранированный)))
Dmitry__ » 01 мар 2016, 02:29
Myp писал(а):хотя там максимум 10 сантиметров дистанция, задача сводится к отображению текста на символьном экране, а корпус девайса стальной экранированный)))
А у ТС - фотоумножитель с 800 вольт.

И никто не знает, в том числе и ТС, как у него будут организованы провода

Duhas » 01 мар 2016, 08:34
у меня для подобных целей свой протокольчик с старт стоп последовательностями и CRC16.. с однйо стороны - гемор, проде все и без этого работает, а с другой - один раз сделал и все стабильно. либо с каналом все ок и данные идут, либо не идут, а неверных данных не бывает.
ALS » 01 мар 2016, 10:29
+1
Сделать один раз и не заморачиваться более. А применимо, как правило, в 99% всех последующих проектов.