I am using a USB Serial (CDC ACM) device (an Astrosys GBA ST2 Bill Validator), but the device won't answer requests unless the RTS signal is negated.
On Windows, usbser
drivers will configure the device by sending SetControlLineState
and Get/SetLineCoding
USB control requests until a SetSerial
notification is received on the Interrupt endpoint. In other words, it will generate RTS/DTS signals (via SetControlLineState
) until the device generate a notification (in our case, when RTS line is negated). It is then attached to a COM port and does not need further configuration.
On Linux with cdc-acm
driver attach the device to /dev/ttyACMn
, but it is required to explicitly negate the RTS line before making requests.
Generally, the device won't answer any request unless the RTS signal is negated, which may be done via USB control requests or using a serial library.
Note: by "negating RTS line" I mean setting RTS to 0 or False such as port.rts=0
with pySerial
I understand that a USB Virtual Serial port does not have to implement the full RS-232 specifications and answer every signals, but I don't see why RTS signal needs to be negated for the device to answer requests? Is it expected for a Serial CDC ACM USB device? Or is it a vendor specific feature?
Here is the full device descriptor:
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x16f9
idProduct 0x0003
bcdDevice 14.06
iManufacturer 1 Astrosystems
iProduct 2 GBA ST2
iSerial 3 06010010001
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 62
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 2 Communications
bInterfaceSubClass 2 Abstract (modem)
bInterfaceProtocol 1 AT-commands (v.25ter)
iInterface 4 GBA USB Serial Port
CDC Header:
bcdCDC 1.20
CDC ACM:
bmCapabilities 0x02
line coding and serial state
CDC Union:
bMasterInterface 0
bSlaveInterface 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 50
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 2
bInterfaceClass 10 CDC Data
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0
iInterface 4 GBA USB Serial Port
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 0
Device Status: 0x0001
Self Powered