Opticall.dx() wert auslesen und weiter senden geht nicht

Hallo Zusammen,

habe eine Lücke in meinen C Kenntnissen.

Mein Problem:

Ich kann mit PrintIn aus einer Funktion in Decimal werte Ausgeben.

Serial.println(Optical1.dx(), DEC);
delay(5);

ich möchte aber diese Werte über CAN senden

CAN.sendMsgBuf (0x00,0,8, Opticall.dx()); //

Er Gibt mir jedesmal einen fehler -.-

Weniger schön für Dich.
Was erwartest Du jetzt von uns?
Daß wir hellsehen welche Hardware und welche Bibliotheken Du benutzt und wie Dein Sketch aussieht?
Grüße Uwe

uwefed:
Was erwartest Du jetzt von uns?

Vermutlich möchte der OP wissen, welche Frage er stellen muss. Ich sehe keine.

Gruß

Gregor

Er Gibt mir jedesmal einen fehler -.-

Du könntest die Fehlermeldung mal lesen.

Meistens sagen Fehlermeldungen, was falsch läuft.

sry, saß noch im Zug,
Hardware Arduino Uno R3

#include "PAN3101.h"
#include "mcp_can.h"    //CANBUS
#include "SPI.h"        //CANBUS
// #include "ADNS2051.h"
// #include "ADNS2610.h"
// #include "ADNS2620.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;                                   //CANBUS:

MCP_CAN CAN(SPI_CS_PIN);                                    //CANBUS: Set CS pin

#define SCLK 2                            // Serial clock pin on the Arduino
#define SDIO 3                            // Serial data (I/O) pin on the Arduino

PAN3101 Optical1 = PAN3101(SCLK, SDIO);   // Create an instance of the PAN3101 object
// ADNS2051 Optical1 = ADNS2051(SCLK, SDIO);
// ADNS2610 Optical1 = ADNS2610(SCLK, SDIO);
// ADNS2610 Optical1 = ADNS2610(SCLK, SDIO);

void setup()
{
  Serial.begin(38400);                      //Standart Baudrate 38400
  Optical1.begin();                        // Resync (really necessary?)

    /*  while (CAN_OK != CAN.begin(CAN_500KBPS))              // CANBUS: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!");              // CANBUS
    */
}

signed char stmp[8] = {0,0,0,0,0,0,0,0};
void loop()
{
  // It's also possible to check whether the internal counter of the sensor
  // has rolled over (overflow), on the PAN3101 and the ADNS2051:
  
  //Optical1.updateStatus();
  //if (Optical1.dxOverflow()) Serial.println("Overflow...");
  
   // 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);   // hier möchte ich direkt vor oder nach dem Println die daten per CanMsgBuf senden
    Serial.println(Optical1.dx(), DEC);
    delay(5);
 
   // delay(100);                       // send data per 100ms

}

CAN.sendMsgBuf(0x00, 0, 8, stmp); // hier möchte ich direkt vor oder nach dem Println die daten per CanMsgBuf senden
Serial.println(Optical1.dx(), DEC);
delay(5);

Pan3101.h

#ifndef PAN3101_h
#define PAN3101_h

#include "Arduino.h"
#include <inttypes.h>

#include "OptiMouse.h"

class PAN3101 : public OptiMouse
{
  private:
	uint8_t _status;
  public:
	PAN3101(uint8_t, uint8_t);
	void updateStatus(void);
	signed char dx(void);
	signed char dy(void);
	uint8_t motion() const;
	uint8_t dxOverflow() const;
	uint8_t dyOverflow() const;
};

#endif

OptMouse.h

#ifndef OptiMouse_h
#define OptiMouse_h

#include "Arduino.h"
#include <inttypes.h>

class OptiMouse
{
  private:
  protected:
	uint8_t _sclkPin;
    uint8_t _sdioPin;
	uint8_t readRegister(uint8_t);
	void writeRegister(uint8_t, uint8_t);
  public:
    OptiMouse(uint8_t, uint8_t);
    void begin(void);
	signed char dx(void);	//dx(void) vorher
	signed char dy(void);	//dx(void) vorher
};

#endif

CAN.sendMsgBuf(0x00, 0, 8, stmp);
Ist es nicht offensichtlich, dass dieses einen gefüllten Buffer erwartet?

Wäre es dann nicht sinnvoll, den gewünschten Buffer mit deinen zu sendenden Daten zu füllen?

Ja stimmt :confused:

....    
         unsigned char stmp[100];
    int i;
    Serial.println(Optical1.dx(), DEC);
    delay(5);
      for (i = 0; i < 100; i = i + 1) {
      Serial.println(stmp[i]=Optical1.dx(), DEC);
      CAN.sendMsgBuf(0x00,0,0,stmp[i]);
      i--;
      }
....

Habs nun so kompiliert bekommen.

Das mag zwar evtl. kompilieren, macht aber mit Sicherheit nicht, was Du willst.

Du suchst z.B. itoa oder sprintf.

Gruß Tommy

Du suchst z.B. itoa oder sprintf.

Nicht unbedingt.

Die Frage ist:
Will ich Binärdaten übertragen oder eine Zeichenkette?

Zeichenketten wären für CAN eher ungewöhnlich.

combie:
Nicht unbedingt.

Die Frage ist:
Will ich Binärdaten übertragen oder eine Zeichenkette?

Zeichenketten wären für CAN eher ungewöhnlich.

definitiv Binär

Ok, für binär das nicht. Da hat mich wohl der Variablenname msg zu ASCII verführt.

Gruß Tommy