diff --git a/UsbSerialForAndroid/driver/CdcAcmSerialDriver.cs b/UsbSerialForAndroid/driver/CdcAcmSerialDriver.cs index d400f31..761bed8 100644 --- a/UsbSerialForAndroid/driver/CdcAcmSerialDriver.cs +++ b/UsbSerialForAndroid/driver/CdcAcmSerialDriver.cs @@ -68,7 +68,7 @@ class CdcAcmSerialPort : CommonUsbSerialPort private static int SET_CONTROL_LINE_STATE = 0x22; private static int SEND_BREAK = 0x23; - private IUsbSerialDriver Driver; + private new readonly IUsbSerialDriver Driver; //public CdcAcmSerialPort(UsbDevice device, int portNumber) : base(device, portNumber) //{ diff --git a/UsbSerialForAndroid/driver/Ch34xSerialDriver.cs b/UsbSerialForAndroid/driver/Ch34xSerialDriver.cs index 691d44a..c1ff3d5 100644 --- a/UsbSerialForAndroid/driver/Ch34xSerialDriver.cs +++ b/UsbSerialForAndroid/driver/Ch34xSerialDriver.cs @@ -59,7 +59,7 @@ public class Ch340SerialPort : CommonUsbSerialPort private UsbEndpoint mReadEndpoint; private UsbEndpoint mWriteEndpoint; - private IUsbSerialDriver Driver; + private new readonly IUsbSerialDriver Driver; private string TAG => (Driver as Ch34xSerialDriver)?.TAG; public Ch340SerialPort(UsbDevice device, int portNumber, IUsbSerialDriver driver) : base(device, portNumber) diff --git a/UsbSerialForAndroid/driver/Cp21xxSerialDriver.cs b/UsbSerialForAndroid/driver/Cp21xxSerialDriver.cs index 4889396..2bea6a0 100644 --- a/UsbSerialForAndroid/driver/Cp21xxSerialDriver.cs +++ b/UsbSerialForAndroid/driver/Cp21xxSerialDriver.cs @@ -86,7 +86,7 @@ public class Cp21xxSerialPort : CommonUsbSerialPort private UsbEndpoint mReadEndpoint; private UsbEndpoint mWriteEndpoint; - private new IUsbSerialDriver Driver; + private readonly new IUsbSerialDriver Driver; private string TAG => (Driver as Cp21xxSerialDriver)?.TAG; diff --git a/UsbSerialForAndroid/driver/FtdiSerialDriver.cs b/UsbSerialForAndroid/driver/FtdiSerialDriver.cs index cddf59e..959ec6d 100644 --- a/UsbSerialForAndroid/driver/FtdiSerialDriver.cs +++ b/UsbSerialForAndroid/driver/FtdiSerialDriver.cs @@ -103,7 +103,7 @@ private class FtdiSerialPort : CommonUsbSerialPort private Boolean rts = false; private int breakConfig = 0; - private IUsbSerialDriver Driver; + private new readonly IUsbSerialDriver Driver; private String TAG = typeof (FtdiSerialDriver).Name; diff --git a/UsbSerialForAndroid/driver/ProlificSerialDriver.cs b/UsbSerialForAndroid/driver/ProlificSerialDriver.cs index 02618d4..81e2ca6 100644 --- a/UsbSerialForAndroid/driver/ProlificSerialDriver.cs +++ b/UsbSerialForAndroid/driver/ProlificSerialDriver.cs @@ -132,7 +132,8 @@ protected enum DeviceType { DEVICE_TYPE_01, DEVICE_TYPE_T, DEVICE_TYPE_HX, DEVIC Boolean mStopReadStatusThread = false; private IOException mReadStatusException = null; - private IUsbSerialDriver Driver; + private new readonly IUsbSerialDriver Driver; + private string TAG => (Driver as ProlificSerialDriver)?.TAG; diff --git a/UsbSerialForAndroid/driver/STM32SerialDriver.cs b/UsbSerialForAndroid/driver/STM32SerialDriver.cs index 5487937..f1d871e 100644 --- a/UsbSerialForAndroid/driver/STM32SerialDriver.cs +++ b/UsbSerialForAndroid/driver/STM32SerialDriver.cs @@ -56,7 +56,7 @@ public class STM32SerialPort : CommonUsbSerialPort bool mRts = false; bool mDtr = false; - IUsbSerialDriver Driver; + private new readonly IUsbSerialDriver Driver; const int USB_WRITE_TIMEOUT_MILLIS = 5000; @@ -141,8 +141,15 @@ public override int Read(byte[] dest, int timeoutMillis) try { request.Initialize(mConnection, mReadEndpoint); - ByteBuffer buf = ByteBuffer.Wrap(dest); - if (!request.Queue(buf, dest.Length)) + + // wrap not work here + // byte[] is a primitive C# value type and not a Java.Lang.Object reference type + // when you do ByteBuffer.Wrap (dest), Java has no reference to the actual C# byte[], Java will instead make a copy of the bytes. + // ByteBuffer buf = ByteBuffer.Wrap(dest); + + ByteBuffer buf = ByteBuffer.AllocateDirect(dest.Length); + + if (!request.Queue(buf, buf.Limit())) throw new IOException("Error queuing request"); UsbRequest response = mConnection.RequestWait(); @@ -151,7 +158,13 @@ public override int Read(byte[] dest, int timeoutMillis) int nread = buf.Position(); if (nread > 0) - return nread; + { + // set back buffer position to 0 + buf.Rewind(); + // copy the bytes back + buf.Get(dest, 0, nread); + return nread; + } return 0; } @@ -166,7 +179,7 @@ public override int Read(byte[] dest, int timeoutMillis) { int readAmt = Math.Min(dest.Length, mReadBuffer.Length); numBytesRead = mConnection.BulkTransfer(mReadEndpoint, mReadBuffer, readAmt, timeoutMillis); - if(numBytesRead < 0) + if(numBytesRead <= 0) { // This sucks: we get -1 on timeout, not 0 as preferred. // We *should* use UsbRequest, except it has a bug/api oversight