Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » Как отправить через UART последовательно несколько переменных?


Как отправить через UART последовательно несколько переменных?

Сообщений 31 страница 51 из 51

31

Skull , уст-во зовётся ЭЦТ 2-16 . Вот пакеты , кот посылает С.У. на ЭЦТ .
0 = 11H;00H;02H;0BH;00H;3EH   
1 = 11H;01H;02H;0BH;00H;D7H 
2 = 11H;02H;02H;0BH;00H;45H 
3 = 11H;03H;02H;0BH;00H;ACH 
4 = 11H;04H;02H;0BH;00H;C8H   
5 = 11H;05H;02H;0BH;00H;21H   
6 = 11H;06H;02H;0BH;00H;B3H
эти посылки уже с командой....
host> 11 03 06 01 00 10 00 30 22 FC
trk > 11 03 06 51 01 00 00 00 02 67

Насчёт контр. суммы не уверен но, глядя на пакеты , не трудно заметить что последнее число , довольно сильно изменяется и это при том , что в посылке меняется только адрес . На основе этих умозаключений , я и сделал вывод который озвучил.

0

32

http://www.google.com.ua/url?sa=t&rct=j&q=протокол обмена данными между системой управления и топливораздаточной колонкой&source=web&cd=1&sqi=2&ved=0CCIQFjAA&url=http://catalog.azsportal.ru/Doc.aspx?id=1328&ei=UFkwT96iE8rdtAa4v-mtBA&usg=AFQjCNFlYiMRRTXbYe7lDDgj99mXlpRCqw

По идее это Ваш протокол, посмотрите. Есть расчет контрольной суммы похожий. нечто похожее на частотниках  было.

Отредактировано Skull (2012-02-07 03:00:29)

0

33

Это я уже курил , но всё равно спасибо .  Здесь немного подругому , DELа  -нет , 2-х ETXов тоже , комплиментарных байт я также не нашёл . Слегка смутила формулировка "CheckSum вычисляется как ИСКЛЮЧАЮЩЕЕ ИЛИ всех нормальных байт " тоесть нужно все вышеозначенные байты , перегнать через XOR только как ? 1-й со 2-ым ? или 1-й с 1-ым ?, 2-й со 2ым? , и т.д.

Отредактировано dimon-790 (2012-02-07 09:29:17)

0

34

Перепробовал все , стандартные баскомовские операторы , ни фига. Остаются , только пытать математиков чем сейчас и занимаюсь , да развешто бинарниками поигратся..

0

35

У меня в протоколе используется обычная контрольная сумма всех чисел, разрядность 8-бит, если идет переполнение, то идет по второму кругу.
Не одна готовая функция не подошла, считал ручками.

Отредактировано RDW (2012-02-07 18:33:33)

0

36

Похоже и у меня всё идёт к тому-же. Скачал пару книжек по расчётам crc , изучаю .

0

37

CRC это 16-ти разрядная величина т.е. два байта. CRC вычисляется передающим устройством и добавляется к сообщению.Принимающее устройство также вычисляет CRC в процессе приема и сравнивает вычисленную величину с полем контрольной суммы пришедшего сообщения. Если суммы не совпали - то имеет место ошибка.
16-ти битовый регистр CRC предварительно загружается числом FF hex. Процесс начинается с добавления байтов сообщения к текущему содержимому регистра. Для генерации CRC используются только 8 бит данных. Старт и стоп биты, бит паритета, если он используется, не учитываются в CRC.
В процессе генерации CRC, каждый 8-ми битовый символ складывается по ИСКЛЮЧАЮЩЕМУ ИЛИ с содержимым регистра. Результата сдвигается в направлении младшего бита, с заполнением 0 старшего бита. Младший бит извлекается и проверяется. Если младший бит равен 1, то содержимое регистра складывается с определенной ранее, фиксированной величиной, по ИСКЛЮЧАЮЩЕМУ ИЛИ. Если младший бит равен 0, то ИСКЛЮЧАЮЩЕЕ ИЛИ не делается.
Этот процесс повторяется пока не будет сделано 8 сдвигов. После последнего (восьмого) сдвига, следующий байт складывается с содержимым регистра и процесс повторяется снова. Финальное содержание регистра, после обработки всех байтов сообщения и есть контрольная сумма CRC.
Алгоритм генерации CRC:

1. 16-ти битовый регистр загружается числом FF hex (все 1), и используется далее как регистр CRC.
2. Первый байт сообщения складывается по ИСКЛЮЧАЮЩЕМУ ИЛИ с содержимым регистра CRC. Результат помещается в регистр CRC.
3. Регистр CRC сдвигается вправо(в направлении младшего бита) на 1 бит, старший бит заполняется 0.
4. (Если младший бит 0): Повторяется шаг 3 (сдвиг)
(Если младший бит 1): Делается операция ИСКЛЮЧАЮЩЕЕ ИЛИ регистра CRC и полиномиального числа A001 hex.
5. Шаги 3 и 4 повторяются восемь раз.
6. Повторяются шаги со 2 по 5 для следующего сообщения. Это повторяется до тех пор пока все байты сообщения не будут обработаны.
7. Финальное содержание регистра CRC и есть контрольная сумма.
РАЗМЕЩЕНИЕ CRC В СООБЩЕНИИ

При передаче 16 бит контрольной суммы CRC в сообщении, сначала передается младший байт, затем старший.

0

38

он лайн калькулятор для расчета CRC
http://www.lammertbies.nl/comm/info/crc … ation.html

0

39

sva-don написал(а):

он лайн калькулятор для расчета CRC
http://www.lammertbies.nl/comm/info/crc … ation.html

Пробовал , но он только 2-х байтовые результаты выдаёт . 
Сейчас пытаюсь осмыслить вот это но вопросов меньше не становиться...

0

40

Что-то я вообще не понимаю, зачем рассчитывать контрольную сумму? Это и так заложено всё в 485. Вам с протоколом обмена нужно разобраться,  на который реагирует железка (или что там у вас)..

0

41

Всё упирается в слэйв девайсину , без к.с. она попросту игнорирует посылку...

0

42

Проанализируйте рабочий сигнал в зависимости от изменений. Можно попробовать параллельно подслушать его.

Отредактировано RDW (2012-02-11 14:07:55)

0

43

RDW , на предмет чего ? проанализировать. Слушал осцилографом есть картинки , хотел выложить сдесь но не получилось прицепить.

0

44

Загрузи вот эту "слушалку" COM порта. Мощнейшая штука. Если не поможет, то тогда уж и не знаю чем помочь.
http://webfile.ru/5812956

0

45

А зачем мне слушать ком порт ? какие числа пересылаются , я знаю. У меня проблема в другом , туго с матеатикой , никак до меня не доходит как формируется к.с.? в пакете меняяется только одна цифра а к.с. меняется до неузнаваемости.

0

46

Если есть возможность меня в протоколе только одно значение и при этом к.с. меняется до не узнаваемости, то эту последовательность можно запихать скажем в МК и провести над ней разные алгоритмы вычисления к.с. (CRC, чексум, оычная к.с...). При чем данные о к.с. могут подсчитываться не факт, что с первого значения... В общем есть где развернуться. Возможно какая-то из штатных функций/алгоритмов может подойти (может она считается к верх ногами).

Отредактировано RDW (2012-02-11 22:42:50)

0

47

Что то мне подсказывает, что здесь пока не математикой нужно заниматься, а поподробнее проанализировать посылки. У меня есть большие сомнения по поводу того, что разработчики придумывали супер хитрый алгоритм расчета КС. Не тот это случай.

0

48

Вот и мне так кажется, может они просто время передают. )

0

49

sva-don написал(а):

Что то мне подсказывает, что здесь пока не математикой нужно заниматься, а поподробнее проанализировать посылки. У меня есть большие сомнения по поводу того, что разработчики придумывали супер хитрый алгоритм расчета КС. Не тот это случай.

Что значит "поподробнее проанализировать посылки"? могу ещё посылок выложить, если это поможет раследованию. Так никто и не утверждал , что алгоритм "супер хитрый" просто малость не понятно как математически его расчитать ? . Тут мысля появилась, у меня есть рабочая прошивка  слэйв девайсины , что если её дизъасемблировать ? или в протеусе смоделировать ? контролер там используется at89s53. http://uploads.ru/t/8/o/p/8opR9.jpg наконец-то удалось картинку впихнуть это осцилограмма обращени мастера к слэйву.

Отредактировано dimon-790 (2012-02-15 12:36:21)

0

50

В рисунках проку мало, т.к. нет частоты синхронизации и разобрать где что невозможно. Я в соих программах пользовался вот такими алгоритмами, может поможет.

Код:
//------------------ Подсчет CRC8 ------------------
function Crc8(N: Byte): Byte;
var
  m,j,k,x,Crc: Byte;
begin
Crc:=0;
For m:=1 To N do begin
 x:=D[m];
  For k:=0 To 7 do begin
   j:=1 And (x Xor crc);
   crc:=Trunc(crc / 2) And $FF;
   x:=Trunc(x / 2) And $FF;
   If j <> 0 Then crc:=crc Xor $8C;
  end;
end;
Crc8:=Crc;
end;
//------------------ Подсчет CRC16 -------------------------
function Crc16(N: Byte): Integer;
var
 i, j: Integer; 
begin
Crc:=0;
 For i:=1 To N Do
 begin
  Crc_MSB:=CRC div 256;
  Crc_LSB:=Crc And 255;
  Crc_MSB:=Crc_MSB Xor D[i];
  Crc:=(Crc_MSB * 256) + Crc_LSB;
   For j:=0 To 7 Do
    begin
     L:=Crc;
     L:=L*2;
      If L>$FFFF Then
       B:=True
      Else
       B:=False;
       Crc:=L And $FFFF;
     If B=True Then Crc:=Crc Xor $1021;
    end;
 end;
Crc16:=Crc;
end;

Загоняем данные в массив D[] и передаем в функцию число элементов массива.

Отредактировано sva-don (2012-02-15 16:00:42)

0

51

Ок спасибо , попробую .

0


Вы здесь » Программирование ATMEL в BASCOM. » Связь проводная и бесп-ная, интерфейсы, протоколы » Как отправить через UART последовательно несколько переменных?