Pregunta

Problema: : Tengo un dispositivo de mano que escanea los códigos de barras de colores gráficos en todos los envases. Hay un dispositivo de seguimiento que puedo usar que deslizar el dispositivo automáticamente. Este dispositivo funciona mediante la pista teniendo código ASCII a través de un puerto serie. Necesito conseguir esto para trabajar en FileMaker en un Mac. Así que no hay programas de terminal, etc ...

Lo que tengo hasta ahora : He comprado un adaptador Keyspan USB / Serie. El uso de un programa llamado ZTerm que tuvo éxito en el envío de comandos al dispositivo. Ejemplo: "C, 7 ^ M ^ J"

También fue capaz de hacer lo mismo en la terminal usando este comando: pantalla /dev/tty.KeySerial1 57600 y escriba en el mismo comando anterior (pero cuando mecanografié en I simplemente pulse Control-M y Control-J para el retorno de carro y avance de línea)

Ahora estoy escribiendo un plug-in de FileMaker (en C ++, por supuesto). Quiero conseguir lo que hice anteriormente ocurre en C ++ por lo que al instalar el plug-in de FileMaker sólo puedo llamar a una de esas funciones y tienen todo el lugar proceso de toma allí mismo.

soy capaz de conectar con el dispositivo, pero no puedo hablar con él. No está respondiendo a nada.

He intentado conectar al dispositivo (con éxito) usando los siguientes:

FILE *comport;
if ((comport = fopen("/dev/tty.KeySerial1", "w")) == NULL){...}

y

int fd;
fd = open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY);

Esto es lo que he probado hasta ahora en la forma de hablar con el dispositivo:

fputs ("C,7^M^J",comport);

o

fprintf(comport,"C,7^M^J");

o

char buffer[] = { 'C' , ',' , '7' , '^' , 'M' , '^' , 'J' };
fwrite (buffer , 1 , sizeof(buffer) , comport );

o

fwrite('C,7^M^J', 1, 1, comport);

Preguntas : Al conectar al dispositivo de la terminal y el uso de ZTerm, pude poner mi velocidad de transmisión de 57600. Creo que puede ser por eso que no está respondiendo aquí. Pero no sé cómo hacerlo aquí .... ¿Hay alguna uno sabe cómo hacerlo? He intentado esto, pero no funcionó:

comport->BaudRate = 57600;

Hay una gran cantidad de soluciones de clase por ahí, pero que todas las llamadas que incluyen archivos como termios.h y stdio.h. No tengo estos y, por cualquier razón, no puedo encontrarlos para descarga. He descargado algunos ejemplos, pero hay como 20 archivos en ellos y todos los que están llamando a otros archivos que no puedo encontrar (como las mencionadas anteriormente). ¿Necesito encontrar estos y si es así ¿dónde? Sólo que no sé lo suficiente sobre C ++ ¿Hay un sitio web donde puedo descargar bibliotecas ??

Otra solución podría ser la de poner esos comandos de terminal en C ++. ¿Hay una manera de hacer eso?

Así que esto me ha estado volviendo loco. No soy un chico de C ++, sólo sé conceptos básicos de programación. ¿Hay alguien por ahí un experto en C ++? Me Lo ideal sería que esto funcione simplemente usando las funciones que ya tengo, como los fwrite, fputs cosas. Gracias!

¿Fue útil?

Solución

El envío de un ^ M y luego un no envía Control-M, eso es sólo la forma en que usted lo escribe, enviar un carácter de control de la forma más fácil es usar el href="http://en.wikipedia.org/wiki/Ascii#ASCII_control_characters" rel="nofollow noreferrer"> control de código ASCII

ps. ^ M es retorno de carro es decir, "\ r" y ^ J se avance de línea "\ n"

editar: Probablemente más de lo que (esperemos) necesitará nunca saber - pero leer La serie puerto Howto antes de seguir adelante.

Otros consejos

Esto no es una cuestión de C ++. Estás preguntando cómo interactuar con el conductor TTY para establecer teh velocidad de transmisión. El hecho de que usted está abriendo el archivo en / dev me dice que estás en un derivado de Unix, por lo que la página del manual correspondiente a leer en un sistema Linux es "man 3 termios".

Básicamente, se utiliza la variante abierta () anterior, y pasar el archivo descriptor de tcsetattr / tcgetattr.

¿Está seguro de que ha instalado todas las herramientas de compilación correctamente? En mi Mac OS X 10.5.8, termios.h y stdio.h están ahí en / usr / include, al igual que yo esperaría. los código que ya ha encontrado para la programación de puerto serie de otras variantes de Unix debe sólo requieren cambios menores (si los hay) para trabajar en un Mac. ¿Puede decirnos un poco más acerca lo que ha intentado, y lo que salió mal?

mgb también tiene un buen punto acerca de cómo los caracteres de control necesitan ser representados.

Es posible ajustar la velocidad de transmisión con ioctl . He aquí una enlace a un ejemplo .

Usted no especifica qué Unix que está utilizando, lo que a continuación les dejo un cierto uso de Linux de código de producción I.

de Pleae nota siguiente código es un método de clase así que ignora cualquier externo (es decir, no declarada) referencias.

Los pasos son los siguientes -

Configurar su estructura termio, aquí es donde se establece ninguna bandera necesarios etc (es decir, el paso que lleva a cabo usando Zterm. Los ajustes termio por debajo de configurar el puerto de 8 bits de datos, 1 bit de parada y sin paridad (8-N-1). también el puerto estará en "bruto" (en contraposición a cocido) por lo que su modo de flujo de caracteres a, texto no se enmarca en las líneas, etc. las constantes baudios coincide con el valor real, es decir, para 56.700 baudios se utiliza "57600".

Los parámetros de tiempo significa que los caracteres se devuelven desde el dispositivo tan pronto como estén disponibles.

Una vez que haya fijado sus parámetros termainal, que abrir el dispositivo (utilizando POSIX abierta ()), y luego se puede utilizar tcgetattr / tcsetattr para configurar el dispositivo a través de la FD.

En este punto se puede leer / escribir en el dispositivo mediante la lectura llamadas al sistema () / escritura ().

Tenga en cuenta que en el siguiente ejemplo leer () bloqueará si no hay datos disponibles por lo que es posible que desee utilizar select () / poll () si el bloqueo no es deseable.

Espero que ayude.

termios termio    
tcflag_t baud_specifier;

    //reset device state...
    memset (&termio, 0, sizeof (termios));
    read_buffer.clear();

    //get our boad rate...
    if (!(baud_specifier = baud_constant (baud))) {
        ostringstream txt;
        txt << "invalid baud - " << baud;
        device_status_msg = txt.str();
        status = false;

        return (true);
    }


    //configure device state...
    termio.c_cflag = baud_specifier | CS8 | CLOCAL | CREAD;

    //do we want handshaking?
    if (rtscts) {
        termio.c_cflag |= CRTSCTS;
    }

    termio.c_iflag = IGNPAR;
    termio.c_oflag = 0;
    termio.c_lflag = 0;

    //com port timing, no wait between characters and read unblocks as soon as there is a character
    termio.c_cc[VTIME]    = 0;
    termio.c_cc[VMIN]     = 0;

    //open device...
    if ((fd = open (device.c_str(), O_RDWR | O_NOCTTY)) == -1) {

        ostringstream txt;
        txt << "open(\"" << device << "\") failed with " << errno << " - "
            << std_error_msg (errno);
        device_status_msg = txt.str();
        status = false;

        return (true);
    }

    //keep a copy of curret device state...
    if (tcgetattr (fd, &old_termio) == -1) {

        ostringstream txt;
        txt << "tcgetattr() failed with " << errno << " - " << std_error_msg (errno);
        device_status_msg = txt.str();
        status = false;

        return (true);
    }

    //flush any unwanted bytes
    if (tcflush (fd, TCIOFLUSH) == -1) {

        ostringstream txt;
        txt << "tcflush() failed with " << errno << " - " << std_error_msg (errno);
        device_status_msg = txt.str();
        status = false;

        return (true);
    }

    //apply our device config...
    if (tcsetattr (fd, TCSANOW, &termio) == -1) {

        ostringstream txt;
        txt << "tcsetattr() failed with " << errno << " - " << std_error_msg (errno);
        device_status_msg = txt.str();
        status = false;

        return (true);
    }

    node_log_f ("successfully initialised device %s at %i baud", "open_device()",
                device.c_str(), baud);

    status = true;
    return (true);
} 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top