0
votes

I am using a MMA7361 accelerometer from sparkfun that is connected to my arduino uno and it is in turn connected to my pc.

I am simply reading the values from each axis(x,y,z) and sending them straight through the serial port to my pc with a series of Serial.print and Serial.write. From there I have set up a program to read and display the info with myPort.readString();

Now it works fine 80% of the time and it gives the right results and all, but sometimes I get some random value sent through the serial port and it messes up the receiving program making me unable to use the signal properly.

I am pretty sure its not the sensor itself sending the disturbing signal because I have tried to save 10 different readings and then sending an average to minimize the effect with no luck. The receiving pc still got the weird value spikes around 0-200 (from what I saw as output).

I tried with pulling out the cable that connects from the sensor to the analog in port and weirdly it gave out some random value instead of the expected 0, I'm not sure but for me it seems like that has something to do about my problem.

I have read about some kind of pull down resistor but that only works for buttons, right?

I just got my arduino and I'm trying to learn how to use sensors and what you can do with them and what can go wrong so I'd appreciate if someone could help me with this :)

Heres an example of the random value messing up the output:

252:236:218

251:202:215
2                        <-- this is where it begins
59:231:245
28
4:144:142                <-- messing up the order of the values
251:19
2:187
246:235
:244
240:190:
238
250:202:2
32
248:243:224

245:227:240

251:228:244

253:223:241

If you want I got the code for sending and recieving too:

Serial.print(analogRead(xpin));
Serial.write(":");
Serial.print(analogRead(ypin));
Serial.write(":");
Serial.println(analogRead(zpin));

I'd really like the sending to be just one line of code but I haven't been able to join all numbers and strings to a one line string on the arduino. Recieving:

if ( myPort.available() > 0) {
  result = myPort.readString();
  println(result);
}
2
try to add a small delay between the print statements. Maybe a few milliseconds. delay(5) for example. What language are you using on your PC for reading the serial port?user2019047
It did actually help a bit with 1ms delay but it still gets those numbers messing up the list. I tried with 5 or 10 but the more it is the worse it gets.Patrick Dahlin
And I am using processing to receive the information.Patrick Dahlin

2 Answers

0
votes

Looking at your output, it seems that the values are all received, but somehow a CR and/or LF character is added to the output. And that comes from the println statement:

if ( myPort.available() > 0) {
  result = myPort.readString();
println(result);
}

What happens is that the receiving end gets some characters (not necessarily all), it prints them, adding a linefeed character then exits the function.

Then it enters the if statement again and prints the available characters in the buffer. And so it goes.

If you wish to ensure a consistent output you have to either 1. build a packet of the data or 2. Count the received bytes and print them when all are received.

As to 1. it would be my preferred method, add a start- and end-character to the data. The receiving end will then know that all data between the start- and end-character is the data to be printed.

0
votes

I seem to have fixed this by using readChar and checking if the current character inputted is the delimiter. It is a bit slower but it works.