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

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Общение с машиной

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2016, 15:00   #161
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

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

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

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

- (len - 2)

Вот это не понятно. Length - это что? (понятно, что длина, но длина чего?)
Это я хочу туда запихать длину пакета. А это - (len - 2) вычитание длины первого пакета и двух первых байт. В первом же пакете оставшиеся байты кроме первых двух входят в общею длину.

А если не смещать на 4, то нужно битовую маску?
buf[0] & 0xF0 ?
T_r_D вне форума   Ответить с цитированием
Старый 04.02.2016, 15:03   #162
GASCHE
Старший Пользователь
 
Аватар для GASCHE
 
Регистрация: 01.04.2010
Регион: 35
Сообщений: 697
GASCHE is on a distinguished road
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
GASCHE в вики написано что 4 старших бита нулевого байта если 0000, то это одиночный пакет, а если 0001, то длинный, тоесть с мультифреймом.
Да, я этого и не отрицаю.
GASCHE вне форума   Ответить с цитированием
Старый 04.02.2016, 15:06   #163
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Короче я со смещениями опять всё перепутал...

Куда чего надо смещать или с какой маской плюсовать чтоб узнать длину пакета?
Помогите плиз- чайник я в этом.
T_r_D вне форума   Ответить с цитированием
Старый 04.02.2016, 15:26   #164
GASCHE
Старший Пользователь
 
Аватар для GASCHE
 
Регистрация: 01.04.2010
Регион: 35
Сообщений: 697
GASCHE is on a distinguished road
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
Короче я со смещениями опять всё перепутал...
Так Dmitry8 вам правильно показал.
Цитата:
Сообщение от T_r_D Посмотреть сообщение
Куда чего надо смещать или с какой маской плюсовать чтоб узнать длину пакета?
Как-то так
buf[0] & 0x0F * 256 + buf[1]
GASCHE вне форума   Ответить с цитированием
Старый 04.02.2016, 16:08   #165
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Вот что получилось.
Кстати почему не работает вот такой способ узнать длину массива
int i = DataBuf.length?

PHP код:
          if(canId == 293// 125HEX
          
{
            if ((
buf[0] >> 4) == 0x01){
              
Length = (buf[0] & 0x0F 256 buf[1]) - (len -2);
              for (
int i=0i<len;i++){
              
DataBuf[i] = buf[i];
              }
            }

            if(((
buf[0] >> 4) == 0x02) && Length 0){
              
int sz sizeof(DataBuf);
              
Length Length len;

              if (
Length len){
                for (
int i sz< (len sz);i++){
                
DataBuf[i] = buf[i-sz];
                }
              }
              else{
                for (
int i =sz< (Length +sz);i++){
                
DataBuf[i] = buf[i-sz];
                }
              
//тут надо обрабатывать полученный пакет  
              
}
            }  
          
          } 
Работоспособно?
T_r_D вне форума   Ответить с цитированием
Старый 04.02.2016, 16:37   #166
GASCHE
Старший Пользователь
 
Аватар для GASCHE
 
Регистрация: 01.04.2010
Регион: 35
Сообщений: 697
GASCHE is on a distinguished road
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
Работоспособно?
Не знаю, len - это что?
GASCHE вне форума   Ответить с цитированием
Старый 04.02.2016, 18:47   #167
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Цитата:
Сообщение от GASCHE Посмотреть сообщение
Не знаю, len - это что?
Это длина буфера с пришедшим сообщением

Вот только не пойму
Length = (buf[0] & 0x0F * 256 + buf[1]) - (len -2);
постоянно возвращает -6.
тоесть (buf[0] & 0x0F * 256 + buf[1]) равно нулю!

Length это int
T_r_D вне форума   Ответить с цитированием
Старый 04.02.2016, 18:49   #168
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

вот полный код
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-битные

int LengthP
int DataBuf[100];
int DataBufSize;

void setup()
{
    
Serial.begin(38400);
    
pinMode(9INPUT);

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()) // check if data coming
if(!digitalRead(9))
    {
        
CAN.readMsgBuf(&lenbuf);
        
canId CAN.getCanId();
         
          if(
canId == 293// 125HEX
          
{
            
Serial.println("PKG");
            if ((
buf[0] >> 4) == 0x01)
            {
              
LengthP = (buf[0] & 0x0F 256 buf[1]) - (len 2);
              for (
int i=0i<len;i++){
              
DataBuf[i] = buf[i];
              
DataBufSize i;
              }
              
Serial.print("FIRST Length=");
              
Serial.println(LengthP);              
            }

            if(((
buf[0] >> 4) == 0x02) && LengthP 0){
              
int Length2 LengthP len;
              
Serial.print("SECOND Length=");
              
Serial.print(LengthP);
              
Serial.print(" len=");
              
Serial.println(len);
              
              if (
Length2 len){
              
Serial.println("SECOND>>> Length=");
              
Serial.print(LengthP);
              
Serial.print(" len=");
              
Serial.println(len);
              
                for (
int i 0len;i++){
                
DataBuf[i+DataBufSize] = buf[i];
                }
                
DataBufSize DataBufSize len;
              }
              else{
              
Serial.println("SECOND2>>> Length=");
              
Serial.print(LengthP);
              
Serial.print(" len=");
              
Serial.println(len);
              
                for (
int i=0LengthP;i++){
                
DataBuf[DataBufSize] = buf[i];
                }
                
DataBufSize DataBufSize LengthP;
                
                for (
int iDataBufSize;i++){
                 
Serial.print(DataBuf[i], HEX); 
                }
                
Serial.println(" ");
              }
            }  
          
          }
    }

T_r_D вне форума   Ответить с цитированием
Старый 04.02.2016, 19:13   #169
GASCHE
Старший Пользователь
 
Аватар для GASCHE
 
Регистрация: 01.04.2010
Регион: 35
Сообщений: 697
GASCHE is on a distinguished road
По умолчанию

Цитата:
Сообщение от T_r_D Посмотреть сообщение
Это длина буфера с пришедшим сообщением
Цитата:
Сообщение от T_r_D Посмотреть сообщение
мой лог в 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
Если сообщение 10 0D 10 1D 19 10 56 45 то
buf[0] & 0x0F * 256 = 0
buf[1] = 0D
Length = (buf[0] & 0x0F * 256 + buf[1]) = 0D общая длина сообщения.
Теперь
First frame количество значащих байт 6
j = 0;
for (int i=2; 6;i++){
DataBuf[j] = buf[i];
j++;
}
Теперь судя по логу надо искать 21 и со следующего байта копировать 7 или (Length - 6) байт если (Length - 6) < 7 потом искать 22 если надо и так далее пока не скопируете Length байт.
В этом случае в DataBuf будет посылка без обрамления и DataBufSize = Length.
К сожалению я не знаю язык на котором вы пишите.
GASCHE вне форума   Ответить с цитированием
Старый 04.02.2016, 19:15   #170
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

модифицировал чтоб видить пакеты
PHP код:
    {
        
CAN.readMsgBuf(&lenbuf);
        
canId CAN.getCanId();
         
          if(
canId == 293// 125HEX
          
{
            
Serial.print("PKG: ");
            for (
int i=0;i<len;i++){
            
Serial.print(buf[i], HEX);
            
Serial.print(" ");  
            }
            
Serial.println("");            
            
            if ((
buf[0] >> 4) == 0x01
В лог пришло следующее:
PKG: 10 D 10 1D 13 10 4E 52
FIRST Length=-6
PKG: 21 4A 31 30 34 2E 32 B0
PKG: 10 D 10 1D 12 10 4D 41
FIRST Length=-6
PKG: 21 58 49 4D 55 4D 20 80
PKG: 10 D 10 1D 11 10 20 4D
FIRST Length=-6
PKG: 21 2D 43 41 52 4C 4F 90
PKG: 10 D 10 1D 10 10 20 20
FIRST Length=-6
PKG: 21 4A 61 7A 7A 20 20 90
PKG: 10 D 10 1D F 10 46 4D
FIRST Length=-6
PKG: 21 20 38 39 2E 39 20 90
PKG: 10 D 10 1D E 10 45 75
FIRST Length=-6
PKG: 21 72 6F 70 61 20 20 90
PKG: 10 D 10 1D D 10 44 4F
FIRST Length=-6
PKG: 21 50 4F 2A 48 4F 45 80
PKG: 10 D 10 1D C 10 44 46
FIRST Length=-6
PKG: 21 4D 44 41 4E 43 45 90
PKG: 10 D 10 1D B 10 20 44
FIRST Length=-6
PKG: 21 41 43 48 41 20 20 90
PKG: 10 D 10 1D A 10 20 43
FIRST Length=-6
PKG: 21 4F 4D 45 44 59 20 90
PKG: 10 D 10 1D 9 10 42 45
FIRST Length=-6
PKG: 21 53 54 20 46 4D 20 90
PKG: 10 D 10 1D 8 10 42 45
FIRST Length=-6
PKG: 21 43 48 41 20 46 4D 90
PKG: 10 D 10 1D 7 10 61 6E
FIRST Length=-6
PKG: 21 73 6F 6E 2E 66 6D 80
PKG: 10 D 10 1D 6 10 39 38
FIRST Length=-6
PKG: 21 2E 38 20 46 4D 20 90
PKG: 10 D 10 1D 5 10 20 39
FIRST Length=-6
PKG: 21 38 2E 34 20 46 4D 90
PKG: 10 D 10 1D 4 10 20 39
FIRST Length=-6
PKG: 21 36 2C 38 20 46 4D 90
PKG: 10 D 10 1D 3 10 39 30
FIRST Length=-6
PKG: 21 2E 33 20 46 4D 20 B0
PKG: 10 D 10 1D 2 10 38 38
FIRST Length=-6
PKG: 21 2E 37 20 46 4D 20 B0
PKG: 10 D 10 1D 1 10 20 20
FIRST Length=-6
PKG: 21 38 38 2E 33 20 20 90
PKG: 10 D 10 1D 0 10 31 30
FIRST Length=-6
PKG: 21 37 2E 38 20 46 4D 80

Грабли точно в строке
LengthP = (buf[0] & 0x0F * 256 + buf[1]) - (len - 2);
Может её нужно как-то по другому записать или скобок где наставить?

Короче сам разобрался
скобок не хватало
LengthP = ((buf[0] & 0x0F) * 256 + buf[1]) - (len - 2);
вот так всё красиво!

От тестировал - пакет собирается. Но у меня почему-то по одному пакету данных всегда...
Возможно из за дисплея.
И по сути в этом пакете ни чего важного больше и нет.
Можно просто строку эту вытащить и всё.

Последний раз редактировалось T_r_D; 04.02.2016 в 23:44.
T_r_D вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
 

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



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


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