Search code examples
matlabserial-portarduinobufferfwrite

Writing to Serial Matlab with fwrite - data incorrect after 7 bytes


I'm trying to send data to an Arduino via a serial communication. I'm using a buffer to store bytes I'd like to send and then use the fwrite command to write them to serial.

Sender (Matlab)

disp(bufferSend);
fwrite(xbee,bufferSend,'uint8');
disp('sent:');    
xbee.ValuesSent

the display command shows that 255 bytes hav2 been sent:

 2     1     0     0     0     1     1    13    17     0    30     0    12    14     0     0     0     1    0   
[...] 0     0    0     [...]   0

sent: 

255

Receiver (Arduino)

the received values are correct till the 7-th byte. Only 70 bytes are received;

The Arduino serial monitor prints one byte at the time with the following code:

 byte getData;
 [...]
 while(xbee.available()>0)
 {  
   getData = xbee.read();  


   Serial.print("Received: ");
   Serial.print(getData);
   Serial.print("         Bin:  ");
   Serial.print(getData,BIN);
   Serial.print("         Hex:  ");
   Serial.print(getData,HEX);
   Serial.print("         cont:  ");
   Serial.print(cont);
   Serial.println();
   [...]
 }

Here is the output:

Matlab communication established. 

Received: 2         Bin:  10         Hex:  2         cont:  2

Received: 1         Bin:  1         Hex:  1         cont:  3

Received: 0         Bin:  0         Hex:  0         cont:  4

Received: 0         Bin:  0         Hex:  0         cont:  5

Received: 0         Bin:  0         Hex:  0         cont:  6

Received: 1         Bin:  1         Hex:  1         cont:  7

Received: 1         Bin:  1         Hex:  1         cont:  8

Received: 141         Bin:  10001101         Hex:  8D         cont:  9

Received: 145         Bin:  10010001         Hex:  91         cont:  10

Received: 128         Bin:  10000000         Hex:  80         cont:  11

Received: 143         Bin:  10001111         Hex:  8F         cont:  12

Received: 128         Bin:  10000000         Hex:  80         cont:  13

Received: 134         Bin:  10000110         Hex:  86         cont:  14

Received: 135         Bin:  10000111         Hex:  87         cont:  15

Received: 128         Bin:  10000000         Hex:  80         cont:  16

Received: 128         Bin:  10000000         Hex:  80         cont:  17

Received: 128         Bin:  10000000         Hex:  80         cont:  18

Received: 128         Bin:  10000000         Hex:  80         cont:  19

Received: 128         Bin:  10000000         Hex:  80         cont:  20

Received: 128         Bin:  10000000         Hex:  80         cont:  21

Received: 128         Bin:  10000000         Hex:  80         cont:  22

Received: 128         Bin:  10000000         Hex:  80         cont:  23

Received: 128         Bin:  10000000         Hex:  80         cont:  24

Received: 128         Bin:  10000000         Hex:  80         cont:  25

Received: 128         Bin:  10000000         Hex:  80         cont:  26

Received: 128         Bin:  10000000         Hex:  80         cont:  27

Received: 128         Bin:  10000000         Hex:  80         cont:  28

Received: 128         Bin:  10000000         Hex:  80         cont:  29

Received: 128         Bin:  10000000         Hex:  80         cont:  30

Received: 128         Bin:  10000000         Hex:  80         cont:  31

Received: 128         Bin:  10000000         Hex:  80         cont:  32

Received: 128         Bin:  10000000         Hex:  80         cont:  33

Received: 128         Bin:  10000000         Hex:  80         cont:  34

Received: 64         Bin:  1000000         Hex:  40         cont:  35

Received: 64         Bin:  1000000         Hex:  40         cont:  36

Received: 64         Bin:  1000000         Hex:  40         cont:  37

Received: 64         Bin:  1000000         Hex:  40         cont:  38

Received: 64         Bin:  1000000         Hex:  40         cont:  39

Received: 64         Bin:  1000000         Hex:  40         cont:  40

Received: 64         Bin:  1000000         Hex:  40         cont:  41

Received: 64         Bin:  1000000         Hex:  40         cont:  42

Received: 64         Bin:  1000000         Hex:  40         cont:  43

Received: 64         Bin:  1000000         Hex:  40         cont:  44

Received: 64         Bin:  1000000         Hex:  40         cont:  45

Received: 64         Bin:  1000000         Hex:  40         cont:  46

Received: 64         Bin:  1000000         Hex:  40         cont:  47

Received: 64         Bin:  1000000         Hex:  40         cont:  48

Received: 64         Bin:  1000000         Hex:  40         cont:  49

Received: 64         Bin:  1000000         Hex:  40         cont:  50

Received: 64         Bin:  1000000         Hex:  40         cont:  51

Received: 64         Bin:  1000000         Hex:  40         cont:  52

Received: 64         Bin:  1000000         Hex:  40         cont:  53

Received: 64         Bin:  1000000         Hex:  40         cont:  54

Received: 64         Bin:  1000000         Hex:  40         cont:  55

Received: 64         Bin:  1000000         Hex:  40         cont:  56

Received: 64         Bin:  1000000         Hex:  40         cont:  57

Received: 64         Bin:  1000000         Hex:  40         cont:  58

Received: 64         Bin:  1000000         Hex:  40         cont:  59

Received: 32         Bin:  100000         Hex:  20         cont:  60

Received: 32         Bin:  100000         Hex:  20         cont:  61

Received: 32         Bin:  100000         Hex:  20         cont:  62

Received: 32         Bin:  100000         Hex:  20         cont:  63

Received: 32         Bin:  100000         Hex:  20         cont:  64

Received: 0         Bin:  0         Hex:  0         cont:  65

Received: 0         Bin:  0         Hex:  0         cont:  66

Received: 0         Bin:  0         Hex:  0         cont:  67

Received: 0         Bin:  0         Hex:  0         cont:  68

Received: 0         Bin:  0         Hex:  0         cont:  69

Received: 0         Bin:  0         Hex:  0         cont:  70

Received: 0         Bin:  0         Hex:  0         cont:  71



[...]

If the eigth value (i.e 13) is placed in the first positions on the buffer, Arduino receives it correctly.

Is it related to the fwrite function and buffer dimensions? Is it a case of buffer overflow?

Solution

Slow down the Baudrate! In my case 19200 worked


Solution

  • This looks like a hardware issue. It appears that the bits of the the values are getting corrupted.

    141 is 13 with the first bit flipped

    145 is 17 with the first bit flipped

    128 is 0 with the first bit flipped

    143 is 30 shifted right, and the first bit flipped

    You haven't said how the matlab is connected to xbee. Could the problem be incompatible voltage levels or baudrate? A problem like this would show symptoms of the first bytes being okay, and then later the bytes go bad as the communication gets out of sync. If this were the problem, then the errors would appear with some randomness. Are the received values always the same for a given set of bytes?

    The communication between the xbee modules is probably okay, as there should be a checksum involved to make sure the packets are not corrupted.

    That leaves the serial communication between matlab and the first xbee, and the serial communication between the shield and the arduino.

    You can also try a Serial.readBytes() call to see if that makes a difference.