serialport-rs
serialport-rs copied to clipboard
Data misread from serial adapter (serialport only)
Hello! I have an interesting issue that I am not sure how to resolve or debug.
Hardware: Macbook Pro M3 MAX Architecture: aarch64 (apple silicon) OS: Mac OS 14.4.1 (23E224)
I have 2 serial adapters. When talking to the same device adapter A works (an FTDI adapter), but adapter B (Prolific Technology adapter) does not. Same baud rate settings etc in the rust program using this crate. Example code below If using tio (a command line utility for serial data) adapter A and B both work as expected.
Here is an example:
The blue output is adapter A (working FTDI adapter). The green output is adapter B (Prolific Technology adapter).
The data they are receiving should be the same or very similar.
What route should I take for debugging this further?
Device setup:
let mut primary_device = serialport::new(args.device_primary, args.baudrate)
.timeout(Duration::from_millis(1000))
.open()
.expect("Failed to open primary port");
let _ = primary_device.write_data_terminal_ready(true);
let _ = primary_device.set_baud_rate(args.baudrate);
let _ = primary_device.set_data_bits(serialport::DataBits::Eight);
let _ = primary_device.set_parity(serialport::Parity::None);
Read function:
fn read_serial_data(device: &mut Box<dyn SerialPort>, secondary_device: &mut Box<dyn SerialPort>, output_buffer: &mut Vec<u8>) -> usize{
let mut serial_buf: Vec<u8> = vec![0; 256];
let bytes_read = device.read(serial_buf.as_mut_slice()).unwrap_or_default();
if bytes_read > 0 {
// println!("read {} bytes", bytes_read);
serial_buf[0..bytes_read].into_iter().for_each( |x| {
output_buffer.push(*x);
// print!("{}", *x as char);
});
// println!("");
secondary_device.write_all(&serial_buf[0..bytes_read]).expect("Failed to send to secondary device");
}
bytes_read
}
Here is also usbdiagnostic output for the 2 adapters:
Full Speed device @ 14 (0x03220000): ............................................. Composite device: "USB Serial Converter"
Port Information: 0x2018
Not Captive
External Device
Connected
Enabled
On Thunderbolt
Number Of Endpoints (includes EP0):
Total Endpoints for Configuration 1 (current): 3
Device Descriptor
Descriptor Version Number: 0x0200
Device Class: 0 (Composite)
Device Subclass: 0
Device Protocol: 0
Device MaxPacketSize: 8
Device VendorID/ProductID: 0x0403/0x6001 (unknown vendor)
Device Version Number: 0x0600
Number of Configurations: 1
Manufacturer String: 1 "FTDI"
Product String: 2 "USB Serial Converter"
Serial Number String: 3 "FTBHOLDE"
Configuration Descriptor (current config)
Length (and contents): 32
Raw Descriptor (hex) 0000: 09 02 20 00 01 01 00 A0 16 09 04 00 00 02 FF FF
Raw Descriptor (hex) 0010: FF 02 07 05 81 02 40 00 00 07 05 02 02 40 00 00
Unknown Descriptor 0020:
Number of Interfaces: 1
Configuration Value: 1
Attributes: 0xA0 (bus-powered, remote wakeup)
MaxPower: 44 mA
Interface #0 - Vendor-specific .............................................. "USB Serial Converter"
Alternate Setting 0
Number of Endpoints 2
Interface Class: 255 (Vendor-specific)
Interface Subclass; 255 (Vendor-specific)
Interface Protocol: 255
Endpoint 0x81 - Bulk Input
Address: 0x81 (IN)
Attributes: 0x02 (Bulk)
Max Packet Size: 64
Polling Interval: 0 ms
Endpoint 0x02 - Bulk Output
Address: 0x02 (OUT)
Attributes: 0x02 (Bulk)
Max Packet Size: 64
Polling Interval: 0 ms
Full Speed device @ 16 (0x03240000): ............................................. Composite device: "USB-Serial Controller"
Port Information: 0x2018
Not Captive
External Device
Connected
Enabled
On Thunderbolt
Number Of Endpoints (includes EP0):
Total Endpoints for Configuration 1 (current): 4
Device Descriptor
Descriptor Version Number: 0x0200
Device Class: 0 (Composite)
Device Subclass: 0
Device Protocol: 0
Device MaxPacketSize: 64
Device VendorID/ProductID: 0x067B/0x2303 (unknown vendor)
Device Version Number: 0x0300
Number of Configurations: 1
Manufacturer String: 1 "Prolific Technology Inc."
Product String: 2 "USB-Serial Controller"
Serial Number String: 0 (none)
Configuration Descriptor (current config)
Length (and contents): 39
Raw Descriptor (hex) 0000: 09 02 27 00 01 01 00 A0 32 09 04 00 00 03 FF 00
Raw Descriptor (hex) 0010: 00 00 07 05 81 03 0A 00 01 07 05 02 02 40 00 00
Raw Descriptor (hex) 0020: 07 05 83 02 40 00 00
Number of Interfaces: 1
Configuration Value: 1
Attributes: 0xA0 (bus-powered, remote wakeup)
MaxPower: 100 mA
Interface #0 - Vendor-specific
Alternate Setting 0
Number of Endpoints 3
Interface Class: 255 (Vendor-specific)
Interface Subclass; 0 (Vendor-specific)
Interface Protocol: 0
Endpoint 0x81 - Interrupt Input
Address: 0x81 (IN)
Attributes: 0x03 (Interrupt)
Max Packet Size: 10
Polling Interval: 1 ms
Endpoint 0x02 - Bulk Output
Address: 0x02 (OUT)
Attributes: 0x02 (Bulk)
Max Packet Size: 64
Polling Interval: 0 ms
Endpoint 0x83 - Bulk Input
Address: 0x83 (IN)
Attributes: 0x02 (Bulk)
Max Packet Size: 64
Polling Interval: 0 ms