Loading...
Pages: [1]   Go Down
Author Topic: Program doest work with sprintf  (Read 215 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Problem:
    My problem is that the output of the sprintf doesnt display when another Serial.print code is executed.


This is my code:

Code:
#include <Wire.h>

#define DEVICE (0x53)    //ADXL345 device address
#define TO_READ (6)        //num of bytes we are going to read each time (two bytes for each axis)

byte buff[TO_READ] ;    //6 bytes buffer for saving data read from the device
char str[512];                      //string buffer to transform data before sending it to the serial port

void setup()
{
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
  
  //Turning on the ADXL345
  writeTo(DEVICE, 0x2D, 0);      
  writeTo(DEVICE, 0x2D, 16);
  writeTo(DEVICE, 0x2D, 8);
}

void loop()
{
  int regAddress = 0x32;    //first axis-acceleration-data register on the ADXL345
  int x, y, z;
  
  readFrom(DEVICE, regAddress, TO_READ, buff); //read the acceleration data from the ADXL345
  
   //each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
   //thus we are converting both bytes in to one int
  x = (((int)buff[1]) << 8) | buff[0];  
  y = (((int)buff[3])<< 8) | buff[2];
  z = (((int)buff[5]) << 8) | buff[4];
 
  //we send the x y z values as a string to the serial port
  sprintf(str, "%d %d %d", x, y, z);  
  Serial.print(str);
  
  Serial.write(10);
  
  
  
  
  //It appears that delay is needed in order not to clog the port
  delay(100);
}

//---------------- Functions
//Writes val to address register on device
void writeTo(int device, byte address, byte val) {
   Wire.beginTransmission(device); //start transmission to device
   Wire.write(address);        // send register address
   Wire.write(val);        // send value to write
   Wire.endTransmission(); //end transmission
}

//reads num bytes starting from address register on device in to buff array
void readFrom(int device, byte address, int num, byte buff[]) {
  Wire.beginTransmission(device); //start transmission to device
  Wire.write(address);        //sends address to read from
  Wire.endTransmission(); //end transmission
  
  Wire.beginTransmission(device); //start transmission to device
  Wire.requestFrom(device, num);    // request 6 bytes from device
  
  int i = 0;
  while(Wire.available())    //device may send less than requested (abnormal)
  {
    buff[i] = Wire.read(); // receive a byte
    i++;
  }
  Wire.endTransmission(); //end transmission
}


This is the code when it is not displaying any numbers on the COMPORT.It is the time when I added a Serial.print function just after the sprintf code

Code:
#include <Wire.h>

#define DEVICE (0x53)    //ADXL345 device address
#define TO_READ (6)        //num of bytes we are going to read each time (two bytes for each axis)

byte buff[TO_READ] ;    //6 bytes buffer for saving data read from the device
char str[512];                      //string buffer to transform data before sending it to the serial port

void setup()
{
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
  
  //Turning on the ADXL345
  writeTo(DEVICE, 0x2D, 0);      
  writeTo(DEVICE, 0x2D, 16);
  writeTo(DEVICE, 0x2D, 8);
}

void loop()
{
  int regAddress = 0x32;    //first axis-acceleration-data register on the ADXL345
  int x, y, z;
  
  readFrom(DEVICE, regAddress, TO_READ, buff); //read the acceleration data from the ADXL345
  
   //each axis reading comes in 10 bit resolution, ie 2 bytes.  Least Significat Byte first!!
   //thus we are converting both bytes in to one int
  x = (((int)buff[1]) << 8) | buff[0];  
  y = (((int)buff[3])<< 8) | buff[2];
  z = (((int)buff[5]) << 8) | buff[4];
 
  //we send the x y z values as a string to the serial port
  sprintf(str, "%d %d %d", x, y, z);  
  Serial.print(str);
  
  Serial.write(10);
  
[i][b]  Serial.print("doenst work with this");
Serial.write(10);[/b][/i]
  
  
  //It appears that delay is needed in order not to clog the port
  delay(100);
}

//---------------- Functions
//Writes val to address register on device
void writeTo(int device, byte address, byte val) {
   Wire.beginTransmission(device); //start transmission to device
   Wire.write(address);        // send register address
   Wire.write(val);        // send value to write
   Wire.endTransmission(); //end transmission
}

//reads num bytes starting from address register on device in to buff array
void readFrom(int device, byte address, int num, byte buff[]) {
  Wire.beginTransmission(device); //start transmission to device
  Wire.write(address);        //sends address to read from
  Wire.endTransmission(); //end transmission
  
  Wire.beginTransmission(device); //start transmission to device
  Wire.requestFrom(device, num);    // request 6 bytes from device
  
  int i = 0;
  while(Wire.available())    //device may send less than requested (abnormal)
  {
    buff[i] = Wire.read(); // receive a byte
    i++;
  }
  Wire.endTransmission(); //end transmission
}

Thanks for helping me.Gobless:))


Moderator edit: [code] [/code] tags added.
« Last Edit: January 13, 2013, 05:04:38 am by Coding Badly » Logged

United Kingdom
Offline Offline
Faraday Member
**
Karma: 131
Posts: 4689
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Please edit your post, putting code tags around the code so that it displays properly.
Logged

Formal verification of safety-critical software, software development, and electronic design and prototyping. http://www.eschertech.com

Finland
Offline Offline
Jr. Member
**
Karma: 1
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
buff = Wire.read()
I don't understand how this line works if buff is a pointer to the start of an array.

It would just write the last byte read into buff[0].
Shouldn't it read
Code:
buff[i] = Wire.read()
?

Edit: Ahah, never mind. I didn't realize the lack of code tags messed up with the formatting that badly.
« Last Edit: January 13, 2013, 12:12:42 pm by Chaul » Logged

New Jersey
Offline Offline
Edison Member
*
Karma: 24
Posts: 2354
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

You have used a quarter of your RAM on space for str. IIRC, the wire library uses quite a bit too - your issue therefore may be that you're out of memory - try making it (much) smaller.
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 316
Posts: 35566
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
  int x, y, z;
The longest, as a string, value that you store in these variables is "-32768". That's 6 characters per variable.

Code:
  sprintf(str, "%d %d %d", x, y, z); 
6 * 3 = 18. 18 + 2 (spaces) = 20. 20 + 1 (terminating NULL) = 21.

21 is long, long way from the wasteful 512 you allocated.
Logged

UK
Offline Offline
Tesla Member
***
Karma: 89
Posts: 6400
-
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Problem:
    My problem is that the output of the sprintf doesnt display when another Serial.print code is executed.

I don't know whether it will solve your problem, but instead of outputting the newline by  'Serial.write(10)' it would be cleaner to either put the newline character in your message:


sprintf(str, "%d %d %d\n", x, y, z); 


OR append the newline when you print the message:

Serial.println(str);

Logged

Global Moderator
Melbourne, Australia
Offline Offline
Shannon Member
*****
Karma: 219
Posts: 13896
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
 
  Wire.beginTransmission(device); //start transmission to device
  Wire.requestFrom(device, num);    // request 6 bytes from device
...
  Wire.endTransmission(); //end transmission

Do not wrap Wire.requestFrom inside Wire.beginTransmission and Wire.endTransmission.

http://gammon.com.au/i2c
Logged


Pages: [1]   Go Up
Print
 
Jump to: