Go Down

Topic: Program doest work with sprintf (Read 473 times) previous topic - next topic

edubillo

Jan 13, 2013, 09:21 am Last Edit: Jan 13, 2013, 11:04 am by Coding Badly Reason: 1
Problem:
   My problem is that the output of the sprintf doesnt display when another Serial.print code is executed.


This is my code:

Code: [Select]
#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: [Select]
#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.

dc42

Please edit your post, putting code tags around the code so that it displays properly.
Formal verification of safety-critical software, software development, and electronic design and prototyping. See http://www.eschertech.com. Please do not ask for unpaid help via PM, use the forum.

Chaul

#2
Jan 13, 2013, 10:13 am Last Edit: Jan 13, 2013, 06:12 pm by Chaul Reason: 1
Code: [Select]
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: [Select]
buff[i] = Wire.read()
?

Edit: Ahah, never mind. I didn't realize the lack of code tags messed up with the formatting that badly.

wildbill

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.

PaulS

Code: [Select]
  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: [Select]
  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.

PeterH


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);

I only provide help via the forum - please do not contact me for private consultancy.

Nick Gammon

Code: [Select]
 
  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
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

Go Up