Чтение данных по Serial и вывод на монитор

neospromiy
Offline
Зарегистрирован: 15.07.2013

Ребята всем привет, нужна ваша помощь.

В общем есть Самодельный круиз контроль, сейчас захотелось сделать экранчик на ардуино чтоб показывала скорость стабилизации, текущую скорость и скорость пользователя.

Круиз контроль шлет через Serial данные, их принимаю на мониторе ардуино вот в таком виде



192
32
32
48
32
32
48
32
53
57
2
0
0
0
1
100
0
0
0
0
0
0
13
10
172
... далее циклический повторяется. Каждая строка выводится за один цикл.

вот здесь Формат для UART.
http://oklik.name/proect/kk/e_gaz/uart_data.txt

Сам пока разобрался по таблице кодировка ASCII (http://gimnnik.narod.ru/open-office/TextProcessor/p5a..) что

192 это адрес.
следующие
32/ 32/ 48 —> пробел/пробел/0
т.е текущая скорость 0 км/ч

следующие
32/ 32/ 48 —> пробел/ пробел/0
т.е скорость стабилизации 0 км/ч

следующие
32/ 53/ 57 —> пробел/5/ 9
т.е скорость пользователя 59км/ч

Моя задача вывести на сериал монитор эти данные
текущая скорость 0 км/ч
скорость стабилизации 0 км/ч
скорость пользователя 59км/ч

каким образом это можно сделать при помощи ардуино, я пытался по разному но она мне постоянно вытаскивает на монитор -1 уже не знаю как быть 

считывал таким образом 
----------------------------------------------
int dan = 0; 

void setup() 
{
Serial.begin(9600);
Serial.setTimeout(2000);
}

void loop() 
{
if (Serial.available() > 0) 
{
dan = Serial.read();
Serial.println(dan, DEC);

}
}
--------------------------------------------------

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015
char buff[25]; // буфер для чтения всего сообщения

Serial.readBytes(buff, 25); // читаем в буфер если есть что читать.

char spd[3];
memcpy(spd, &buff[1], 3);
Serial.println(spd); // текущая скорость
memcpy(spd, &buff[4], 3);
Serial.println(spd); // скорость стабилизации
memcpy(spd, &buff[7], 3);
Serial.println(spd); // пользовательская скорость

Дальше по аналогии.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

192 - признак начала пакета данных, 172 - контрольная сумма

24 байта после признака начала пакета данных запишите в массив и потом выбирайте из массива нужные вам байты согласно Формата для UART.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а разве не надо синхронизировать запись в буфер по 192 ? передача байтов идёт непрерывно же......

neospromiy
Offline
Зарегистрирован: 15.07.2013

Спасибо!!! Всё работает получил вот такие данные  

  0
  0
 59
  0
  0
 59
  0
  0
 59
  0
  0
 59
  0
Это то что мне надо!!
neospromiy
Offline
Зарегистрирован: 15.07.2013
Сам успел нагородить вот такой код но он глючный немного. Спасбо большой Penni!!
 


void setup() 
{
   Serial.begin(9600);
  // Serial.setTimeout(2000);
}

void loop() 
{
  int i=0;
char v[11];
  if ((int)Serial.read()==192)
     {
     while (i<11){
       v[i++] = (int)Serial.read();
     }
       
        Serial.print(" V_tec: ");     
        Serial.print(v[0]);     
        Serial.print(v[1]);  
        Serial.print(v[2]);  
        Serial.print("   ");     
        Serial.print(" V_stb: ");     
        Serial.print(v[3]);     
        Serial.print(v[4]);  
        Serial.print(v[5]);  
        Serial.print("   ");     
        Serial.print(" V_usr: "); 
        Serial.print(v[6]);     
        Serial.print(v[7]);  
        Serial.print(v[8]);  
        Serial.println(" ");     
     }
    
      delay (30);

}

И выдает он мне вот такие вот косячки

 V_tec:   0    V_stb:   0    V_usr:  59 
 V_tec:   0    V_stb:   0    V_usr:  59 
 V_tec:   0    V_stb:   0    V_usr: яяя 
 V_tec:   0    V_stb:   0    V_usr:  59 
 V_tec:   0    V_stb:   0    V_usr:  59 
 V_tec: яяя    V_stb: яяя    V_usr: яяя 
 V_tec:   0    V_stb:   0    V_usr:  59 
 V_tec:   0    V_stb:   0    V_usr:  59 
 V_tec:   0    V_stb:   0    V_usr:  59 
 V_tec:  яя    V_stb: яяя    V_usr: яяя 
 V_tec:   0    V_stb:   0    V_usr:  59 
 V_tec:   0    V_stb:   0    V_usr:  59 
 V_tec:   0    V_stb:   0    V_usr:  59 
 V_tec:   0    V_stb: яяя    V_usr: яяя 
 V_tec:   0    V_stb:   0    V_usr:  59 
 
Zviadovca
Offline
Зарегистрирован: 10.12.2020

Столкнулся с той же проблемой. Использую скетч что выше от Penni но мне надо вывести данные не в сериал а на дисплей. Вторую неделю ломаю голову, не выходит. Помогите плиз.

b707
Offline
Зарегистрирован: 26.05.2017

Zviadovca пишет:
Столкнулся с той же проблемой. Использую скетч что выше от Penni но мне надо вывести данные не в сериал а на дисплей. Вторую неделю ломаю голову, не выходит. Помогите плиз.

над чем ломаешь голову. что не выходит, в чем помочь - ничего не ясно.

Для начала неплохо было бы выложить скетч, который ты написал для дисплея

Zviadovca
Offline
Зарегистрирован: 10.12.2020

Попробую объяснить. Сделал круиз контроль что и старттопик. КК выдаёт по УАРТ информацию о режимах и скоростях. Есть желание эту инфу вывести на дисплей. Есть такой скетч, но он отправляет в УАРТ а мне надо на дисплей. Если быть точнее то в дисплей NEXTION. Скетч создаю в FLProg и кусок это скетча хочу сделать как пользовательский блок. Скетча для дисплея не получается ни как. Как переделать Serial.print на переменную. Надеюсь понятно объяснил, спасибо.

void setup() {



Serial.begin(9600);

}

void loop() {

char buff[25]; // буфер для чтения всего сообщения

Serial.readBytes(buff, 25); // читаем в буфер если есть что читать.

char spd[3];

memcpy(spd, &buff[1], 3);

Serial.print(spd); // текущая скорость

memcpy(spd, &buff[4], 3);

Serial.print(spd); // скорость стабилизации

memcpy(spd, &buff[7], 3);

Serial.print(spd); // пользовательская скорость

}

sadman41
Offline
Зарегистрирован: 19.10.2016

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

b707
Offline
Зарегистрирован: 26.05.2017

Zviadovca пишет:

Как переделать Serial.print на переменную. Надеюсь понятно объяснил, спасибо.

не, нифига не понятно.

во-первых, вставляйте код по правилам форума. а то вас никто и слушать не станет.

Что нужно переделать на переменную? Вот у тебя в коде Serial.print(spd) - это разве не переменная?

Zviadovca
Offline
Зарегистрирован: 10.12.2020

Ну зачем вы так. Я прошу помощи или совета. На форумах я не сижу, как правило дохожу до всего сам. Сейчас реально бъюсь головой об стену. Ступор какой то.

Zviadovca
Offline
Зарегистрирован: 10.12.2020

Как бы вы прикрутили к этому скетчу дисплей OLED 0.96

nik182
Offline
Зарегистрирован: 04.05.2015

В сетапе проинициализировал дисплей, в лупе выводил в сериал и дисплей одну и туже строку.

sadman41
Offline
Зарегистрирован: 19.10.2016

У любого форума есть правила. Вы их не удосужились узнать, сразу начали действовать как попало.