Протокол обмена?

bit
Offline
Зарегистрирован: 07.05.2012

Привет всем подскажите пожалуйста как реализовать работу данного протокола по RS 232 HEX файл с ардуино?

 

Почитал в интернете это стандартный  RS232 com протокол обмена

Отправляю цифру 1 с ком порта

У меня получается 6 бит данных, может я конечно ошибаюсь.

 

Подскажите как отправлять с ардуино  указанный протокол?

 

bit
Offline
Зарегистрирован: 07.05.2012

 

Отправляю с ардуино  в сериал на ком порт цифру 1 там уже получается не 6 и не 8 бит а гораздо больше

maksim
Offline
Зарегистрирован: 12.02.2012

1. Не понятно как и где вы получили такую картинку. Это картинка именно с СОМ-порта RS-232, потому как сигнал инвертирован.
2. В конце один стоповый бит(если вы не меняли стандартные настройки порта), а не 2 и так как сигнал инвертирован - это 0.

То есть что мы получаем, по вашей картинке: 1011100110, инвертируем 0100011001, убираем стоповый и стартовый биты 10001100, дальше как вы видите последовательность бит обратная, потому как при передаче байт передается перевернутым, перевернем байт обратно, 00110001 - представим в десятичном виде - получим 49, что в кодах АСКИ что ??? Правильно - ваша 1, которую вы отправили.

maksim
Offline
Зарегистрирован: 12.02.2012

bit пишет:

Отправляю с ардуино  в сериал на ком порт цифру 1 там уже получается не 6 и не 8 бит а гораздо больше

Есть великое множество способов как отправить 1 с дуины и все разные.

И на выводах дуины сигнал не инвертирован, так как это UART TTL, в отличие от сигнала на картинке.

bit
Offline
Зарегистрирован: 07.05.2012

Вот теперь до меня дошло

bit
Offline
Зарегистрирован: 07.05.2012

 

Чёта я опять запутался когда инвертируем цифры получаются задом напреет или у вас просто ошибка?

bit
Offline
Зарегистрирован: 07.05.2012

 

Не пойму почему 1 меняется на 0

maksim
Offline
Зарегистрирован: 12.02.2012

Не путайте инвертирование и последовательность.

Инвертирование: 
00000000 10101010 10011010
11111111 01010101 01100101

Обратная последовательность:
11100000 11000001 10100011
00000111 10000011 11000101

bit
Offline
Зарегистрирован: 07.05.2012

 

Теперь понял просто меняем 1 на 0 а нули на 1 инвертируем

maksim
Offline
Зарегистрирован: 12.02.2012

Инвертация происходит потому что, UART RS232 не есть UART TTL

|   интерфейс   |   UART RS232    |       UART TTL     |
|        лог. 1       |    -12В (-5В)      |    +5В (+3.3В)   |
|        лог. 0       |   +12В (+5В)     |           0В           |

bit
Offline
Зарегистрирован: 07.05.2012

Тоесть если нам нужно отправить с ардуино на сериал в ком пор цифру 1

то мы пишем?

Serial.print(49, BIN)

 

А откуда тогда взять два байта которые покроям находятся?

maksim
Offline
Зарегистрирован: 12.02.2012

 Нет. Так вы отправите число 49 в бинарном виде кодами АСКИ. Вы лучше напишите что хотите.

bit
Offline
Зарегистрирован: 07.05.2012

Пытаюсь разобраться как это всё работает.

Вот как мне  с ардуино  pin12 отправить цифру 1 в ком порт?

 

maksim
Offline
Зарегистрирован: 12.02.2012

bit пишет:

А откуда тогда взять два байта которые покроям находятся?

О каких байтах идет речь? Вы может путаете байт с битом?

maksim
Offline
Зарегистрирован: 12.02.2012

bit пишет:

Пытаюсь разобраться как это всё работает.

Вот как мне  с ардуино  pin12 отправить цифру 1 в ком порт?

Какая единица? Как вы ее хотите отправить? И что значит pin12 ??? на этом выводе есть UART ??? на этом выводе программный UART ??? 

В общем что вы хотите мне не понятно. Хотите разобраться такое UART - гугл в помощь. 

Serial.write(1);

 

bit
Offline
Зарегистрирован: 07.05.2012

Я та сейчас на объясняю)))

 может я не правильно мыслю поправьте меня

Вот есть протокол передачи ардуино в сериал 10 байт из них 8 байт данных

1 старт, а 10 стоп

 

Старт

00110001

стоп

 

Вопрос как это передать на любой из цифровых выходов

А к цифровому выходу я цепляю  ком пор и в гип. терминале должна  быть единица

 

bit
Offline
Зарегистрирован: 07.05.2012

вы уж извините что у меня такие вопросы , да и объяснять я внятно не умею

bit
Offline
Зарегистрирован: 07.05.2012

pin12 цифровой выход с ардуино

bit
Offline
Зарегистрирован: 07.05.2012

это тогда получается протокол  UART?

тогда как сделать чтобы ардуино отправлял данные в этом протоколе?

 

 

 

bit
Offline
Зарегистрирован: 07.05.2012

У меня есть замученное жизнью устройства галилео

Было совсем умершее но оживить я его оживил

http://7gis.ru/doc/UserManual0157.pdf

У этого устройства есть цифровые входы  RXD сигнал первого канала RS232 TXD сигнал первого канала RS232

Работает по универсальному протоколу для RS232/RS485

 

У голилео есть свой конфигуратор

http://7gis.ru/support/konfigurator.html

в которых  видно что приходит на цифровые входы

То есть если мы падаём на цифровой вход данные скажем в виде 111 то в конфигураторе мы ведем это число.

 

И вопрос в том как совместить ардуина на этот протокол чтобы ардуино мог передавать цифры на цифровой порт галилео?

По протоколу я нашел ещё вот это там вроде всё описано но для меня это дикий лес ст.15.

http://control74.ru/img/files/docs/Manual-LLS-20160-v8.pdf

 

bit
Offline
Зарегистрирован: 07.05.2012

Подскажите как инверти данные и адоптировать протокол, чтобы то устройство читала отправленные символы с ардуино?

maksim
Offline
Зарегистрирован: 12.02.2012

В первую очередь нужно согласовать уровни RS232  и TTL, потому как если вы подключитесь напрямую к дуине, она может сгореть, для этого нужна например MAX232, либо готовый шилд RS232 Shifter.

maksim
Offline
Зарегистрирован: 12.02.2012
bit
Offline
Зарегистрирован: 07.05.2012

У меня согласования на ADM3202 собрано это тоже самое что и макс232

maksim
Offline
Зарегистрирован: 12.02.2012

Так что вы хотите от этого Галилео?

bit
Offline
Зарегистрирован: 07.05.2012

На цифровой вход голилео подорвать свои данные с ардуино  чтобы они отображались в ковигураторе

maksim
Offline
Зарегистрирован: 12.02.2012

Если вы под "цифровой вход" подразумеваете RS232, то судя по мануалу к нему можно подключить только 
1 – цифровой датчик уровня топлива (относительный уровень N);
2 – цифровой датчик уровня топлива (частота F);
3 – внешний модуль ГЛОНАСС;
4 – видеокамера Galileo;
5 – навигатор Garmin;
6 – CAN-LOG;
7 – индикатор CUB5;
8 – курсоуказатель Trimble (только для Galileo GPS).

так что вы хотите мне не понятно... сэмитировать одно из этих устройств... зачем... 
bit
Offline
Зарегистрирован: 07.05.2012

Можно сказать и так с эмитировать

1 – цифровой датчик уровня топлива (относительный уровень N);

То есть подавать свои данные

На этот вход

bit
Offline
Зарегистрирован: 07.05.2012

типа протокола обмена: в бинарном (HEX) виде или в символьном виде (передачей ASCII-последовательностей). Для работы рекомендуется использовать бинарный протокол обмена.

 Данные, между датчиком и внешним устройством передаются в виде сообщений стандартного формата. Сообщение передаѐтся пакетами байт. Передача каждого байта начинается СТАРТ битом, а завершается СТОП битом (Рисунок 10). Данные передаются младшим байтом вперѐд.

 

А вот я перехватил команду запроса вот только я не могу понять почему тут 12 байт

Хотя выше написано 1 старт и 1 стоп

Я наверно не так это понимаю

bit
Offline
Зарегистрирован: 07.05.2012

Где тут старт бит , 8 байт данн, стоп бит?

bit
Offline
Зарегистрирован: 07.05.2012

Или команда запроса идёт в другом протоколе?

maksim
Offline
Зарегистрирован: 12.02.2012

Вы понимаете разницу между битом и байтом?
И откуда эта картинка? Так как совершенно неизвестно куда вы тыкаете щупом осциллографа и что отправляете, то могу предположить, что это опять таки RS-232. Так же не видно что дальше справа, поэтому предположу что ничего - то есть логическая 1 (-12В).
Тогда получаем следующее:

    10111001101000000000       , инверируем:
    01000110010111111111       , разобьем на байты информации и стартовые и стоповые биты:
 0 10001100 1   0 11111111 1   , и получаем два байта обратной последовательности:
    10001100         11111111      , переворачиваем:
    00110001         11111111

 Получаем два байта:
|        BIN        |     DEC     |     HEX    |   ASCII   |
|   00110001  |       49      |    0х31   |       1      |
|   11111111  |  -1 (255)  |    0хFF    |     ÿ (я)   |

bit
Offline
Зарегистрирован: 07.05.2012

Бит это 0 или 1 , в  1 байте 8 бит

bit
Offline
Зарегистрирован: 07.05.2012

А картинка эта с выхода TX   Голилео  

Судя по мануалу это команда  опроса  на датчик

 

bit
Offline
Зарегистрирован: 07.05.2012

Скорей всего вы правы я не всю оцилограмму записал

bit
Offline
Зарегистрирован: 07.05.2012

Вот записал полный код опроса

Попробовал подцепить скан портов вот что он выдаёт

TXD1 галилео           (TXD1-RXD1 вход и выход на датчик с галилео)

этот код приходи часто примерно каждые 10 секунд FA 1A FE                      

 HEX                                                 BIN                                            DEC

FA 1A FE                      11111010  00011010  11111110          250    26   254

 FA F9                           11111010  11111001                             250    249

 FD 00 FF                      11111101        00         11111111         253    

То есть я как понял приходит команда запроса на выдачу пакета и через 100мс отправляется пакет  с устройства типа вот в таком формате

Например, F=0AF9 t=1A N=03FF.0 <CR><LF>,

где F – текущее значение частоты, t – текущее значение температуры в градусах по Цельсию, N – значение уровня.

http://control74.ru/img/files/docs/Manual-LLS-20160-v8.pdf

Хотя судя по мануалу данные должны идти без запроса

Подскажите как сделать чтобы ардуино читал команды запроса и отравлял пакеты подобного примера на вход голилео?

 

bit
Offline
Зарегистрирован: 07.05.2012

 Подключился  к выходу голилео через схему согласования на сериал пор ардуино и включил сериал монитор там приходят одни квадратики скорость менял бесполезно

 

bit
Offline
Зарегистрирован: 07.05.2012

Провёл маленький эксперимент думал он что то прояснит, а не тут то было.

 Отправляю в сериал соединения с ардуино на ком порт

Serial.println(78,HEX);

 записываю на оцил.

И что мы получаем

1    11010011   0 1     01011101    0 1    01001111   0 1   10101111    0

И мы получаем 4 байта

Ищем где тут зарыта 4E - 01001110      -   N

Не понимаю почему становится 4 байта

И самое главное где тут буква N?

Кто-нибудь может объяснить?

bit
Offline
Зарегистрирован: 07.05.2012

Методом научного тыка определил что

4E вставляется во 2 байте

Не понимаю я что то не так делаю может я не правильно считаю биты?

maksim
Offline
Зарегистрирован: 12.02.2012

 

bit пишет:

Тоесть если нам нужно отправить с ардуино на сериал в ком пор цифру 1
то мы пишем?

Serial.print(49, BIN)

А откуда тогда взять два байта которые покроям находятся?

maksim пишет:

Нет. Так вы отправите число 49 в бинарном виде кодами АСКИ. Вы лучше напишите что хотите.

Как вы думаете сколько в этом случае будет отправлено байт? Правильно 6 байт.

leshak
Offline
Зарегистрирован: 29.09.2011

bit пишет:

Не понимаю почему становится 4 байта

В сообщении #22 Максим давал вам ссылку и совет почитать на мой пост в другой ветке, где я детально расписывал почему при Serial.println(78) у вас пошлется четыре байта. 

И там же есть рецепт как послать байт именно как байт. Serial.write  поможет отцу русской демократии ;)

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Serial.println(78,HEX);

И так. 78 в шеснадцатиричном представлении это 4E.

1 11010011 0  1 01011101 0  1 01001111 0  1 10101111 0  , инвертируем:
0 00101100 1  0 10100010 1  0 10110000 1  0 01010000 1  , выделяем байты:

   00101100    ,   10100010    ,   10110000    ,   01010000     , переворачиваем:
   00110100    ,   01000101    ,    00001101   ,   00001010     , представим в десятичном виде:
         52          ,         69          ,         13          ,        10            , смотрим в таблицу ASCII и получаем:
          4                      E      
Возврат каретки , Перевод строки

Как отправить "чистый" байт как он есть я вам уже писал выше.

bit
Offline
Зарегистрирован: 07.05.2012

Ну вот теперь я эту часть понял благодарю за разъяснения

bit
Offline
Зарегистрирован: 07.05.2012

Это всё моя невнимательность

bit
Offline
Зарегистрирован: 07.05.2012

Ну вот теперь  вырисовывается  как должен выглядеть  пакет который передаётся на галилео

 F=0AF9 t=1A N=03FF.0 <CR><LF>,

F – текущее значение частоты, t – текущее значение температуры в градусах по Цельсию, N – значение уровня. Все значения в шестнадцатеричном виде.

 F=0AF9

1    00110000    0 1   01000001   0 1   01000110    0 1   00111001   0

 t=1A

1   00110001     0 1   01000001    0

 N=03FF

1   00110000     0 1   00110011    0 1   01000110   0 1    01000110   0 

 <CR>

1   00001101    0

 <LF>

1   00001010    0

 Перевернуть и инвертировать

 

maksim
Offline
Зарегистрирован: 12.02.2012

Вам естественно инвертировать и переворачивать ничего не нужно, за вас это сделает UART и MAX232, вы просто отпраляете как есть.

bit
Offline
Зарегистрирован: 07.05.2012

Всю голову сломал но не как разобраться не могу с  протоколам передачи я уже и датчик на время нашел, подключил его к голилео

Подключаем датчик и через несколько секунд в конфигураторе появляется число уровня

Подключаем осциллограф к выходу датчика

Пытаюсь подсчитать биты получается какая та фигня

Подключаю к ардуино к сериал пишет

>M>M>M>M И квадратики 

Подключаю Soft сканируем порт

bit
Offline
Зарегистрирован: 07.05.2012

Почитал данные по датчику

В сообщении передаются текущие данные: пользовательское значение уровня топлива

(10 или 12 бит), технологическое значение уровня топлива (16 бит), температура (8 бит).

http://www.euromobile.ru/wp-content/uploads/manual_epsilon.pdf

bit
Offline
Зарегистрирован: 07.05.2012

Подскажите как мне создать и отправлять аналогичный пакет из ардуино в галилео

bit
Offline
Зарегистрирован: 07.05.2012

Написал код который отправляет из ардуино 3E 01 07 17 4D 00 68 13 FE

Но галилео его не читает в чём проблема

bit
Offline
Зарегистрирован: 07.05.2012
void setup(){
  
  
  Serial.begin(19200);
}

void loop(){
  
  Serial.print(51);
   Serial.print(69);
    Serial.print(48);
     Serial.print(49);
      Serial.print(48);
       Serial.print(55);
        Serial.print(49);
         Serial.print(55);
          Serial.print(52);
           Serial.print(68);
            Serial.print(48);
             Serial.print(48);
              Serial.print(54);
               Serial.print(56);
                Serial.print(49);
                 Serial.print(51);
                  Serial.print(70);
                   Serial.print(69);
                   
                   delay(1000);
  
}