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 04.02.2016 15:00

Цитата:

Сообщение от autowp (Сообщение 350735)
Чтобы не писать "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 ?

GASCHE 04.02.2016 15:03

Цитата:

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

Да, я этого и не отрицаю.

T_r_D 04.02.2016 15:06

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

Куда чего надо смещать или с какой маской плюсовать чтоб узнать длину пакета?
Помогите плиз- чайник я в этом.

GASCHE 04.02.2016 15:26

Цитата:

Сообщение от T_r_D (Сообщение 350740)
Короче я со смещениями опять всё перепутал...

Так Dmitry8 вам правильно показал.
Цитата:

Сообщение от T_r_D (Сообщение 350740)
Куда чего надо смещать или с какой маской плюсовать чтоб узнать длину пакета?

Как-то так
buf[0] & 0x0F * 256 + buf[1]

T_r_D 04.02.2016 16:08

Вот что получилось.
Кстати почему не работает вот такой способ узнать длину массива
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];
                }
              
//тут надо обрабатывать полученный пакет  
              
}
            }  
          
          } 

Работоспособно?

GASCHE 04.02.2016 16:37

Цитата:

Сообщение от T_r_D (Сообщение 350748)
Работоспособно?

Не знаю, len - это что?

T_r_D 04.02.2016 18:47

Цитата:

Сообщение от GASCHE (Сообщение 350753)
Не знаю, 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

вот полный код
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(" ");
              }
            }  
          
          }
    }



GASCHE 04.02.2016 19:13

Цитата:

Сообщение от T_r_D (Сообщение 350766)
Это длина буфера с пришедшим сообщением

Цитата:

Сообщение от T_r_D (Сообщение 350658)
мой лог в 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.
К сожалению я не знаю язык на котором вы пишите.

T_r_D 04.02.2016 19:15

модифицировал чтоб видить пакеты
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);
вот так всё красиво!

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


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

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