как отсеять мусор из UART в реал-тайме?

Прошу помощи знающих

На этом форуме Вы можете задать вопросы знатокам программы и автору.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

как отсеять мусор из UART в реал-тайме?

#61

Сообщение Sancho » 18.05.2018{, 20:02}

pan,
Спешил.
Но так мы приводим к одному типу. 32 бита.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
ElectroMechaniC
Сержант
Сообщения: 230
Зарегистрирован: 21.09.2016{, 06:50}
Репутация: 1
Откуда: Донецк
Имя: Юрий

как отсеять мусор из UART в реал-тайме?

#62

Сообщение ElectroMechaniC » 18.05.2018{, 20:03}

Так! И где истина?
:newrus: Все в руках человека. Поэтому всегда мойте руки перед и зад! :victory:
:smile225: :smile469: :smile427:

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

как отсеять мусор из UART в реал-тайме?

#63

Сообщение Sancho » 18.05.2018{, 20:05}

Просто, если int, в смысле uint16_t сдвинуть влево на 16, получим нули....

Отправлено спустя 2 минуты 5 секунд:
А так мы явно указываем - принимай байт/интегер как 32-битное число. Я не знаю, как будет работать компилятор, поэтому прямо ему указываю, как работать.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
ElectroMechaniC
Сержант
Сообщения: 230
Зарегистрирован: 21.09.2016{, 06:50}
Репутация: 1
Откуда: Донецк
Имя: Юрий

как отсеять мусор из UART в реал-тайме?

#64

Сообщение ElectroMechaniC » 18.05.2018{, 20:26}

Так ка правильно? То?
:newrus: Все в руках человека. Поэтому всегда мойте руки перед и зад! :victory:
:smile225: :smile469: :smile427:

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

как отсеять мусор из UART в реал-тайме?

#65

Сообщение Sancho » 18.05.2018{, 20:36}

ElectroMechaniC писал(а):
18.05.2018{, 20:26}
Так ка правильно? То?
У тебя переменная, более 65536 - это что?
Попробуй оба варианта.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
ElectroMechaniC
Сержант
Сообщения: 230
Зарегистрирован: 21.09.2016{, 06:50}
Репутация: 1
Откуда: Донецк
Имя: Юрий

как отсеять мусор из UART в реал-тайме?

#66

Сообщение ElectroMechaniC » 18.05.2018{, 20:40}

Это значение пробега в километрах! Ок попробую оба! Спасибо!
:newrus: Все в руках человека. Поэтому всегда мойте руки перед и зад! :victory:
:smile225: :smile469: :smile427:

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

как отсеять мусор из UART в реал-тайме?

#67

Сообщение pan » 18.05.2018{, 20:44}

не совсем компактно, но 100 пудов работает

out = in1 ;
out = (out << 8) | in2 ;
out = (out<<8) | in3 ;

надо почитать как это более изящно делается :senile:

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

как отсеять мусор из UART в реал-тайме?

#68

Сообщение Sancho » 18.05.2018{, 20:45}

Ещё один вариант:
out=0;
out |= (in1 << 16) | (in2 << 8) | in3;

Отправлено спустя 54 секунды:
pan писал(а):
18.05.2018{, 20:44}
надо почитать как это более изящно делается
Наверно так :haha:
Так один из операндов 32 битный, и всё будет обрабатываться по его размерности. Вроде.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

как отсеять мусор из UART в реал-тайме?

#69

Сообщение pan » 18.05.2018{, 22:35}

да. надо перед смещением приводить к такому типу данных чтоб "смещение" влезло

ElectroMechaniC, вот так работает out = ((uint32_t)in1<<16) | ((uint16_t)in2<<8) | in3 ;

третий вход в блоке небось сам добавишь

Аватара пользователя
ElectroMechaniC
Сержант
Сообщения: 230
Зарегистрирован: 21.09.2016{, 06:50}
Репутация: 1
Откуда: Донецк
Имя: Юрий

как отсеять мусор из UART в реал-тайме?

#70

Сообщение ElectroMechaniC » 20.05.2018{, 18:56}

pan, не ну я конечно нуб , по сравнению с вами! Но не до такой же степени)))

пока что столкнулся с маленькой загвоздкой! Данный id (с пробегом), не присутствует в потоке изначально, а вызывается соответствующим запросом! Если бы это был .hex , то строка с запросом должна была бы выглядеть вот так:

Код: Выделить всё

740 8 03 22 4В 06 00 00 00 00
А строка с ответом выглядела бы вот так:

Код: Выделить всё

760 8 07 62 4В 06 00 27 5F 04
"740" -id кан кадра.
"8" -количество байт в кадре.
С "07" по "04 само тело кадра= 8 байт.

Отправлено спустя 8 минут 53 секунды:
И если получать ответы мы уже научились! ( блок в этой теме) спасибо ребятам! То с отправкой запроса есть моменты... и вопросы...
Первый из них стоит ребром:
Можно ли обновременно в одном скетче и делать запросы и получать ответы? Это пока обобщённый вопрос, который имеет множество подвопросов... но изначально нужно понимать хотя бы это... я приведу код из примера с отправкой пакета в кан шину...
И мне нужно сделать так, что бы он не конфликтовал с блоком получения байтов...

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

Код: Выделить всё

 // demo: CAN-BUS Shield, send data
// loovee@seeed.cc

#include <mcp_can.h>
#include <SPI.h>

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 9;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
    Serial.begin(115200);

    while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init fail");
        Serial.println(" Init CAN BUS Shield again");
        delay(100);
    }
    Serial.println("CAN BUS Shield init ok!");
}

unsigned char stmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
void loop()
{
    // send data:  id = 0x00, standrad frame, data len = 8, stmp: data buf
    stmp[7] = stmp[7]+1;
    if(stmp[7] == 100)
    {
        stmp[7] = 0;
        stmp[6] = stmp[6] + 1;
        
        if(stmp[6] == 100)
        {
            stmp[6] = 0;
            stmp[5] = stmp[6] + 1;
        }
    }
    
    CAN.sendMsgBuf(0x00, 0, 8, stmp);
    delay(100);                       // send data per 100ms
}

// END FILE  
Отправлено спустя 5 минут 13 секунд:
а вот блок который получает данные из кана! я так понимаю что инициализация у них общаяя? Тоесть в блоке отправки всё что до цикла "Loop" можно упустить, если модуль один и эти два блока будут использоваться в одном скетче!
Вложения
MCP2515_Can-Bus_24.04_(CODE).ubi
(227.47 КБ) 55 скачиваний
20180520_184738.png
:newrus: Все в руках человека. Поэтому всегда мойте руки перед и зад! :victory:
:smile225: :smile469: :smile427:

Ответить

Вернуться в «Спросить у знатоков»