Piping da porta serial no Mac OS X

2

Tenho um adaptador USB para RS232 com o qual estou conectando meu MacBook Pro (OS X 10.9) a uma placa EVK1100 da Atmel. O programa na placa gera muitas informações sobre a porta serial e eu gostaria de poder inspecioná-lo. No entanto, estou com dificuldades para encontrar um programa para isso.

Conectar o adaptador faz dois dispositivos aparecerem:

  • /dev/cu.usbserial-FTB3VVRF
  • /dev/tty.usbserial-FTB3VVRF

Eu não posso usar o dispositivo cat tty diretamente porque ele precisa de uma taxa de transmissão. Eu posso especificar uma taxa de baud com screen , mas ela não me deixará canalizar e exibirá apenas uma única tela de dados.

O que posso fazer?

    
por zneak 31.01.2014 / 21:48

4 respostas

1

Não encontrei nada, então escrevi um programa curto para fazer exatamente isso.

#include <iostream>
#include <string>
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>

using namespace std;

int main(int argc, const char * argv[])
{
    if (argc < 2 || argc > 3)
    {
        cerr << "usage: " << argv[0] << " device [bauds]" << endl;
        return 1;
    }

    string device = argv[1];
    unsigned long bauds = 9600;
    if (argc == 3)
    {
        char* result;
        bauds = strtoul(argv[2], &result, 10);
        if (*result != '
#include <iostream>
#include <string>
#include <termios.h>
#include <fcntl.h>
#include <unistd.h>

using namespace std;

int main(int argc, const char * argv[])
{
    if (argc < 2 || argc > 3)
    {
        cerr << "usage: " << argv[0] << " device [bauds]" << endl;
        return 1;
    }

    string device = argv[1];
    unsigned long bauds = 9600;
    if (argc == 3)
    {
        char* result;
        bauds = strtoul(argv[2], &result, 10);
        if (*result != '%pre%')
        {
            cerr << "usage: " << argv[0] << " device [bauds]" << endl;
            return 1;
        }
    }

    int fd = open(argv[1], O_RDWR | O_NDELAY | O_NOCTTY);
    if (fd == -1)
    {
        perror((string("can't open ") + argv[1]).c_str());
        exit(errno);
    }

    struct termios config;
    if (tcgetattr(fd, &config) < 0)
    {
        perror("can't get serial attributes");
        exit(errno);
    }

    if (cfsetispeed(&config, bauds) < 0 || cfsetospeed(&config, bauds) < 0)
    {
        perror("can't set baud rate");
        exit(errno);
    }

    config.c_iflag &= ~(IGNBRK | BRKINT | ICRNL | INLCR | PARMRK | INPCK | ISTRIP | IXON);
    config.c_oflag = 0;
    config.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);
    config.c_cflag &= ~(CSIZE | PARENB);
    config.c_cflag |= CS8;
    config.c_cc[VMIN]  = 1;
    config.c_cc[VTIME] = 0;

    if (tcsetattr(fd, TCSAFLUSH, &config) < 0)
    {
        perror("can't set serial attributes");
        exit(errno);
    }

    char buffer[80];
    while (true)
    {
        size_t n = read(fd, buffer, sizeof buffer);
        write(STDOUT_FILENO, buffer, n);
    }

    close(fd);
    return 0;
}
') { cerr << "usage: " << argv[0] << " device [bauds]" << endl; return 1; } } int fd = open(argv[1], O_RDWR | O_NDELAY | O_NOCTTY); if (fd == -1) { perror((string("can't open ") + argv[1]).c_str()); exit(errno); } struct termios config; if (tcgetattr(fd, &config) < 0) { perror("can't get serial attributes"); exit(errno); } if (cfsetispeed(&config, bauds) < 0 || cfsetospeed(&config, bauds) < 0) { perror("can't set baud rate"); exit(errno); } config.c_iflag &= ~(IGNBRK | BRKINT | ICRNL | INLCR | PARMRK | INPCK | ISTRIP | IXON); config.c_oflag = 0; config.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG); config.c_cflag &= ~(CSIZE | PARENB); config.c_cflag |= CS8; config.c_cc[VMIN] = 1; config.c_cc[VTIME] = 0; if (tcsetattr(fd, TCSAFLUSH, &config) < 0) { perror("can't set serial attributes"); exit(errno); } char buffer[80]; while (true) { size_t n = read(fd, buffer, sizeof buffer); write(STDOUT_FILENO, buffer, n); } close(fd); return 0; }
    
por 03.02.2014 / 19:01
1

Eu costumava

(stty speed 115200 >/dev/null && cat) </dev/cu.usbserial-FTB3VVRF | tee serial.log

quando queria canalizar em série.

    
por 13.03.2019 / 23:25
1

Descobri que o pySerial tem uma pequena ferramenta chamada miniterm que funciona muito bem. Eu usei assim:

$ pip install pyserial
$ python -m serial.tools.miniterm /dev/cu.usbserial 9600
...
    
por 21.08.2015 / 04:55
0

O CoolTerm é um aplicativo para terminal Mac que deve ser capaz de se conectar ao seu dispositivo serial.

Caso contrário, aqui está uma lista de aplicativos de terminal da interface gráfica do Mac . E aqui está uma lista de (software de terminal de linha de comando) .

    
por 05.02.2015 / 08:53