title: Uart / GPS driver sample buffer overflow
body: <p>I am trying the sample for the GPS driver with a raspberry pi 3 and the Ultimate GPS V3 breakout board.</p>
  
  <p>Here is the full source code: <a href="https://github.com/androidthings/drivers-samples/tree/master/gps" rel="nofollow noreferrer">https://github.com/androidthings/drivers-samples/tree/master/gps</a></p>
  
  <p>The GPS board is connected following this schematics:
  <a href="https://i.stack.imgur.com/laSMt.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/laSMt.jpg" alt="enter image description here"></a></p>
  
  <p>When launching the sample app, I get the following error:</p>
  
  <pre><code>com.example.androidthings.driversamples E/AndroidRuntime: FATAL EXCEPTION: main
  
  
  Process: com.example.androidthings.driversamples, PID: 1299
     java.nio.BufferOverflowException
         at java.nio.Buffer.nextPutIndex(Buffer.java:508)
         at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:142)
         at com.google.android.things.contrib.driver.gps.NmeaGpsModule.processBuffer(NmeaGpsModule.java:178)
         at com.google.android.things.contrib.driver.gps.NmeaGpsModule.readUartBuffer(NmeaGpsModule.java:160)
         at com.google.android.things.contrib.driver.gps.NmeaGpsModule.access$000(NmeaGpsModule.java:35)
         at com.google.android.things.contrib.driver.gps.NmeaGpsModule$1.onUartDeviceDataAvailable(NmeaGpsModule.java:139)
         at com.google.android.things.pio.UartDevice$UartDeviceCallbackDispatch.dispatchInterruptEvent(UartDevice.java:507)
         at com.google.android.things.pio.CallbackDispatch.onFileDescriptorEvents(CallbackDispatch.java:127)
         at android.os.MessageQueue.dispatchEvents(MessageQueue.java:282)
         at android.os.MessageQueue.nativePollOnce(Native Method)
         at android.os.MessageQueue.next(MessageQueue.java:323)
         at android.os.Looper.loop(Looper.java:136)
         at android.app.ActivityThread.main(ActivityThread.java:6077)
         at java.lang.reflect.Method.invoke(Native Method)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
  </code></pre>
  
  <hr>
  
  <h2>Update 1</h2>
  
  <p>After enabling the debug in the contrib-driver project, I see a new error: <code>W/NmeaParser: Invalid checksum (62), expected 108</code></p>
  
  <pre><code>12-28 17:53:28.638 1378-1378/com.example.androidthings.driversamples D/XXX: Debug version used
  12-28 17:53:29.451 1378-1378/com.example.androidthings.driversamples I/Choreographer: Skipped 34 frames!  The application may be doing too much work on its main thread.
  12-28 17:53:29.862 1378-1378/com.example.androidthings.driversamples W/NmeaParser: Invalid checksum (62), expected 108
  12-28 17:53:29.862 1378-1378/com.example.androidthings.driversamples D/XXX: Buffer reset
  12-28 17:53:30.427 1378-1378/com.example.androidthings.driversamples D/AndroidRuntime: Shutting down VM
  12-28 17:53:30.428 1378-1378/com.example.androidthings.driversamples E/AndroidRuntime: FATAL EXCEPTION: main
     Process: com.example.androidthings.driversamples, PID: 1378
     java.nio.BufferOverflowException
         at java.nio.Buffer.nextPutIndex(Buffer.java:508)
         at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:142)
         at com.google.android.things.contrib.driver.gps.NmeaGpsModule.processBuffer(NmeaGpsModule.java:179)
         at com.google.android.things.contrib.driver.gps.NmeaGpsModule.readUartBuffer(NmeaGpsModule.java:161)
         at com.google.android.things.contrib.driver.gps.NmeaGpsModule.access$000(NmeaGpsModule.java:35)
         at com.google.android.things.contrib.driver.gps.NmeaGpsModule$1.onUartDeviceDataAvailable(NmeaGpsModule.java:140)
         at com.google.android.things.pio.UartDevice$UartDeviceCallbackDispatch.dispatchInterruptEvent(UartDevice.java:507)
         at com.google.android.things.pio.CallbackDispatch.onFileDescriptorEvents(CallbackDispatch.java:127)
         at android.os.MessageQueue.dispatchEvents(MessageQueue.java:282)
         at android.os.MessageQueue.nativePollOnce(Native Method)
         at android.os.MessageQueue.next(MessageQueue.java:323)
         at android.os.Looper.loop(Looper.java:136)
         at android.app.ActivityThread.main(ActivityThread.java:6077)
         at java.lang.reflect.Method.invoke(Native Method)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
  12-28 17:53:30.439 1378-1378/com.example.androidthings.driversamples I/Process: Sending signal. PID: 1378 SIG: 9
  </code></pre>
  
  <hr>
  
  <h2>Update 2</h2>
  
  <p>After increasing the buffer size by 4, I was able to get few messages in. I see some messages have some junk that would explain the overflow:</p>
  
  <pre><code>12-28 23:38:17.393 2366-2366/? D/XXX: message: ��GPGGA,233817.000,3742.1931,N,12208.3976,W,1,04,1.96,164.3,M,-25.5,M,,*58
  12-28 23:38:17.394 2366-2366/? D/XXX: Buffer reset
  12-28 23:38:17.394 2366-2366/? D/XXX: message: GPGSA,A,3,23,03,26,22,,,,,,,,,2.20,1.96,1.00*0B
  12-28 23:38:17.395 2366-2366/? D/XXX: Buffer reset
  12-28 23:38:17.544 2366-2366/com.example.androidthings.driversamples D/XXX: message: GP��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RMC,233817.000,A��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,3742.1931,N,12208.3976,W,0.42,205.67,281216,,,A*71
  12-28 23:38:17.545 2366-2366/com.example.androidthings.driversamples D/XXX: Buffer reset
  12-28 23:38:17.545 2366-2366/com.example.androidthings.driversamples D/XXX: message: GPVTG,205.67,T,,M,0.42,N,0.78,K,A*32
  12-28 23:38:17.546 2366-2366/com.example.androidthings.driversamples D/XXX: Buffer reset
  </code></pre>
  
  <p>I have no idea where that junk could come from...</p>