Go Down

Topic: Program doest work with sprintf (Read 511 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy