@@ -56,6 +56,13 @@ public class Cp21xxSerialPort : CommonUsbSerialPort
5656 private const int FLUSH_READ_CODE = 0x0a ;
5757 private const int FLUSH_WRITE_CODE = 0x05 ;
5858
59+ // https://developer.android.com/reference/android/hardware/usb/UsbConstants#USB_DIR_IN
60+ private static int REQTYPE_DEVICE_TO_HOST = UsbConstants . UsbTypeVendor | 0 ; // UsbConstants.USB_DIR_IN;
61+ private static int GET_MODEM_STATUS_REQUEST = 5 ;
62+ private static int MODEM_STATUS_CTS = 0x10 ;
63+ private static int MODEM_STATUS_DSR = 0x20 ;
64+ private static int MODEM_STATUS_RI = 0x40 ;
65+ private static int MODEM_STATUS_CD = 0x80 ;
5966 /*
6067 * SILABSER_IFC_ENABLE_REQUEST_CODE
6168 */
@@ -303,19 +310,31 @@ public override void SetParameters(int baudRate, int dataBits, StopBits stopBits
303310 SetConfigSingle ( SILABSER_SET_LINE_CTL_REQUEST_CODE , configDataBits ) ;
304311 }
305312
313+ private int GetStatus ( )
314+ {
315+ byte [ ] data = new byte [ 2 ] ;
316+ int result = mConnection . ControlTransfer ( ( UsbAddressing ) REQTYPE_DEVICE_TO_HOST , GET_MODEM_STATUS_REQUEST ,
317+ 0 , mPortNumber + 1 , data , data . Length , USB_WRITE_TIMEOUT_MILLIS ) ;
318+ if ( result != 2 )
319+ {
320+ throw new IOException ( "Get modem status failed: result=" + result ) ;
321+ }
322+ return data [ 0 ] ;
323+ }
324+
306325 public override bool GetCD ( )
307326 {
308- return false ;
327+ return ( GetStatus ( ) & MODEM_STATUS_CD ) != 0 ;
309328 }
310329
311330 public override bool GetCTS ( )
312331 {
313- return false ;
332+ return ( GetStatus ( ) & MODEM_STATUS_CTS ) != 0 ;
314333 }
315334
316335 public override bool GetDSR ( )
317336 {
318- return false ;
337+ return ( GetStatus ( ) & MODEM_STATUS_DSR ) != 0 ;
319338 }
320339
321340 public override bool GetDTR ( )
@@ -329,7 +348,7 @@ public override void SetDTR(bool value)
329348
330349 public override bool GetRI ( )
331350 {
332- return false ;
351+ return ( GetStatus ( ) & MODEM_STATUS_RI ) != 0 ;
333352 }
334353
335354 public override bool GetRTS ( )
0 commit comments