Страница 1 из 3

Прием данных по UART

Добавлено: 11 июл 2017, 18:11
stapmoff
Уважаемые помогите, не могу решить вроде элементарную задачу. Нужно из юарт принять 4 байта с расчетом контрольной суммы, после этого должен загорется сведодиод на выходе ОК сам блок и проэкт в архиве

Прием данных по UART

Добавлено: 11 июл 2017, 20:09
stapmoff
тут я разобрался, теперь данные которые отправляются по 485-му не видно на мастере

Прием данных по UART

Добавлено: 12 июл 2017, 09:44
stapmoff
Все переделал, НЕ РАБОТАЕТ мастер не видит слэйф хотя слэйф шлет нормальное количество байт и корректно 3E 0A 06 19 27 00 67 00 FB где 3Е - префикс, 0А - адрес, 06 - команда запроса, 19 - температура, 27,00 -  2 байта уровеня топлива, 67,00 - 2 байта частоты FB - контрольная сумма, что еще надо не пойму, помогите а!!!!!!!

Прием данных по UART

Добавлено: 12 июл 2017, 10:32
rw6cm
так не пробовали?

Прием данных по UART

Добавлено: 12 июл 2017, 15:47
stapmoff
rw6cm писал(а):так не пробовали?
Как только не пробовал, похоже дело в контрольной сумме и в том что я правильно не могу интежер разделить на 2 байта
 data[4] = Level1;
      data[5] = Level; Должен быть один Level

Прием данных по UART

Добавлено: 12 июл 2017, 15:52
pan
а как вы делите на 2 байта?

Прием данных по UART

Добавлено: 12 июл 2017, 16:00
rw6cm
stapmoff писал(а):Как только не пробовал
У меня на ком порт без задержки только часть пакета приходит, с задержкой весь.
контрольную сумму можно попробовать поставить 00 ,  тогда по идее он не должен ее учитывать.
не уверен но контрольная сумма 3E0A061927006700=F5

Прием данных по UART

Добавлено: 12 июл 2017, 19:31
stapmoff
rw6cm писал(а):но контрольная сумма 3E0A061927006700=F5
Вот именно, не совпадос какой то!!!! Ну могу разделить интежер на 2 байта и мне кажется, что из за этого не правильно считается контрольная сумма, судя по датчику который выдавал такие же данные, контрольная сумма была 3E0A061927006700=86 вроде

Добавлено (12.07.2017, 19:00)
---------------------------------------------
Сделал вот так 
data[5] = ( byte )( Level >> 8 );
data[4] = ( byte )Level;
Не знаю правильно нет?

Добавлено (12.07.2017, 19:04)
---------------------------------------------
Вот теперь точно все правильно, разделил int на 2 байта, старший первый, но прибор не видит(( Вот что шлет слэйф 3E 0A 06 19 0F FF 07 D0 9C
19 - 25 градусов
0F FF - 2 байта уровень топлива 4095
07 D0 - 2 байта частота 2000
9C- сумма

Добавлено (12.07.2017, 19:31)
---------------------------------------------
Вот реальные данные от рабочего слэйва  3E 01 06 19 27 00 67 00 87 
Вот те же данные, но от моего слэйва        3E 01 06 19 27 00 67 00 4D 
не совпадает контрольная сумма!!! Блин

Прием данных по UART

Добавлено: 12 июл 2017, 20:15
pan
а может так 
data[4] = Level&FF; (или Level&255)
data[5] = Level>>8;

Прием данных по UART

Добавлено: 12 июл 2017, 20:43
stapmoff
pan писал(а):а может так data[4] = Level&FF; (или Level&255)
data[5] = Level>>8;
Да не я уже разделил интежер на 2 байта, тут все ОК. теперь не совпадает контрольная сумма

Добавлено (12.07.2017, 20:43)
---------------------------------------------
Попробовал, вот что выдает 3E 01 06 19 00 67 00 00 39

Добавлено (12.07.2017, 20:43)
---------------------------------------------
Это не то

Прием данных по UART

Добавлено: 13 июл 2017, 08:14
rw6cm
stapmoff писал(а):Вот реальные данные от рабочего слэйва 3E 01 06 19 27 00 67 00 87
Похож на алгоритм CRC-8/MAXIM
Вот его калькулятор
Для уверенности еще один пакет правильных данных не помешал бы.

Прием данных по UART

Добавлено: 13 июл 2017, 08:31
stapmoff
rw6cm писал(а):Для уверенности еще один пакет правильных данных не помешал бы.
Вот несколько
3E 01 06 19 27 00 67 00 BB
 25 градусов 39 уровень 103 частота
3E 01 06 19 27 00 67 00 BB

3E 01 06 1E FF 0F D0 07 5A
30 градусов 4095 уровень 2000 частота
3E 01 06 1E FF 0F D0 07 5A
3E 01 06 1E FF 0F D0 07 5A

Прием данных по UART

Добавлено: 13 июл 2017, 08:44
rw6cm
Это же такой же    3E 01 06 19 27 00 67 00 BB  и  3E 01 06 19 27 00 67 00 87
Почему контрольные суммы разные?

Прием данных по UART

Добавлено: 13 июл 2017, 08:53
stapmoff
rw6cm писал(а):Почему контрольные суммы разные?
Вот о том и речь)

Вот такой пример из документации протокола LLS Алгоритм вычисления контрольной суммы

1 U8 CRC8(U8 data, U8 crc)
2 {
3   U8 i = data ^ crc;
4   crc = 0;
5   if(i & 0x01) crc ^= 0x5e;
6   if(i & 0x02) crc ^= 0xbc;
7   if(i & 0x04) crc ^= 0x61;
8   if(i & 0x08) crc ^= 0xc2;
9   if(i & 0x10) crc ^= 0x9d;
10  if(i & 0x20) crc ^= 0x23;
11  if(i & 0x40) crc ^= 0x46;
12  if(i & 0x80) crc ^= 0x8c;
13  return crc;
14 }

Прием данных по UART

Добавлено: 13 июл 2017, 09:00
rw6cm
stapmoff писал(а):Вот реальные данные от рабочего слэйва 3E 01 06 19 27 00 67 00 87
Эти откуда ?
3E 01 06 19 27 00 67 00 BB
3E 01 06 1E FF 0F D0 07 5A

Прием данных по UART

Добавлено: 13 июл 2017, 09:14
stapmoff
Немного исправил блок, теперь сумма другая, но не та
3E 01 06 19 27 00 67 00 4D
3E 01 06 19 27 00 67 00 4D

Добавлено (13.07.2017, 09:14)
---------------------------------------------
rw6cm писал(а):Эти откуда ?
с моего устройства

Прием данных по UART

Добавлено: 13 июл 2017, 09:18
pan
как может быть при одинаковых цифрах разная сумма...
чудес не бывает. единственное что приходит на ум это то циферки в разных форматах (dec hex)

Прием данных по UART

Добавлено: 13 июл 2017, 09:25
stapmoff
pan писал(а):циферки в разных форматах (dec hex)
Всему виной была вот эта строчка
for (n = 0; n <= 7; n++)  // рассчитываем crc8
тут была 8

Но все равно сумма не совпадает

Прием данных по UART

Добавлено: 13 июл 2017, 09:25
rw6cm
У вас есть пакет который должен проходить, (правильный)?

Прием данных по UART

Добавлено: 13 июл 2017, 09:28
pan
stapmoff писал(а):тут была 8
 если была 8 , то должно было быть в скобках n=1

Добавлено (13.07.2017, 09:28)
---------------------------------------------
чудеса