PL2303 anexado a ttyUSB0 - Altere para ttyS *?

3

Eu quero ler as linhas de status simples (txd, dtr, ...) de um conversor PL2303 USB2RS232 com statserial. Eu já anexei meu PL2303 à porta ttyUSB0. Mas para ler os dados, eu preciso do comando statserial, que apenas aceita o ttyS * (se eu tentar usá-lo com os apperars ttyUSB *, "permission denied"). Como você pode mudar o ttyUSB * para um ttyS * "endereço"?

lsusb:

gernot@gernot-Lenovo-G505s:~$ lsusb
Bus 002 Device 002: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 174f:147b Syntek 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 004: ID 0cf3:3004 Atheros Communications, Inc. 
Bus 003 Device 002: ID 062a:4101 Creative Labs 
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 002: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

dmesg: 

...

[   53.186869] ISO 9660 Extensions: Microsoft Joliet Level 3
[   54.986337] ISOFS: changing to secondary root
[   76.485704] usb 5-1: new full-speed USB device number 2 using xhci_hcd
[   76.522777] usb 5-1: New USB device found, idVendor=067b, idProduct=2303
[   76.522786] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[   76.522791] usb 5-1: Product: USB-Serial Controller
[   76.522795] usb 5-1: Manufacturer: Prolific Technology Inc.
[   76.557641] usbcore: registered new interface driver usbserial
[   76.557658] usbcore: registered new interface driver usbserial_generic
[   76.557668] usbserial: USB Serial support registered for generic
[   76.559702] usbcore: registered new interface driver pl2303
[   76.559719] usbserial: USB Serial support registered for pl2303
[   76.560192] pl2303 5-1:1.0: pl2303 converter detected
[   76.588044] usb 5-1: pl2303 converter now attached to ttyUSB0

...

Obrigado pela ajuda!

Atualização: parece que eu não era um membro do grupo de discagem. Eu adicionei meu usuário a esse grupo usando sudo usermod -a -G dialout <username>

Depois disso, tive permissão para acessar as portas USB e serial. Agora, programas terminais como o trabalho moserial. Mas ainda não consigo acessar as linhas de status usando statserial . Em vez disso, recebo a mensagem:

gernot@gernot-Lenovo-G505s:~$ statserial ttyUSB0
statserial: can't open device 'ttyUSB0': No such file or directory

Atualização 2: Eu consegui fazer o trabalho statserial (o sentido deste tópico entrará em colapso eu acho): Primeiro você tem que redefinir a porta e, em seguida, estabelecer um link físico para uma porta ttyS * com um número maior que o número de portas padrão:

sudo rm /dev/ttyS40
sudo ln /dev/ttyUSB0 /dev/ttyS40 

Mas como posso copiar os dados exibidos no terminal em qualquer objeto que eu possa ler com código selfmade? E por que a ferramenta estatística de status está reagindo tão lentamente às mudanças nas linhas de staus?

    
por user285079 25.05.2014 / 10:44

3 respostas

4

Seu primeiro problema (permissões de dispositivo) foi corrigido ao adicionar seu usuário ao grupo correto.

Seu segundo problema (caminho do dispositivo) parece ser que você não está usando o caminho completo do dispositivo. De man statserial :

% bl0ck_qu0te%

Você precisa fazer statserial /dev/ttyUSB0

(Eu verifiquei a fonte para verificar se isso está correto, ela literalmente faz fd = open(device,...) em que device é seu argv [x])

Para informações genéricas sobre como programar a porta serial, veja Manual de Programação Serial . Você pode olhar para a fonte do statserial com apt-get source statserial (é um programa muito simples compilado a partir de um único arquivo statserial.c , que tem 195 linhas de comprimento).

A atualização é lenta porque o statserial pesquisa apenas a porta serial a cada segundo, o loop principal é:

  for (;;) {

    /* get modem status info */ 
    status = ioctl(fd, TIOCMGET, &arg);
    if (status != 0) {
      perror("statserial: TIOCMGET failed");
      exit(1);
    }

...

    printw("Device: %s\n\n", device);
    printw("Signal  Pin  Pin  Direction  Status  Full\n");
    printw("Name    (25) (9)  (computer)         Name\n");
    printw("-----   ---  ---  ---------  ------  -----\n");
    printw("FG       1    -      -           -   Frame Ground\n");
    printw("TxD      2    3      out         -   Transmit Data\n");
    printw("RxD      3    2      in          -   Receive  Data\n");
    printw("RTS      4    7      out         %1d   Request To Send\n", !!(arg & TIOCM_RTS));
    printw("CTS      5    8      in          %1d   Clear To Send\n", !!(arg & TIOCM_CTS));
    printw("DSR      6    6      in          %1d   Data Set Ready\n", !!(arg & TIOCM_DSR));
    printw("GND      7    5      -           -   Signal Ground\n");
    printw("DCD      8    1      in          %1d   Data Carrier Detect\n", !!(arg & TIOCM_CAR));
    printw("DTR     20    4      out         %1d   Data Terminal Ready\n", !!(arg & TIOCM_DTR));
    printw("RI      22    9      in          %1d   Ring Indicator\n", !!(arg & TIOCM_RNG));
    refresh();

    /* break out if -n option was used */
    if (n_option)
      exit(0);

    /* delay 1 second between loops */
    sleep(1);
  }

Se você está fazendo algum trabalho sério com portas seriais, eu recomendo que você obtenha uma placa de porta serial real (placa PCI com controlador RS232). Os adaptadores USB não são confiáveis o suficiente, especialmente se você estiver conectando a hardware antigo, você verá que eles não reproduzem as temporizações do sinal com precisão, o que causará problemas com alguns dispositivos. Outro problema comum é que as portas seriais USB não implementam (ou mal implementam) handshaking RTS / CTS de hardware e, portanto, acabam sendo incompatíveis com dispositivos de porta serial antigos. Dito isto, o PL2303 é um dos melhores chips e deve funcionar com a maioria dos dispositivos.

    
por bain 25.05.2014 / 18:13
1

Eu não sei sobre statserial (e sei que esta é uma questão antiga), mas se você quiser ter um nome de dispositivo personalizado, pode soltar um arquivo em /etc/udev/rules.d/ como este (o meu é chamado 98-devicename.rules ):

SUBSYSTEM=="tty" ATTRS{idVendor}=="067b" ATTRS{idProduct}=="2303" SYMLINK+="devicename%n" MODE:="0666"

Isso corresponderá ao USB ID / fornecedor e permitirá que todos os usuários acessem sem estarem em dialout group ( MODE ). Ele também criará um link simbólico /dev/devicename0 - > /dev/ttyUSB0 , supondo que seja o primeiro dos dois. Se você tinha um dispositivo diferente com um chipset USB diferente (por exemplo, um Cypress) já conectado, ele poderia ser o primeiro este chipset, então /dev/devicename0 - > %código%. Por ter /dev/ttyUSB1 manipulando os links simbólicos, você não precisa se preocupar com ele sendo conectado a uma porta diferente, etc - udev deve sempre ser o primeiro dispositivo que usa esse chipset.

Para encontrar mais coisas que você pode encontrar, consulte devicename0 .

    
por Aaron D. Marasco 06.06.2016 / 16:13
0

Quanto a como conectar código personalizado a portas seriais, já que eu geralmente uso o Python, eu recomendaria verificar o link da biblioteca pySerial

    
por nmz787 25.09.2015 / 23:45