Страница 4 из 4

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

Добавлено: 18 май 2018, 20:03
ElectroMechaniC
Так! И где истина?

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

Добавлено: 18 май 2018, 20:07
Sancho
Просто, если int, в смысле uint16_t сдвинуть влево на 16, получим нули....

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

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

Добавлено: 18 май 2018, 20:26
ElectroMechaniC
Так ка правильно? То?

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

Добавлено: 18 май 2018, 20:36
Sancho
ElectroMechaniC писал(а): 18 май 2018, 20:26Так ка правильно? То?
У тебя переменная, более 65536 - это что?
Попробуй оба варианта.

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

Добавлено: 18 май 2018, 20:40
ElectroMechaniC
Это значение пробега в километрах! Ок попробую оба! Спасибо!

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

Добавлено: 18 май 2018, 20:44
pan
не совсем компактно, но 100 пудов работает

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

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

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

Добавлено: 18 май 2018, 20:46
Sancho
Ещё один вариант:
out=0;
out |= (in1 << 16) | (in2 << 8) | in3;

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

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

Добавлено: 18 май 2018, 22:35
pan
да. надо перед смещением приводить к такому типу данных чтоб "смещение" влезло

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

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

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

Добавлено: 20 май 2018, 19:16
ElectroMechaniC
[ref=#ff8000]pan[/ref], не ну я конечно нуб , по сравнению с вами! Но не до такой же степени)))

пока что столкнулся с маленькой загвоздкой! Данный 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" можно упустить, если модуль один и эти два блока будут использоваться в одном скетче!