@@ -57,11 +57,11 @@ public class Cp21xxSerialPort : CommonUsbSerialPort
5757 private const int FLUSH_READ_CODE = 0x0a ;
5858 private const int FLUSH_WRITE_CODE = 0x05 ;
5959
60- private static int GET_MODEM_STATUS_REQUEST = 0x08 ; // 0x08 Get modem status.
61- private static int MODEM_STATUS_CTS = 0x10 ;
62- private static int MODEM_STATUS_DSR = 0x20 ;
63- private static int MODEM_STATUS_RI = 0x40 ;
64- private static int MODEM_STATUS_CD = 0x80 ;
60+ private const int GET_MODEM_STATUS_REQUEST = 0x08 ; // 0x08 Get modem status.
61+ private const int MODEM_STATUS_CTS = 0x10 ;
62+ private const int MODEM_STATUS_DSR = 0x20 ;
63+ private const int MODEM_STATUS_RI = 0x40 ;
64+ private const int MODEM_STATUS_CD = 0x80 ;
6565 /*
6666 * SILABSER_IFC_ENABLE_REQUEST_CODE
6767 */
@@ -86,7 +86,7 @@ public class Cp21xxSerialPort : CommonUsbSerialPort
8686 private UsbEndpoint mReadEndpoint ;
8787 private UsbEndpoint mWriteEndpoint ;
8888
89- private IUsbSerialDriver Driver ;
89+ private new IUsbSerialDriver Driver ;
9090 private string TAG => ( Driver as Cp21xxSerialDriver ) ? . TAG ;
9191
9292
@@ -210,28 +210,16 @@ public override int Read(byte[] dest, int timeoutMillis)
210210 public override int Write ( byte [ ] src , int timeoutMillis )
211211 {
212212 int offset = 0 ;
213+ int writeLength ;
214+ int amtWritten ;
213215
214216 while ( offset < src . Length )
215217 {
216- int writeLength ;
217- int amtWritten ;
218-
219218 lock ( mWriteBufferLock ) {
220- byte [ ] writeBuffer ;
221219
222- writeLength = Math . Min ( src . Length - offset , mWriteBuffer . Length ) ;
223- if ( offset == 0 )
224- {
225- writeBuffer = src ;
226- }
227- else
228- {
229- // bulkTransfer does not support offsets, make a copy.
230- Buffer . BlockCopy ( src , offset , mWriteBuffer , 0 , writeLength ) ;
231- writeBuffer = mWriteBuffer ;
232- }
220+ writeLength = src . Length - offset ;
233221
234- amtWritten = mConnection . BulkTransfer ( mWriteEndpoint , writeBuffer , writeLength ,
222+ amtWritten = mConnection . BulkTransfer ( mWriteEndpoint , src , offset , writeLength ,
235223 timeoutMillis ) ;
236224 }
237225 if ( amtWritten <= 0 )
@@ -313,7 +301,7 @@ private int GetStatus()
313301 {
314302 byte [ ] data = new byte [ 1 ] ;
315303 int result = mConnection . ControlTransfer ( ( UsbAddressing ) REQTYPE_DEVICE_TO_HOST , GET_MODEM_STATUS_REQUEST ,
316- 0 , mPortNumber , data , data . Length , USB_WRITE_TIMEOUT_MILLIS ) ;
304+ 0 , 0 , data , data . Length , USB_WRITE_TIMEOUT_MILLIS ) ;
317305 if ( result != 1 )
318306 {
319307 throw new IOException ( "Get modem status failed: result=" + result ) ;
@@ -338,11 +326,12 @@ public override bool GetDSR()
338326
339327 public override bool GetDTR ( )
340328 {
341- return true ;
329+ return ( GetStatus ( ) & MCR_DTR ) != 0 ;
342330 }
343331
344332 public override void SetDTR ( bool value )
345333 {
334+ SetConfigSingle ( SILABSER_SET_MHS_REQUEST_CODE , ( value ? MCR_DTR : 0 ) | CONTROL_WRITE_DTR ) ;
346335 }
347336
348337 public override bool GetRI ( )
@@ -352,11 +341,12 @@ public override bool GetRI()
352341
353342 public override bool GetRTS ( )
354343 {
355- return true ;
344+ return ( GetStatus ( ) & MCR_RTS ) != 0 ;
356345 }
357346
358347 public override void SetRTS ( bool value )
359348 {
349+ SetConfigSingle ( SILABSER_SET_MHS_REQUEST_CODE , ( value ? MCR_RTS : 0 ) | CONTROL_WRITE_RTS ) ;
360350 }
361351
362352 public override Boolean PurgeHwBuffers ( Boolean purgeReadBuffers , Boolean purgeWriteBuffers )
0 commit comments