PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Общение с машиной (http://pccar.ru/forumdisplay.php?f=14)
-   -   CITROEN-ARDUINO (http://pccar.ru/showthread.php?t=23275)

T_r_D 08.01.2016 01:38

Цитата:

Сообщение от autowp (Сообщение 347885)
millis - это не задержка, а текущее время.
В нормальной программе delay быть не должно.

Я и написал что через.
Уже разобрался. Глюк компилятора однако.
Если нет пробела между переменными и знаком "-" почему-то бред был.

За библиотеку спасибо.


PS Я уже двигаюсь к завершению первоочередной задачи.
У меня остались только непонятные глюки при коннекте планшета к модулю. По неизвестным причинам и без всякой логики иногда при коннекте приложение вылетает с ошибкой.

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

T_r_D 26.01.2016 11:27

В связи с выходом новой версии драйвера у Фелча, вернулся на провод.
К проге прикрутил работу сервиса в фоне, окна сообщений поверх всего.

Купил планшет новый Lenovo tab 2. Вот его и буду использовать.
Скоро установка в машину будет.

Dmitry8 01.02.2016 00:46

Цитата:

Сообщение от T_r_D (Сообщение 349790)
В связи с выходом новой версии драйвера у Фелча, вернулся на провод.

Что за драйвера? И кто такой Фелч?

T_r_D 02.02.2016 14:35

Это вот этот человек.
Где-то на форуме его так называли. Как его зовут на самом деле понятия не имею.
https://github.com/felHR85/UsbSerial

На самом деле дело было не в дровах, а в посылках. Если передавать с промикры в виде чисел, то не фига не работает. Нужно жёстко указать что передаём стринг.

Короче вот так надо передавать
PHP код:

#include <SPI.h>
#include "mcp_can.h"
MCP_CAN CAN(10);
unsigned char len 0;
unsigned char buf[8];
INT32U canId 0x000// идентификаторы могут быть 11-ти или 29-битные

unsigned long time0 = -120;

//TRIP
//RPM|SPD|LPK|AVG.LPK|AVG_SPD|Trp|Tmp
//   /100 /10  /10                   делить на
int OUTLINES[] = {0,0,0,-1,-1,0,0,-1,-1,-1};
int OUTLINES2[] = {0,0,0,-1,-1,0,0,-1,-1,-1};

//Кнопки на руле
int SWSV 0;
       
//Меню аудио настроек
int AP 0;
int APV 0;
String AUDIOAUDIO2 ="0:0";

//Банды, частота
int RB 0;
float RFR 0;
String BANDFREQBANDFREQ2 "0:0";

//RDS
String RDS ="NO RDS";

void setup()
{
    
Serial1.begin(38400);
    
pinMode(9INPUT);
    
delay(10000);

START_INIT:
    if(
CAN_OK == CAN.begin(CAN_125KBPS,MCP_8MHz))
    {
Serial1.println("Init OK!");}
    else
    {
Serial1.println("Init fail");delay(100);goto START_INIT;}
}


void loop()
{
    
//       if(CAN_MSGAVAIL == CAN.checkReceive())
       
if(!digitalRead(9)) // пин 9 можно переназначить                         
       
{
       
CAN.readMsgBuf(&lenbuf);
       
canId CAN.getCanId();

//_________________________________TRIP___________________________________
          
if(canId == 182//0B6
          
{
          
OUTLINES[0] = (int)buf[0] << buf[1] >> 3//Обороты
          
OUTLINES[1] = ((int)buf[2] << buf[3]);         //скорость / 100
          
}

          if(
canId == 545//221
          
{
          
OUTLINES[2] = (int)buf[1] << buf[2];          //моментальный расход / 10, если -1 то показаний нет
          //ARCFL = (int)buf[3] << 8 | buf[4];                //Километры на остатке топлива
          
}

          if(
canId == 673//0B6
          
{
          
OUTLINES[3] = (int)buf[3] << buf [4];         //Расход на 100км /10
          
OUTLINES[4] = buf[0];                                     //Средняя скорость
          
OUTLINES[5] = ((int)buf[1] << buf [2]);       //Трип
          
}

          if(
canId == 246//0F6
          
{
          
OUTLINES[6] = (buf[6] / 2) - 39;                           //Температура
          //Odometr = ((unsigned long)buf[2] << 16 | (unsigned int)buf[3] << 8 | buf[4])/10; //Там есть десятые километра
          
}
//______________________________ERROR MSG_________________________________
          
if(canId == 417//1A1
          
{
            if(
buf[0] == 128//buf[2]bit[1] X00000000 X=1 when SHOW 0R buf[0] 0x80(128) show, 0x7F(127) hide, 0xff(255) clear (default)
            
{
            
OUTLINES[7] = buf[1];
            } else {
OUTLINES[7] = -1;}
          }
//_________________________________VOLUME_________________________________          
          
if(canId == 421//1A5
          
{
          
OUTLINES[8] = buf[0];
          }
//_________________________Кнопки на руле справа__________________________
          
if(canId == 543//21F
          
{
/*          SWSV = buf[1];
          if(bitRead(buf[0],7) == 0 && bitRead(buf[0],6) == 0 && bitRead(buf[0],3) == 0 && bitRead(buf[0],2) == 0 && bitRead(buf[0],1) == 0){OUTLINES[8] = -1;} //Release
          if(bitRead(buf[0],7) == 1){OUTLINES[8] = 1;} //Forward
          if(bitRead(buf[0],6) == 1){OUTLINES[8] = 2;} //Backward
          if(bitRead(buf[0],3) == 1 && bitRead(buf[0],2) == 1){OUTLINES[8] = 3;} //Mute
          if(bitRead(buf[0],3) == 1 && bitRead(buf[0],2) == 0){OUTLINES[8] = 4;} //Vol Up
          if(bitRead(buf[0],2) == 1 && bitRead(buf[0],3) == 0){OUTLINES[8] = 5;} //Vol Down
          if(bitRead(buf[0],1) == 1){OUTLINES[8] = 6;} //Source */
          
}
//__________________________Меню настройки аудио__________________________
          
if(canId == 485//1E5
          
{
           
AP 0;
           
APV 0
           if (
bitRead(buf[0],7) == 1){AP 1APV = (buf[0] & 0x7F) - 63;} //BALANCE L/R ||логическое И с 01111111. Где 0 там всегда 0 
           
if (bitRead(buf[1],7) == 1){AP 2APV = (buf[1] & 0x7F) - 63;} //BALANCE RR/FF
           
if (bitRead(buf[2],7) == 1){AP 3APV = (buf[2] & 0x7F) - 63;} //BASS
           
if (bitRead(buf[4],7) == 1){AP 4APV = (buf[4] & 0x7F) - 63;} //TREBLE
           
if (bitRead(buf[5],7) == 1){AP 5APV bitRead(buf[5],6);}    //LOUD
           
if (bitRead(buf[5],4) == 1){AP 6APV bitRead(buf[5],2);}    //AUTO VOLUME
           
if (bitRead(buf[6],6) == 1){AP 7
                                       if ((
buf[6] & 0x1F) == 3){APV 1;}  //NONE ||//Логическое И c 00011111
                                       
if ((buf[6] & 0x1F) == 7){APV 2;}  //CLASSIC
                                       
if ((buf[6] & 0x1F) == 11){APV 3;} //JAZZ-BLUES
                                       
if ((buf[6] & 0x1F) == 15){APV 4;} //POP-ROCK
                                       
if ((buf[6] & 0x1F) == 19){APV 5;} //VOCAL
                                       
if ((buf[6] & 0x1F) == 23){APV 6;} //TECHNO
                                      
}
          
AUDIO String(AP) + ":" String(APV);
          }
//_______________Включено или нет радио, источник на радио________________
          
if(canId == 357//165
          
{
          if (
buf[0] == 192){OUTLINES[9] = 1;} else {OUTLINES[9] = 0;} //ON/OFF
          
if (buf[2] == 16){OUTLINES[9] = 2;} //Radio
          
if (buf[2] == 32){OUTLINES[9] = 3;} //CD
          
if (buf[2] == 48){OUTLINES[9] = 4;} //CD-Changer
          
if (buf[2] == 64){OUTLINES[9] = 5;} //AUX 1
          
if (buf[2] == 80){OUTLINES[9] = 6;} //AUX 2
          
}
//_________________________Банды и частота радио__________________________
//первые 2 меняются иногда, последнии 3 незнамо что (мусор или уровень сигнала), 
//частота и мусор не пропадают при отключении магнитолы
          
if(canId == 549//225
          
{
          if (
bitRead(buf[2],4) == 1){RB 0RFR = (int)buf[3] << buf[4];RFR RFR 20 50;}//FM1
          
if (bitRead(buf[2],5) == 1){RB 1RFR = (int)buf[3] << buf[4];RFR RFR 20 50;}//FM2
          
if (bitRead(buf[2],6) == 1){RB 2RFR = (int)buf[3] << buf[4];RFR RFR 20 50;}//FM AST
          
if (bitRead(buf[2],4) == && bitRead(buf[2],6) == 1){RB 3RFR = (int)buf[3] << buf[4];}//AM
          
BANDFREQ String(RB) + ":" String(RFR);
          }
//________________________________RDS_____________________________________
          
if(canId == 677//2A5
          
{
            for(
int i 0i<leni++)
            {
            
RDS RDS buf[i];
            }
          }
             
//Выводим данные.
/*
Serial.print("Steering while valcoder value:"); Serial.print(SWSV); Serial.print(" | ");
*/
if ((OUTLINES[0] != OUTLINES2[0] || 
    
OUTLINES[1] != OUTLINES2[1] || 
    
OUTLINES[2] != OUTLINES2[2] || 
    
OUTLINES[3] != OUTLINES2[3] || 
    
OUTLINES[4] != OUTLINES2[4] || 
    
OUTLINES[5] != OUTLINES2[5] || 
    
OUTLINES[6] != OUTLINES2[6] ||
    
OUTLINES[7] != OUTLINES2[7] ||
    
OUTLINES[8] != OUTLINES2[8] || 
    
AUDIO != AUDIO2 ||
    
OUTLINES[9] != OUTLINES2[9] ||
    
BANDFREQ != BANDFREQ2) &&
    (
millis() - time0) > 100)
    {
String s String(OUTLINES[0]) + "|" +
                
String(OUTLINES[1]) + "|" +
                
String(OUTLINES[2]) + "|" +
                
String(OUTLINES[3]) + "|" +
                
String(OUTLINES[4]) + "|" +
                
String(OUTLINES[5]) + "|" +
                
String(OUTLINES[6]) + "|" +
                
String(OUTLINES[7]) + "|" +
                
String(OUTLINES[8]) + "|" +
                
AUDIO "|" +
                
String(OUTLINES[9]) + "|" +
                
BANDFREQ;
        
Serial.print(s);
     
OUTLINES2[0] = OUTLINES[0];
     
OUTLINES2[1] = OUTLINES[1];
     
OUTLINES2[2] = OUTLINES[2];
     
OUTLINES2[3] = OUTLINES[3];
     
OUTLINES2[4] = OUTLINES[4];
     
OUTLINES2[5] = OUTLINES[5];
     
OUTLINES2[6] = OUTLINES[6];
     
OUTLINES2[7] = OUTLINES[7];
     
OUTLINES2[8] = OUTLINES[8];
     
AUDIO2 AUDIO;  
     
OUTLINES2[9] = OUTLINES[9];
     
BANDFREQ2 BANDFREQ;
        
time0 millis();
    }
}



T_r_D 02.02.2016 14:38

Вложений: 1
Ребят, а к вам вопрос!
Не могу разобраться в посылке листа списки станций!
У autowp написано следующее:

T_r_D 02.02.2016 14:40

Вложений: 1
Пакеты которые приходят вот:
Как это собрать просто в строки на стороне ардуины с пометкой строки которая в данный момент выделена?

autowp 02.02.2016 14:46

Смотрите в сторону ISO 15765-2 (мультифреймовые посылки)
https://en.wikipedia.org/wiki/ISO_15765-2
http://www.canbushack.com/blog/index...&c=1&tb=1&pb=1

T_r_D 02.02.2016 14:54

Да я понимаю как они идут.
Идёт пакет в котором сначала инфа техническая (показывает меню или нет и так далее), а последние два байта это начало строки данных.
Потом в какой- то посылке дальше идёт сообщение начинающиеся с символа "!" и после него 6 байт продолжение строки. Что значит 8 байт я не понимаю.

Как всю эту кашу собрать воедино-то. Я этого сообразить не могу.

autowp 02.02.2016 15:05

Цитата:

Сообщение от T_r_D (Сообщение 350481)
Да я понимаю как они идут.
Идёт пакет в котором сначала инфа техническая (показывает меню или нет и так далее), а последние два байта это начало строки данных.
Потом в какой- то посылке дальше идёт сообщение начинающиеся с символа "!" и после него 6 байт продолжение строки. Что значит 8 байт я не понимаю.

Как всю эту кашу собрать воедино-то. Я этого сообразить не могу.

Не, не надо так подходить к вопросу. Надо сначала собрать всю посылку в цельное сообщение, а уже потом анализировать её содержимое. Она переменной длины. Названий может не быть вообще или быть только частично.

Поэтому изучите организацию таких посылок и напишите код, который соберёт её, согласно протоколу. Готовый код на Си показать не могу, не писал, но вот на java, если чем-то поможет (ищите по слову isMultiFrame )
https://github.com/autowp/CAN/blob/m...CanClient.java

T_r_D 02.02.2016 16:16

Чо-то я не понимаю тогда!
Как организован пакет?
Идёт первая посылка, потом он ждёт ответа от принимающий стороны?
Потом кидает пакеты с данными длинна которых описана в первом пакете и опять ждёт подтверждения?
Или как?

autowp 02.02.2016 16:23

Примерно так, но в вашем случае, принимающая сторона уже есть и вам об этом (подтверждении) не придется беспокоиться. Вы "подслушиваете" обмен между другими устройствами.

T_r_D 02.02.2016 17:15

Ну тогда вопрос как отмечается конец посылки?
Как посылается длинна следующего пакета? Ну или если хотите, то данные о следующем пакете.

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

Да и кстати дисплея у меня потом не будет. Так что на мою железку и это ляжет.

autowp 02.02.2016 17:25

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

> Как посылается длинна следующего пакета?
Как и любого другого - в его DLC

> Можно описать человеческим языком как происходит обмен?
Я ж дал вам 2 ссылки с детальнейшим описанием всего процесса.

Dmitry8 02.02.2016 21:46

T_r_D, спасибо, нашёл уже. Я так понял, что вся логика работы вашего девайса организована на ардуине. С чем связано такое решение? Почему бы всю логику не реализовать на андройде?

T_r_D 03.02.2016 10:39

Цитата:

Сообщение от Dmitry8 (Сообщение 350533)
T_r_D, спасибо, нашёл уже. Я так понял, что вся логика работы вашего девайса организована на ардуине. С чем связано такое решение? Почему бы всю логику не реализовать на андройде?

Потому что логики тут мало :)
Получили пакет, переделали в стринг и отправили его.
В некоторых случаях проанализировали данные в пакете и отправили результат.

Так гораздо проще посылать пакеты и длина их получается приемлемой.
И на стороне андройда не надо следить за целостностью пакета, а проверять целостность можно по его длине.

T_r_D 03.02.2016 10:44

autowp
> как отмечается конец посылки?
зачем его как-то отмечать? Получили задекларированный объем данных - передача закончена

Где этот объём смотреть?
И вопрос второй был в том- посылается в первом пакете полный размер сообщения текста или только первого фрейма? Если всего, то не понятно зачем после каждого фрейма ждать подтверждения от дисплея, если только первого, то какой пакет посылает магнитола потом для описания следующего пакета с текстом и как узнать сколько всего пакетов в таком случае.

Я всё прочитал, но ни чего особо не понял к сожалению.
Мне бы на примере моих пакетов ткнули бы носом где какая посылка и что она значит был бы очень благодарен!

autowp 03.02.2016 11:47

>Где этот объём смотреть?

Вы точно смотрели то, что по ссылкам? В первом фрейме.

>И вопрос второй был в том- посылается в первом пакете полный размер сообщения текста или только первого фрейма?

Странный вопрос. Зачем в первом фрейме посылать размер первого фрейма? Он и так в DLC есть

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

Это мера, направленная на исключение перегрузки входного буфера принимающей стороны.

T_r_D 04.02.2016 00:45

Цитата:

Сообщение от autowp (Сообщение 350583)
>И вопрос второй был в том- посылается в первом пакете полный размер сообщения текста или только первого фрейма?

Странный вопрос. Зачем в первом фрейме посылать размер первого фрейма? Он и так в DLC есть

Я не так выразился просто. Имел в виду в первом фрейме указан размер данных всех последующих фреймов или только идущего за ним?

Как я понял в 4 байте первого фрейма указаны размеры 4 фреймов с данными далее?
Или всётаки 8?
Если 4, то первая пара бит указывает первым битом на количество данных о исполнители в пакете, а вторым на количество данных названия трека?

И почему в конце первого пакета 2 бита данных текстовых? Это биты относятся к исполнителю или треку?

autowp 04.02.2016 01:07

Цитата:

Сообщение от T_r_D (Сообщение 350640)
Я не так выразился просто. Имел в виду в первом фрейме указан размер данных всех последующих фреймов или только идущего за ним?

The first frame contains the length of the full packet, along with the initial data.
т.е. всего

Цитата:

Сообщение от T_r_D (Сообщение 350640)
Как я понял в 4 байте первого фрейма указаны размеры 4 фреймов с данными далее?
Или всётаки 8?
Если 4, то первая пара бит указывает первым битом на количество данных о исполнители в пакете, а вторым на количество данных названия трека?

И почему в конце первого пакета 2 бита данных текстовых? Это биты относятся к исполнителю или треку?

Еще раз: сначала соберите сообщение целиком, потом беритесь за его анализ. Иначе каша.

Когда соберете готовое сообщение, в 4ом (с нуля) байте получившегося блока данных (6ом с нуля байте первого фрейма) будут флажки, сигнализирующие о том, что следует искать в последующей части сообщение: названия исполнителей и треков (1100000 будет означать, что дальше будет 40 байт с исполнителем и названием первого трека, а остальные 3 трека не имеют названия и исполнителя)

T_r_D 04.02.2016 01:25

Вот кусок лога:
16 13 16 29 25 16 86 69
4 0 96
48 0 10
16 0
33 83 84 73 32 70 77 144
0 0 0 0 0 0 0 208
0 255 255 0 85 0 0
1 3 146 64 0 208 0 16
0 0 2 111 0 89 0 0
255 255 0 80 0
1 0 0 0 0 0 0 0
0 255 255 0 0 7 56 9
2 63 255 255 255 0 255 255

В первом сообщении в двух битах с конца буквы VE
В пятом ! S T I F M 

Можно ли считать первое сообщение заглавным мультифрейма?

По каким признакам вообще определить первое сообщение?
Как его найти в потоке данных?

В 4 байте первого сообщение DEC 25 что в бинарном виде 00011001
это означает что 20 байт следующие за этим сообщением названия артиста первого, потом 20 байт названия второго трека, потом 20 байт артиста 3 трека?
или я не с той стороны считаю биты?
или то что обозначено "0", то тоже занимает 20 байт?

autowp 04.02.2016 01:31

Лог должен быть в hex и выровненным, если вы хотите, чтобы в нем кто-то разбирался

https://en.wikipedia.org/wiki/ISO_15765-2
Написано, что первым является то сообщение, у которого в старших четырех битах единица (0001).
Так же сообщение может быть первым и единственным, если в вся посылка уместилась в 1 фрейм. Тогда в старших битах 0 (0000)

T_r_D 04.02.2016 02:04

Цитата:

Сообщение от autowp (Сообщение 350648)
Лог должен быть в hex и выровненным, если вы хотите, чтобы в нем кто-то разбирался

https://en.wikipedia.org/wiki/ISO_15765-2
Написано, что первым является то сообщение, у которого в старших четырех битах единица (0001).
Так же сообщение может быть первым и единственным, если в вся посылка уместилась в 1 фрейм. Тогда в старших битах 0 (0000)

тоесть моё сообщение является стартовым поскольку 16 в хексе это 0x10, что есть 00010000.
И если бы оно начиналось на 0x0, то это тоже то, что мне надо.

С этим разобрались.

T_r_D 04.02.2016 02:56

Так я правильно понял что информация о фреймах находиться в 4 байте который 25 в DEC или 0x19 в HEX?
Мне же эти данные и нужны для сборки пакета целиком. Как я без них его соберу-то?

мой лог в HEX
10 0D 10 1D 19 10 56 45
04 00 60
30 00 0A
10 00
21 53 54 49 20 46 4D 90
00 00 00 00 00 00 00 D0
00 FF FF 00 55 00 00 00
01 03 92 40 00 D0 00 10
00 00 02 6F 00 59 00 00
FF FF 00 50 00 00 00 00
01 00 00 00 00
00 FF FF 00 00 07 38 09
02 3F FF FF FF 00 FF FF

autowp 04.02.2016 03:04

Цитата:

Сообщение от T_r_D (Сообщение 350658)
Так я правильно понял что информация о фреймах находиться в 4 байте который 25 в DEC или 0x19 в HEX?
Мне же эти данные и нужны для сборки пакета целиком. Как я без них его соберу-то?

Абсолютно нет.

Забудьте на время про радиостанции, названия и прочее.
Перед вами CAN TP сообщение, передаваемое по кускам (CAN-фреймам).

Вся информация, необходимая для того, чтобы собрать сообщение в целую посылку, согласно таблице https://en.wikipedia.org/wiki/ISO_15765-2 , находится в 7 .. 4 (byte 0), 3 .. 0 (byte 0), 15 .. 8 (byte 1)

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

T_r_D 04.02.2016 04:26

Цитата:

Сообщение от autowp (Сообщение 350659)
Абсолютно нет.

Забудьте на время про радиостанции, названия и прочее.
Перед вами CAN TP сообщение, передаваемое по кускам (CAN-фреймам).

Вся информация, необходимая для того, чтобы собрать сообщение в целую посылку, согласно таблице https://en.wikipedia.org/wiki/ISO_15765-2 , находится в 7 .. 4 (byte 0), 3 .. 0 (byte 0), 15 .. 8 (byte 1)

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

Так, тоесть
7-4 бит байта 0 говорит нам о длине пакета. В данном случае он равен 1, тоесть 8..4095.

3-0 бит байта 0 это длина сообщения которую надо сложить с чем?
Что такое 15 .. 8 (byte 1)? это полностью первый байт или что?
Судя по всему пол байта 0 нужно сложить с байтом 1. Так?

Тогда получается что нам нужны 6 байт в этом пакете, а остальные 7 нужно добирать из сообщения которое начинается с 2, тоесть в бинаре старшие биты 7-4 0010, начиная со следующего байта или с байта идентификатора?
Так?
10 0D 10 1D 19 10 56 45 21 53 54 49 20 46 4D
или так?
10 0D 10 1D 19 10 56 45 53 54 49 20 46 4D 90

А биты 3-0 в байте 0 указывают на количество пакетов или на количество оставшихся или просто на номер этого пакета?

autowp 04.02.2016 10:44

Цитата:

Сообщение от T_r_D (Сообщение 350663)
Так, тоесть
7-4 бит байта 0 говорит нам о длине пакета. В данном случае он равен 1, тоесть 8..4095.

3-0 бит байта 0 это длина сообщения которую надо сложить с чем?
Что такое 15 .. 8 (byte 1)? это полностью первый байт или что?
Судя по всему пол байта 0 нужно сложить с байтом 1. Так?

Тогда получается что нам нужны 6 байт в этом пакете, а остальные 7 нужно добирать из сообщения которое начинается с 2, тоесть в бинаре старшие биты 7-4 0010, начиная со следующего байта или с байта идентификатора?
Так?
10 0D 10 1D 19 10 56 45 21 53 54 49 20 46 4D
или так?
10 0D 10 1D 19 10 56 45 53 54 49 20 46 4D 90

А биты 3-0 в байте 0 указывают на количество пакетов или на количество оставшихся или просто на номер этого пакета?

Ни так, ни так.
Зачем вы тащите сюда 10 0D?

Сходите по ссылке на wiki. Все, что обозначенно "data" - это данные. Их и надо собирать, чтобы получить содержимое сообщения.

Сами же вот правильно рассуждает, а делаете по-другому.

> Тогда получается что нам нужны 6 байт в этом пакете, а остальные 7 нужно добирать из сообщения которое начинается с 2

Т.е. от первых двух сообщений надо 6+7=13 байт.

Ваш "Так?" мне не понятен.по какой причине вы выкинули последний байт фрейма?

GASCHE 04.02.2016 12:10

Это посылка
10 0D 10 1D 19 10 56 45 First frame
30 00 0A 10 00 00 00 00 Flow control frame
21 53 54 49 20 46 4D 90 Consecutive frame
это данные в этой посылке
10 1D 19 10 56 45 53 54 49 20 46 4D 90
Не знаю как у вас но если стандартно то
10 - SID
1D - PID
19 10 56 45 53 54 49 20 46 4D 90 Какие то данные
Cудя по SID это запрос каких-то данных

Dmitry8 04.02.2016 13:26

10 0D 10 1D 19 10 56 45 - First Frame , данные 13 байт
30 00 0A - Flow Control
21 53 54 49 20 46 4D 90 - Consecutive Frame
Данные тут: 10 1D 19 10 56 45 53 54 49 20 46 4D 90
... VESTI FM

lti1 04.02.2016 13:41

Вложений: 1
Господа, а что означают выделенные данные в таком пакете? Машина другая, FF3, но раз пошла такая пляска...

10 90 A3 0 0 5 0 5
21 0 0D 10 10 10 0 0A
22 0 55 0 53 0 42 0
23 0 0 4C 0 69 0 6B
24 0 65 0 20 0 4E 0
25 6F 0 62 0 6F 0 64
26 0 79 0 20 0 45 0
27 6C 0 73 0 65 0 0
28 0 4D 0 79 0 20 0
29 44 0 61 0 72 0 6B
2A 0 65 0 73 0 74 0
2B 20 0 44 0 61 0 79
2C 0 73 0 0 4 1F 0
2D 2E 0 20 0 35 0 2F
2E 0 31 0 33 0 0 0A
2F 0A 0A 2 4 1E 4 3F
20 4 46 0 2E 0 0 4
21 1F 4 40 4 3E 4 41
22 4 3C 0 2E 0 0 4
23 18 4 3D 4 44 4 3E
24 0 0 CF 0 0 0 0

Вот, что на дисплее отображается в данный момент.

Dmitry8 04.02.2016 13:49

10 90 A3 0 0 5 0 5 - First frame
всё что дальше: 144 байта - Consecutive frame

autowp 04.02.2016 13:53

Цитата:

Сообщение от GASCHE (Сообщение 350710)
Не знаю как у вас но если стандартно то
10 - SID
1D - PID
19 10 56 45 53 54 49 20 46 4D 90 Какие то данные
Cудя по SID это запрос каких-то данных

Зацепило слово "стандартно". Есть какой-то стандарт?

Для меня открытыми и интересующими по TP являются вопросы:
- как выбирается ID traffic control frame'ов
- как определяется, какие ID являются multiframe

Пока мой ответ на это: стандарта нет, по согласованию разработчиков. Но мне не нравится такой ответ.

lti1 04.02.2016 14:06

Цитата:

Сообщение от Dmitry8 (Сообщение 350721)
10 90 A3 0 0 5 0 5 - First frame
всё что дальше: 144 байта - Consecutive frame

Мне не понятно то, что выделено жирным, то что там 144 байта я и так понял, калькулятором умею пользоваться. То есть начиная с A3 начинаются данные и их нужно как то разбирать?

T_r_D 04.02.2016 14:07

Так народ, не путайте меня.
Моё рассуждение правильно?
Что если пакет начинается с 0001 или 0000 это или первый пакет или единственный.
Младшая часть нулевого байта и весь первый байт это размер дальнейшего пакета(ов) с данными.
Пакеты с данными начинаются всегда 0010
кусок из вики: Consecutive 7 .. 4 (byte 0) 2.

GASCHE 04.02.2016 14:08

Цитата:

Сообщение от autowp (Сообщение 350722)
Есть какой-то стандарт?.

Под стандартом следует читать ISO 15765-2, ссылку на который приводили выше.

Dmitry8 04.02.2016 14:13

Цитата:

Сообщение от GASCHE (Сообщение 350710)
10 - SID
1D - PID

Про это ничего нет в ISO 15765-2

GASCHE 04.02.2016 14:28

Цитата:

Сообщение от T_r_D (Сообщение 350726)
Что если пакет начинается с 0001 или 0000 это или первый пакет или единственный

Не понял?
Single frame
01 3E FF FF FF FF FF FF
02 10 81 FF FF FF FF FF

Цитата:

Сообщение от Dmitry8 (Сообщение 350728)
Про это ничего нет в ISO 15765-2

Согласен!

Dmitry8 04.02.2016 14:31

GASCHE,
тогда поясните откуда вы взяли SID и PID?

T_r_D 04.02.2016 14:51

GASCHE в вики написано что 4 старших бита нулевого байта если 0000, то это одиночный пакет, а если 0001, то длинный, тоесть с мультифреймом.

так, скажите мне по коду- я правильно смещаю?

PHP код:

int Length;
       if(!
digitalRead(9)) // пин 9 можно переназначить                         
       
{
       
CAN.readMsgBuf(&lenbuf);
       
canId CAN.getCanId();

          if(
canId == 293// 125HEX
          
{
            if ((
buf[0] >> 4) == 16){
              
Length = ((buf[0] << 4) | buf[1]) - (len 2); 
            }
          }




autowp 04.02.2016 14:57

Цитата:

Сообщение от T_r_D (Сообщение 350734)
GASCHE в вики написано что 4 старших бита нулевого байта если 0000, то это одиночный пакет, а если 0001, то длинный, тоесть с мультифреймом.

так, скажите мне по коду- я правильно смещаю?

PHP код:

int Length;
       if(!
digitalRead(9)) // пин 9 можно переназначить                         
       
{
       
CAN.readMsgBuf(&lenbuf);
       
canId CAN.getCanId();

          if(
canId == 293// 125HEX
          
{
            if ((
buf[0] >> 4) == 16){
              
Length = ((buf[0] << 4) | buf[1]) - (len 2); 
            }
          }




Чтобы не писать "if(canId == 293) // 125HEX" и не забивать себе голову никому не нужными DEC'ами, рекомендую "if(canId == 0x125)"

(buf[0] >> 4) == 16

Это всегда false, не может быть равен 16и байт, 4 раза поделенный на 2

- (len - 2)

Вот это не понятно. Length - это что? (понятно, что длина, но длина чего?)

Dmitry8 04.02.2016 14:59

Код:

if ((buf[0] >> 4) == 0 // Single frame
...
 if ((buf[0] >> 4) == 0x01 // First Frame
...
 if ((buf[0] >> 4) == 0x02 // Consecutive Frame



Часовой пояс GMT +4, время: 09:09.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot