Skip to contentSkip to conversation

How to use an USB<->serial adapter?

DISCUSSION Boszormenyi Zoltan 3 participants 8 messages Aug 21, 2003 – Aug 27, 2003

lore
Share & tools
lore
#0 lore raw

Hi,

I am experimenting with a Prolific USB<->RS232 adaptor. We have in-house developments that need serial communication and there are more and more mainboards that provide only one RS232 connector. (We would need more in one machine...)
So we decided to try an usb-serial converter. The one we bought was happily recognized by a RedHat 9 system but I couldn't get two-way communication over this converter.
The null-modem cable is working both ways, in fact I tested it with my machine's two real 16550s.
lsmod shows usbserial and pl2303, dmesg shows this:

usb.c: registered new driver serial
usbserial.c: USB Serial support registered for Generic usbserial.c: USB Serial Driver core v1.4 usbserial.c: USB Serial support registered for PL-2303 usbserial.c: PL-2303 converter detected usbserial.c: PL-2303 converter now attached to ttyUSB0 \
(or usb/tts/0 for devfs)
pl2303.c: Prolific PL2303 USB to serial adaptor driver v0.9

I use the attached sources (serial.h, [posix|win32]-serial.c) in my MinGW/Linux dual platform programs for low-level serial communication. Here are two testprograms that I used.

serialtest2 just listens and waits for incoming bytes. If it receives one, the answer is the byte it got + 1. serialtest1 iterates 10 times writing a byte and expecting the answer.

I tried using /dev/ttyUSB0 and /dev/usb/ttyUSB0 (chmod was needed to open them by an ordinary user, open(2) and tcsetattr(3) succeeded. What I found is that I can write to /dev/ttyUSB0 with serialtest1 and serialtest2 successfully reads it from /dev/ttyS0. But the answer from serialtest2 cannot be read by serialtest1. If these programs both use a real serial port (ttyS0 and ttyS1) the communication is successful both ways.

setserial produces an error:

# setserial /dev/ttyUSB0
Cannot get serial info: Invalid argument

And to be sure:

# setserial /dev/ttyUSB1
/dev/ttyUSB1: No such device

as expected.

I have the kernel-smp-2.4.20-19.9 (not the very latest) errata kernel and all user space errata packages installed/upgraded.

Signature · 6 lines
Best regards,
Zoltán Böszörményi

---------------------
What did Hussein say about his knife?
One in Bush worth two in the hand.

/*
* Közös fejléc a Win32/POSIX soros programozáshoz */

#include <sys/types.h>

#ifndef NEED_WINDOWS_H
#include <termios.h>
#else
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif

extern char *serial_names[];

typedef struct {

#ifdef NEED_WINDOWS_H
	HANDLE		fd;
	DCB		olddcb, newdcb;
	COMMTIMEOUTS	oldto, newto;
	size_t		err;
#else
	int		fd;
	struct termios	oldtio, newtio;
	ssize_t		err;

#endif
} serial_t;

serial_t *serial_open(const char *devname);
void serial_setup(serial_t *serport);
void serial_close(serial_t *serport);
void serial_write(serial_t *serport, const char *buffer, size_t n);
void serial_read(serial_t *serport, char *buffer, size_t n, int wait);
void serial_delay(int ms);

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include "serial.h"

char *serial_names[10] = {
	"",
	"/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyS3",
	"/dev/usb/ttyUSB0", "/dev/usb/ttyUSB1", "/dev/usb/ttyUSB2", "/dev/usb/ttyUSB3",
	NULL };
serial_t *serial_open(const char *devname) {
	serial_t	*serport;

	serport = malloc(sizeof(serial_t));

	serport->fd = open(devname, O_RDWR|O_NOCTTY|O_NONBLOCK /*|O_SYNC*/);
	if (serport->fd < 0) {
		free(serport);
		return NULL;
	}

	return serport;
}
void	serial_setup(serial_t *serport) {
	struct termios	*tio1, *tio2;
	int		ret = 0;

	tio1 = &(serport->oldtio);
	tio2 = &(serport->newtio);

	if (tcgetattr(serport->fd, tio1))
		ret = -1;
	memcpy(tio2, tio1, sizeof(struct termios));
	cfmakeraw(tio2);
	cfsetospeed(tio2, B115200);
	cfsetispeed(tio2, B115200);
#if 0
	tio2->c_cflag |= CRTSCTS;
#endif
	tio2->c_cflag |= CREAD|CLOCAL;
	tcflush(serport->fd, TCIOFLUSH);
	if (tcsetattr(serport->fd, TCSANOW, tio2))
		ret = -1;
#if 0
	tcflow(serport->fd, TCOON); tcflow(serport->fd, TCION);
#endif
	serport->err = ret;
}
void	serial_close(serial_t *serport) {
	tcflush(serport->fd, TCIOFLUSH);
	tcsetattr(serport->fd, TCSANOW, &(serport->oldtio));
	close(serport->fd);
	free(serport);
}
void	serial_write(serial_t *serport, const char *buffer, size_t n) {
	int	i;

	serport->err = write(serport->fd, buffer, n);
	tcdrain(serport->fd);
}
void serial_read(serial_t *serport, char *buffer, size_t n, int wait) {
	int pos = 0;
	int err = 0;
	struct timeval tv;
	fd_set set;

	if (wait) {
		FD_ZERO(&set);
		FD_SET(serport->fd, &set);
		tv.tv_sec = 0;
		tv.tv_usec = 250000;
		serport->err = select(serport->fd+1, &set, NULL, NULL, &tv);
		if (serport->err <= 0)
			return;
	}

	while(n--) {
again:
		if (wait) {
			FD_ZERO(&set);
			FD_SET(serport->fd, &set);
			tv.tv_sec = 0;
			tv.tv_usec = 100000;
			serport->err = select(serport->fd+1, &set, NULL, NULL, &tv);
			if (serport->err <= 0)
				return;
		}
		serport->err = read(serport->fd, &buffer[pos++], 1);
		if (serport->err == 0)
			goto again;
		if (serport->err == -1)
			break;
	}
	if (serport->err != -1)
		serport->err = pos;
}
void	serial_delay(int ms) {
	usleep(ms*1000);
}

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>

#include <malloc.h>
#include <gdk/gdkwin32.h>
#include <gtk/gtk.h>

#include "serial.h"

char *serial_names[10] = {
	"",
	"COM1:", "COM2:", "COM3:", "COM4:",
	"COM5:", "COM6:", "COM7:", "COM8:",
	NULL };

extern GtkWidget *foablak;

serial_t *serial_open(const char *devname) {
	serial_t *serport;
	HANDLE	fd;
	DWORD	dwError;

	serport = malloc(sizeof(serial_t));

	serport->fd = CreateFile(devname, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
		FILE_FLAG_WRITE_THROUGH, NULL);
	dwError = GetLastError();
	if (dwError == ERROR_FILE_NOT_FOUND) {
		free(serport);
		return NULL;
	}
	return serport;
}
void	serial_setup(serial_t *serport) {
	DCB		*dcb1, *dcb2;
	COMMTIMEOUTS	*to1, *to2;
	DWORD		dwError;

	to1 = &(serport->oldto);
	to2 = &(serport->newto);

	/* Initialize the DCBlength member. */
	dcb1 = &(serport->olddcb);
	dcb2 = &(serport->newdcb);

	serport->olddcb.DCBlength = sizeof (DCB); 

	/* Get the default port setting information. */
	GetCommState(serport->fd, dcb1);
	memcpy(dcb2, dcb1, sizeof(DCB));

	/* Change the DCB structure settings. */
	dcb2->BaudRate = 115200;            /* Current baud */
	dcb2->fBinary = TRUE;               /* Binary mode; no EOF check */
	dcb2->fParity = TRUE;               /* Enable parity checking */
	dcb2->fOutxCtsFlow = FALSE;         /* No CTS output flow control */
	dcb2->fOutxDsrFlow = FALSE;         /* No DSR output flow control */
	dcb2->fDtrControl = DTR_CONTROL_DISABLE /* DTR_CONTROL_ENABLE */;
	                                      /* DTR flow control type */
	dcb2->fDsrSensitivity = FALSE;      /* DSR sensitivity */
	dcb2->fTXContinueOnXoff = TRUE;     /* XOFF continues Tx */
	dcb2->fOutX = FALSE;                /* No XON/XOFF out flow control */ 
	dcb2->fInX = FALSE;                 /* No XON/XOFF in flow control */
	dcb2->fErrorChar = FALSE;           /* Disable error replacement */
	dcb2->fNull = FALSE;                /* Disable null stripping */
	dcb2->fRtsControl = RTS_CONTROL_ENABLE;
	                                      /* RTS flow control */
	dcb2->fAbortOnError = FALSE;        /* Do not abort reads/writes error */
	dcb2->ByteSize = 8;                 /* Number of bits/byte, 4-8 */
	dcb2->Parity = NOPARITY;            /* 0-4=no,odd,even,mark,space */ 
	dcb2->StopBits = ONESTOPBIT;        /* 0,1,2 = 1, 1.5, 2 */

	/* Configure the port according to the specifications of the DCB structure. */
	if (!SetCommState (serport->fd, dcb2)) {
		/* Could not configure the serial port. */
		serport->err = -1;
		return;
	}

	/* Retrieve the time-out parameters for all read and write operations
	   on the port. */
	to1 = &(serport->oldto);
	to2 = &(serport->newto);

	GetCommTimeouts (serport->fd, to1);
	memcpy(to2, to1, sizeof(COMMTIMEOUTS));

	/* Change the COMMTIMEOUTS structure settings. */
	to2->ReadIntervalTimeout = 250;
	to2->ReadTotalTimeoutMultiplier = 0;
	to2->ReadTotalTimeoutConstant = 250;
	to2->WriteTotalTimeoutMultiplier = 0;
	to2->WriteTotalTimeoutConstant = 0;

	/* Set the time-out parameters for all read and write operations
	   on the port. */
	if (!SetCommTimeouts (serport->fd, to2))
	{
		/* Could not set the time-out parameters. */
		serport->err = -1;
		return;
	}
}
void serial_close(serial_t *serport) {
	SetCommState (serport->fd, &(serport->olddcb));
	SetCommTimeouts (serport->fd, &(serport->oldto));
	CloseHandle(serport->fd);
	free(serport);
}
void serial_write(serial_t *serport, const char *buffer, size_t n) {
	DWORD	dwNumBytesWritten;
	int	i;

	serport->err = 0;
	for (i = 0; i < n; i++) {
		WriteFile (serport->fd,	/* Port handle */
			&buffer[i],	/* Pointer to the data to write */
			1,		/* Number of bytes to write */
			&dwNumBytesWritten,/* Pointer to the number of bytes written */
			NULL);		/* Must be NULL for Windows CE */
		serport->err += dwNumBytesWritten;
	}
	if (serport->err != n)
		serport->err = -1;
}
void serial_read(serial_t *serport, char *buffer, size_t n, int wait) {
	DWORD dwBytesTransferred;
	int	i;

	serport->err = 0;
	for (i = 0; i < n; i++) {
		ReadFile (serport->fd,	/* Port handle */
          	&buffer[i],		/* Pointer to data to read */
		1,			/* Number of bytes to read */
		&dwBytesTransferred,	/* Pointer to number of bytes read */
		NULL);			/* Must be NULL for Windows CE */
		serport->err += dwBytesTransferred;
		if (!dwBytesTransferred) {
			serport->err = -1;
			break;
		}
	}
	if (serport->err != n)
		serport->err = -1;
}
void	serial_delay(int ms) {
	Sleep(ms);
}

/*
* serialtest1
*/

#include <stdio.h>
#include "serial.h"

serial_t *sp;
unsigned char c1, c2;
int i;

int main(int argc, char **argv) {
	if (argc != 2)	{
		printf("give device name\n");
		return 1;
	}

	sp = serial_open(argv[1]);
	if (!sp) {
		printf("cannot open %s\n", argv[1]);
		return 1;
	}

	serial_setup(sp);
	if (sp->err < 0) {
		printf("cannot setup %s\n", argv[1]);
	}

	for (i = 0; i < 10; i++) {
		c1 = i;

		serial_write(sp, &c1, 1);

		serial_delay(20);

		serial_read(sp, &c2, 1, 1);

		if (sp->err <= 0)
		printf("written: 0x%02x, couldn't read\n", c1);
			else
		printf("written: 0x%02x, read: 0x%02x\n", c1, c2);
	}

	serial_close(sp);

	return 0;
}

/*
* serialtest2
*/

#include <stdio.h>
#include <stdlib.h>
#include "serial.h"

serial_t *sp;
unsigned char c1, c2;
int i;

void myexit(void) {
	serial_close(sp);
}
int main(int argc, char **argv) {
	if (argc != 2) {
		printf("give device name\n");
		return 1;
	}

	sp = serial_open(argv[1]);
	if (!sp) {
		printf("cannot open %s\n", argv[1]);
		return 1;
	}

	serial_setup(sp);
	if (sp->err < 0) {
		printf("cannot setup %s\n", argv[1]);
	}

	atexit(myexit);

	while (1) {
again:
		serial_read(sp, &c1, 1, 1);
		if (sp->err <= 0)
			goto again;

		c2 = c1+1;

		serial_write(sp, &c2, 1);
		printf("read: 0x%02x, written: 0x%02x\n", c1, c2);

	}

	return 0;
}
#1 lore raw
Quoted 9 lines · Boszormenyi Zoltan

Hi,

I am experimenting with a Prolific USB<->RS232 adaptor. We have in-house developments that need serial communication and there are more and more mainboards that provide only one RS232 connector. (We would need more in one machine...)
So we decided to try an usb-serial converter. The one we bought was happily recognized by a RedHat 9 system but I couldn't get two-way communication over this converter.

Which kernel version are you using?

I didn't run your test programs, but are you sure you got the hardware flow control settings correct? How about testing the device with minicom, as that is a program that is known to work properly with these devices (along with lots of other ones, but that's a good place to start.)

Quoted 4 lines

setserial produces an error:

# setserial /dev/ttyUSB0
Cannot get serial info: Invalid argument

Yes, setserial does not work with the majority of the usb-serial drivers, patches gladly accepted to fix this :)

thanks,

greg k-h

#2 lore raw
Quoted 13 lines · Greg KH
Quoted 9 lines · Boszormenyi Zoltan

Hi,

I am experimenting with a Prolific USB<->RS232 adaptor. We have in-house developments that need serial communication and there are more and more mainboards that provide only one RS232 connector. (We would need more in one machine...)
So we decided to try an usb-serial converter. The one we bought was happily recognized by a RedHat 9 system but I couldn't get two-way communication over this converter.

Quoted 1 line

Which kernel version are you using?

RH9 errata kernel 2.4.20-19.9, I also tried 2.6.0-test3-mm3. On a sidenote, I also tried its driver on W98SE, WinXP. Same result with the MinGW compiled test programs.

Quoted 2 lines

I didn't run your test programs, but are you sure you got the hardware flow control settings correct? How about testing the device with

Hmm, how comes the same settings *work* on real 16550? Even under Win*, with the MinGW compiled testprograms...

Quoted 3 lines

minicom, as that is a program that is known to work properly with these devices (along with lots of other ones, but that's a good place to start.)

I tried it now, thanks. Same thing happens. I set up two different minirc, /etc/minirc.dfl using /dev/ttyS0 and /etc/minirc.usb for /dev/ttyUSB0. In one terminal, I typed 'minicom', in another 'minicom usb'. In the 'minicom usb' what I type, appears in the other window, but keys typed in the 'minicom' do not appear in 'minicom usb'.

I am starting to be convinced that it is a hardware flaw. I will try to replace it.

Quoted 8 lines
Quoted 4 lines

setserial produces an error:

# setserial /dev/ttyUSB0
Cannot get serial info: Invalid argument

Yes, setserial does not work with the majority of the usb-serial drivers, patches gladly accepted to fix this :)

I wasn't prepared to this answer. ;-)

Quoted 4 lines

thanks,

greg k-h

Signature · 6 lines
Best regards,
Zoltán Böszörményi

---------------------
What did Hussein say about his knife?
One in Bush worth two in the hand.
#3 lore raw
In reply to Greg KH

Hi,

here's the test programs output and I also set the module option debug=1 in pl2303.

The testprograms' sources are still in my first mail.

In one terminal I started the listener test, it shows that it received bytes on ttyS0, tried to write the answer:

$ ./serialtest2 /dev/ttyS0
read: 0x00, written: 0x01
read: 0x01, written: 0x02
read: 0x02, written: 0x03
read: 0x03, written: 0x04
read: 0x04, written: 0x05
read: 0x05, written: 0x06
read: 0x06, written: 0x07
read: 0x07, written: 0x08
read: 0x08, written: 0x09
read: 0x09, written: 0x0a
read: 0x00, written: 0x01
read: 0x01, written: 0x02
read: 0x02, written: 0x03
read: 0x03, written: 0x04
read: 0x04, written: 0x05
read: 0x05, written: 0x06
read: 0x06, written: 0x07
read: 0x07, written: 0x08
read: 0x08, written: 0x09
read: 0x09, written: 0x0a

In another terminal, I started the initiator test twice:

$ ./serialtest1 /dev/usb/ttyUSB0
written: 0x00, read: 0x00           <- sometimes I get one zero byte
written: 0x01, couldn't read
written: 0x02, couldn't read
written: 0x03, couldn't read
written: 0x04, couldn't read
written: 0x05, couldn't read
written: 0x06, couldn't read
written: 0x07, couldn't read
written: 0x08, couldn't read
written: 0x09, couldn't read
$ ./serialtest1 /dev/usb/ttyUSB0
written: 0x00, couldn't read
written: 0x01, couldn't read
written: 0x02, couldn't read
written: 0x03, couldn't read
written: 0x04, couldn't read
written: 0x05, couldn't read
written: 0x06, couldn't read
written: 0x07, couldn't read
written: 0x08, couldn't read
written: 0x09, couldn't read

During the session, the kernel log contains this:

usb.c: USB disconnect on device 00:04.2-2 address 3
pl2303.c: pl2303_shutdown
usbserial.c: PL-2303 converter now disconnected from ttyUSB0
hub.c: new USB device 00:04.2-2, assigned address 4
usbserial.c: PL-2303 converter detected
usbserial.c: PL-2303 converter now attached to ttyUSB0 (or usb/tts/0 for devfs) pl2303.c: pl2303_open - port 0
pl2303.c: 0xc0:0x1:0x8484:0x0 1 - 0
pl2303.c: 0x40:0x1:0x404:0x0 0
pl2303.c: 0xc0:0x1:0x8484:0x0 1 - 0
pl2303.c: 0xc0:0x1:0x8383:0x0 1 - 0
pl2303.c: 0xc0:0x1:0x8484:0x0 1 - 0
pl2303.c: 0x40:0x1:0x404:0x1 0
pl2303.c: 0xc0:0x1:0x8484:0x0 1 - 0
pl2303.c: 0xc0:0x1:0x8383:0x0 1 - 0
pl2303.c: 0x40:0x1:0x0:0x1 0
pl2303.c: 0x40:0x1:0x1:0xc0 0
pl2303.c: 0x40:0x1:0x2:0x4 0
pl2303.c: pl2303_set_termios - port 0, initialized = 0
pl2303.c: 0xa1:0x21:0:0 7 - 0 0 0 0 0 0 0
pl2303.c: 0x40:1:0:1 0
pl2303.c: pl2303_set_termios - data bits = 8
pl2303.c: pl2303_set_termios - baud = 9600
pl2303.c: pl2303_set_termios - stop bits = 1
pl2303.c: pl2303_set_termios - parity = none
pl2303.c: 0x21:0x20:0:0 7
pl2303.c: set_control_lines - value = 3, retval = 0
pl2303.c: 0xa1:0x21:0:0 7 - 80 25 0 0 0 0 8
pl2303.c: pl2303_open - submitting read urb
pl2303.c: pl2303_open - submitting interrupt urb
pl2303.c: pl2303_ioctl (0) cmd = 0x5401
pl2303.c: pl2303_ioctl not supported = 0x5401
pl2303.c: pl2303_ioctl (0) cmd = 0x540b
pl2303.c: pl2303_ioctl not supported = 0x540b
pl2303.c: pl2303_ioctl (0) cmd = 0x5402
pl2303.c: pl2303_ioctl not supported = 0x5402
pl2303.c: pl2303_set_termios - port 0, initialized = 1
pl2303.c: pl2303_read_int_callback - length = 10, data = a1 20 00 00 00 00 02 00 83 00 pl2303.c: 0xa1:0x21:0:0 7 - 80 25 0 0 0 0 8
pl2303.c: 0x40:1:0:1 0
pl2303.c: pl2303_set_termios - data bits = 8
pl2303.c: pl2303_set_termios - baud = 115200
pl2303.c: pl2303_set_termios - stop bits = 1
pl2303.c: pl2303_set_termios - parity = none
pl2303.c: 0x21:0x20:0:0 7
pl2303.c: set_control_lines - value = 3, retval = 0
pl2303.c: 0xa1:0x21:0:0 7 - 0 c2 1 0 0 0 8
pl2303.c: pl2303_ioctl (0) cmd = 0x5401
pl2303.c: pl2303_ioctl not supported = 0x5401
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 00
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_read_bulk_callback - port 0
pl2303.c: pl2303_read_bulk_callback - length = 1, data = 00
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 01
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 02
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 03
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 04
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 05
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 06
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 07
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 08
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 09
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_ioctl (0) cmd = 0x540b
pl2303.c: pl2303_ioctl not supported = 0x540b
pl2303.c: pl2303_ioctl (0) cmd = 0x5402
pl2303.c: pl2303_ioctl not supported = 0x5402
pl2303.c: pl2303_set_termios - port 0, initialized = 1
pl2303.c: 0xa1:0x21:0:0 7 - 0 c2 1 0 0 0 8
pl2303.c: 0x40:1:0:1 0
pl2303.c: pl2303_set_termios - data bits = 8
pl2303.c: pl2303_set_termios - baud = 9600
pl2303.c: pl2303_set_termios - stop bits = 1
pl2303.c: pl2303_set_termios - parity = none
pl2303.c: 0x21:0x20:0:0 7
pl2303.c: set_control_lines - value = 3, retval = 0
pl2303.c: 0xa1:0x21:0:0 7 - 80 25 0 0 0 0 8
pl2303.c: pl2303_ioctl (0) cmd = 0x5401
pl2303.c: pl2303_ioctl not supported = 0x5401
pl2303.c: pl2303_close - port 0
pl2303.c: set_control_lines - value = 0, retval = 0
pl2303.c: pl2303_close - shutting down urbs
pl2303.c: pl2303_close - usb_unlink_urb (write_urb) failed with reason: -19 pl2303.c: pl2303_read_bulk_callback - port 0
pl2303.c: pl2303_read_bulk_callback - urb->status = -2
pl2303.c: pl2303_read_bulk_callback - port is closed, exiting.
pl2303.c: pl2303_open - port 0
pl2303.c: 0xc0:0x1:0x8484:0x0 1 - 0
pl2303.c: 0x40:0x1:0x404:0x0 0
pl2303.c: 0xc0:0x1:0x8484:0x0 1 - 0
pl2303.c: 0xc0:0x1:0x8383:0x0 1 - 0
pl2303.c: 0xc0:0x1:0x8484:0x0 1 - 0
pl2303.c: 0x40:0x1:0x404:0x1 0
pl2303.c: 0xc0:0x1:0x8484:0x0 1 - 0
pl2303.c: 0xc0:0x1:0x8383:0x0 1 - 0
pl2303.c: 0x40:0x1:0x0:0x1 0
pl2303.c: 0x40:0x1:0x1:0xc0 0
pl2303.c: 0x40:0x1:0x2:0x4 0
pl2303.c: pl2303_set_termios - port 0, initialized = 1
pl2303.c: 0xa1:0x21:0:0 7 - 80 25 0 0 0 0 8
pl2303.c: 0x40:1:0:1 0
pl2303.c: pl2303_set_termios - data bits = 8
pl2303.c: pl2303_set_termios - baud = 9600
pl2303.c: pl2303_set_termios - stop bits = 1
pl2303.c: pl2303_set_termios - parity = none
pl2303.c: 0x21:0x20:0:0 7
pl2303.c: set_control_lines - value = 3, retval = 0
pl2303.c: 0xa1:0x21:0:0 7 - 80 25 0 0 0 0 8
pl2303.c: pl2303_open - submitting read urb
pl2303.c: pl2303_open - submitting interrupt urb
pl2303.c: pl2303_ioctl (0) cmd = 0x5401
pl2303.c: pl2303_ioctl not supported = 0x5401
pl2303.c: pl2303_ioctl (0) cmd = 0x540b
pl2303.c: pl2303_ioctl not supported = 0x540b
pl2303.c: pl2303_ioctl (0) cmd = 0x5402
pl2303.c: pl2303_ioctl not supported = 0x5402
pl2303.c: pl2303_set_termios - port 0, initialized = 1
pl2303.c: 0xa1:0x21:0:0 7 - 80 25 0 0 0 0 8
pl2303.c: 0x40:1:0:1 0
pl2303.c: pl2303_set_termios - data bits = 8
pl2303.c: pl2303_set_termios - baud = 115200
pl2303.c: pl2303_set_termios - stop bits = 1
pl2303.c: pl2303_set_termios - parity = none
pl2303.c: 0x21:0x20:0:0 7
pl2303.c: set_control_lines - value = 3, retval = 0
pl2303.c: 0xa1:0x21:0:0 7 - 0 c2 1 0 0 0 8
pl2303.c: pl2303_ioctl (0) cmd = 0x5401
pl2303.c: pl2303_ioctl not supported = 0x5401
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 00
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 01
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 02
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 03
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 04
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 05
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 06
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 07
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 08
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_write - port 0, 1 bytes
pl2303.c: pl2303_write - length = 1, data = 09
pl2303.c: pl2303_write_bulk_callback - port 0
pl2303.c: pl2303_ioctl (0) cmd = 0x540b
pl2303.c: pl2303_ioctl not supported = 0x540b
pl2303.c: pl2303_ioctl (0) cmd = 0x5402
pl2303.c: pl2303_ioctl not supported = 0x5402
pl2303.c: pl2303_set_termios - port 0, initialized = 1
pl2303.c: 0xa1:0x21:0:0 7 - 0 c2 1 0 0 0 8
pl2303.c: 0x40:1:0:1 0
pl2303.c: pl2303_set_termios - data bits = 8
pl2303.c: pl2303_set_termios - baud = 9600
pl2303.c: pl2303_set_termios - stop bits = 1
pl2303.c: pl2303_set_termios - parity = none
pl2303.c: 0x21:0x20:0:0 7
pl2303.c: set_control_lines - value = 3, retval = 0
pl2303.c: 0xa1:0x21:0:0 7 - 80 25 0 0 0 0 8
pl2303.c: pl2303_ioctl (0) cmd = 0x5401
pl2303.c: pl2303_ioctl not supported = 0x5401
pl2303.c: pl2303_close - port 0
pl2303.c: set_control_lines - value = 0, retval = 0
pl2303.c: pl2303_close - shutting down urbs
pl2303.c: pl2303_close - usb_unlink_urb (write_urb) failed with reason: -19 pl2303.c: pl2303_read_bulk_callback - port 0
pl2303.c: pl2303_read_bulk_callback - urb->status = -2
pl2303.c: pl2303_read_bulk_callback - port is closed, exiting.

I also tried some different baud rates (2400, 19200) besides the fastest 115200 that was default in the testprograms.

Now what?

Oh, did I mention that the pinout of the cable (that I use to loopback the USB<->serial cable into the same PC) is

DB9 <-> DB9
1,6 <-> 4

2   <-> 3
3   <-> 2
4   <-> 1,6
5   <-> 5
7   <-> 8
8   <-> 7
Signature · 6 lines
Best regards,
Zoltán Böszörményi

---------------------
What did Hussein say about his knife?
One in Bush worth two in the hand.
#4 lore raw
In reply to Boszormenyi Zoltan

Am Don, 2003-08-21 um 14.44 schrieb Boszormenyi Zoltan:

Quoted 8 lines

usb.c: registered new driver serial
usbserial.c: USB Serial support registered for Generic usbserial.c: USB Serial Driver core v1.4 usbserial.c: USB Serial support registered for PL-2303 usbserial.c: PL-2303 converter detected usbserial.c: PL-2303 converter now attached to ttyUSB0 \
(or usb/tts/0 for devfs)
pl2303.c: Prolific PL2303 USB to serial adaptor driver v0.9

Works for me, even on PowerPC. I'm typically using minicom and ckermit but mgetty and others work fine, too.

Quoted 1 line

setserial produces an error:

What do you need this relic from former times for?

Signature · 2 lines
Servus,
       Daniel
#5 lore raw
Quoted 13 lines · Daniel Egger

Am Don, 2003-08-21 um 14.44 schrieb Boszormenyi Zoltan:

Quoted 8 lines

usb.c: registered new driver serial
usbserial.c: USB Serial support registered for Generic usbserial.c: USB Serial Driver core v1.4 usbserial.c: USB Serial support registered for PL-2303 usbserial.c: PL-2303 converter detected usbserial.c: PL-2303 converter now attached to ttyUSB0 \
(or usb/tts/0 for devfs)
pl2303.c: Prolific PL2303 USB to serial adaptor driver v0.9

Quoted 2 lines

Works for me, even on PowerPC. I'm typically using minicom and ckermit but mgetty and others work fine, too.

What product is this? Mine is a Wiretek UN8BE, based on Prolific 2303.

# lsusb -s 001:002
Bus 001 Device 002: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
  Language IDs: none (invalid length string descriptor 63; len=7)
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 Interface
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x067b Prolific Technology, Inc.
  idProduct          0x2303 PL2303 Serial Port
  bcdDevice            2.02
  iManufacturer           0   <--- should'nt these two be set?
  iProduct                0   <--- (or not, it is optional)
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           39
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xa0
      Remote Wakeup
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               none
        wMaxPacketSize         10
        bInterval               1
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               none
        wMaxPacketSize         64
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               none
        wMaxPacketSize         64
        bInterval               0
  Language IDs: none (invalid length string descriptor 63; len=7)

In the shop they said this one cannot be used as a null-link but works with external serial devices, e.g. modems. I have yet to verify this statement myself.

Quoted 4 lines
Quoted 1 line

setserial produces an error:

What do you need this relic from former times for?

I tried to query the USB serial line's current parameters. Is there any other utilities that can do this for me?

Signature · 6 lines
Best regards,
Zoltán Böszörményi

---------------------
What did Hussein say about his knife?
One in Bush worth two in the hand.
#6 lore raw

Am Mon, 2003-08-25 um 08.24 schrieb Boszormenyi Zoltan:

Quoted 1 line

What product is this? Mine is a Wiretek UN8BE, based on Prolific 2303.

Mine is from STLAB.

Bus 002 Device 003: ID 7b06:0323
Language IDs: none (invalid length string descriptor 63; len=7)
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 10.01

  bDeviceClass            0 Interface
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x7b06
  idProduct          0x0323
  bcdDevice            2.02
  iManufacturer           0
  iProduct                0
  iSerial                 0
  bNumConfigurations      1

Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 39
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xa0
Remote Wakeup
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type none
wMaxPacketSize 10
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type none
wMaxPacketSize 64
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type none
wMaxPacketSize 64
bInterval 0
Language IDs: none (invalid length string descriptor 63; len=7)

Hrm, lsusb seems to have an endianess problem, the vendorid is garbled.

Quoted 3 lines

In the shop they said this one cannot be used as a null-link but works with external serial devices, e.g. modems. I have yet to verify this statement myself.

Doesn't really make sense to me. RS232 is specified electrically, the adapter doesn't know which kind of device it is talking to. I'm using mine to connect to a TTL-RS232 adapter which sits on a DSL-router, so it's like a "null-link".

Quoted 2 lines

I tried to query the USB serial line's current parameters. Is there any other utilities that can do this for me?

Why do you need this, don't you know what you set it to? :) There are ioctls for it and probably a terminal program will know how to read and write it.

Signature · 2 lines
Servus,
       Daniel
#7 lore raw
Quoted 14 lines · Daniel Egger

Am Mon, 2003-08-25 um 08.24 schrieb Boszormenyi Zoltan:

Quoted 1 line

What product is this? Mine is a Wiretek UN8BE, based on Prolific 2303.

Mine is from STLAB.
...

Quoted 3 lines

In the shop they said this one cannot be used as a null-link but works with external serial devices, e.g. modems. I have yet to verify this statement myself.

Quoted 4 lines

Doesn't really make sense to me. RS232 is specified electrically, the adapter doesn't know which kind of device it is talking to. I'm using mine to connect to a TTL-RS232 adapter which sits on a DSL-router, so it's like a "null-link".

Now, I was able to get an external modem. No workee... The modem RD/TD LEDs are flashing, DTR is lit on permanently so the modem is receiving and *tries to send*. Maybe the shop went this far in testing to say that the cable works. :-( But the PC isn't receiving. E.g. in WinXX, the modem is not found, in RH9, no dialing out.

At least it is consistent with my findings with the null-link cable. Back to the shop and sorry for the noise.

Signature · 6 lines
Best regards,
Zoltán Böszörményi

---------------------
What did Hussein say about his knife?
One in Bush worth two in the hand.