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

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

Вот что выдаёт терминал с датчика

Хотя разные терминалы читаю по разному почему та

 

 

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

Вот мой косяк BYTE

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

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

 Serial.print(62,1,7,23,174,0,191,43,117, BYTE);

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

Волшебное слово здесь массив (array).

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

А еще непонятна чем вам так этот print полюбился. Почему никак не хотите перейти на Serial.write()  для того и предназначенный (слать байты). Про который вам уже давно говорили и не один раз. Перешли бы тогда - небыло-бы "Вот мой косяк BYTE". Съкономили бы себе кучу времени.

А еще он умеет сразу целый массив байтов одним махом отправлять в Serial.

 

 

leshak
Offline
Зарегистрирован: 29.09.2011
byte dataToSend[]={62,1,7,23,174,0,191,43,117}; // данные которые будем послать

// вычисляем сколько у на всего байт 
#define DATA_LENGTH sizeof(dataToSend)/sizeof(byte) 



void setup(){
  Serial.begin(9600);
  Serial.write(dataToSend,DATA_LENGTH);
}

void loop(){
}

 

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

Спасиб так та же меньше бит занимает

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

Подскажи пожалуйста как сделать чтобы цикл по кругу крутился , то есть отправляю в серил 83 if  делаем то что в скобках по кругу , отправляю 84 if делаем то что

byte dataToSend[]={62,1,7,19,83,0,225,20,183}; 
#define DATA_LENGTH sizeof(dataToSend)/sizeof(byte) 

byte dataToSend1[]={62,1,7,19,84,0,42,21,157}; 
#define DATA_LENGTH sizeof(dataToSend1)/sizeof(byte) 



String slovo;
boolean read_end = 0;

void setup()
{
 
  Serial.begin(19200);
}
void loop()
{
  if(Serial.available())
  {
    delay(2);
    slovo += (char)Serial.read();  
    read_end = 1; 
  }
  else if(read_end)
  {
    if(slovo.substring(0,3) == "83")  // Делаем то что в скобках по кругу
    {
      Serial.write(dataToSend,DATA_LENGTH);
     delay(1000); 
    }
     if (slovo.substring(0,3) == "84")
    {
    Serial.write(dataToSend1,DATA_LENGTH);
     delay(1000);    
    }
   
        read_end = 0;
           
        slovo = "";
  }
     
}

в скобках по кругу

maksim
Offline
Зарегистрирован: 12.02.2012
byte dataToSend[]={62,1,7,19,83,0,225,20,183}; 
#define DATA_LENGTH sizeof(dataToSend)/sizeof(byte) 

byte dataToSend1[]={62,1,7,19,84,0,42,21,157}; 
#define DATA_LENGTH1 sizeof(dataToSend1)/sizeof(byte) 

byte mode = 0;

void setup()
{
  Serial.begin(19200);
}
void loop()
{
  if(Serial.available())
  {
    String slovo = "";
    while(Serial.available())
    {
      delay(2);
      slovo += (char)Serial.read();  
    }
    if(slovo.substring(0,3) == "83") mode = 1;
    if(slovo.substring(0,3) == "84") mode = 2;
  }
  if(mode == 1) Serial.write(dataToSend, DATA_LENGTH);
  if(mode == 2) Serial.write(dataToSend1, DATA_LENGTH1);
  delay(1000); 
}

 

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

Благодарствую

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

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

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

 

//---------------------------------------------------------------------------

#include <stdio.h>


// there our data
unsigned char our_data[8] = {62,1, 7,19, 122,0, 132,30};


unsigned char CRC_table[256] = {
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};

void CRC (unsigned char *crc, unsigned char data)
{
    *crc = CRC_table[*crc ^ data];
    return;
}
//---------------------------------------------------------------------------

int main(int argc, char* argv[])
{
unsigned char our_crc, i;

    our_crc = 0;

    for(i=0; i<8; i++)
        CRC(&our_crc, our_data[i]);

    // MUST be 234 (0xEA)
    printf("Calculated CRC: %d (%Xh)\n");

    return 0;
}
//--------------------------------------------------------------------------- 
 

 

Многочисленные попытки не удались




// there our data
unsigned char our_data[8] = {62,1, 7,19, 122,0, 132,30};


unsigned char CRC_table[256] = {
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};



void loop(){
  Serial.begin(9600);
  
}
//---------------------------------------------------------------------------
void setup(){

int main(int argc, char* argv[]);

unsigned char our_crc, i;

    our_crc = 0;

    for(i=0; i<8; i++)
        CRC(&our_crc, our_data[i]);

    // MUST be 234 (0xEA)
    Serial.println("Calculated CRC: %d (%Xh)\n");

   
    
    delay(1000);
}



void CRC (unsigned char *crc, unsigned char data)
{
    *crc = CRC_table[*crc ^ data];
    return;
   
}

 

 http://www.zmitac.aei.polsl.pl/Electronics_Firm_Docs/DALLAS/app27.pdf

stapmmoff
Offline
Зарегистрирован: 13.09.2016

bit, в итоге у вас получилось реализовать протакол?

bortnik27
Offline
Зарегистрирован: 23.06.2019

Обидно что ТС умер. 

Подскажите как реализовать подобную задачу, есть несколько устройств, кто-то общается по двум проводам, кто-то как RF модули по одной шине, если я знаю способ модуляции, как программно считать биты или точнее байты информации? Есть ли какие то библиотеки? 

https://soltau.ru/index.php/arduino/item/526-chtenie-dannykh-datchika-po...

Вот тут в принципе моя задача и ее решение, но там библиотека под конкретное устройство. Мне интересен принцип чтения байта информации. Конкретно есть два таких же датчика, есть еще два noname радиопульта, которые хочется использовать как беспроводную кнопку выхода в системах котроля доступа (выход из офиса запертого электромагнитным замком) ну и задачка со звездочкой это считывание и эмуляция wiegand протокола, он по двум шинам работает одна линия 0 вторая логическая 1. 

1982rodman
Offline
Зарегистрирован: 05.01.2019
  • Здравствуйте. Подскажите, пожалуйста. Имеется описание протокола обмена данными. Как должен выглядеть пакет данных, например для отправки показаний времени 19 мин. 59 сек?
  • Описание пакета прилагаю:
  • Скорость передачи 9600,нет бита четности , 1стоп бита

    Пакет таймера (10 байт):

    1 десятичный код старт.байт

    мин.(дес.) +48

    мин.(ед. +48) точка + 16

    сек.(дес.) +48

    сек.(ед.) +48 точка + 16

    0.1 сек. +48

    0 1 +48 (таймер игры идет) или 2+48 (таймер игры остановлен)

    0 1 +48 (таймер игры идет) или 2+48 (таймер игры остановлен)

    сирена, 0-й бит – основная сирена 4-й бит – доп.сирена +48

    7 десятичный код стоп.байт

    Примечание: для получения числа с "точкой + 16" нужно сначала из значения байта
    отнять 48, а затем обнулить 5-й бит.
    Если в результате в разряде получилось число больше 9, нужно число в этом разряде считать нулем.