Страница 1 из 1

Работа с COM портом

Добавлено: 2007-07-31 23:38:36
termsl
Есть железка самопальная, ей по RS232 (COM-порт) говоришь сделай то-то (несколько байт просто пересылаются) она делает и отвечает - "сделала то-то"

Под виндой без проблемм работает, под Free ничего не накопал .... Железка терминал не потдерживает, просто ты ей несколько байт, она тебе несколько байт в ответ ......
Может кто знает как сделать?

Re: Работа с COM портом

Добавлено: 2007-07-31 23:41:42
Alex Keda

Re: Работа с COM портом

Добавлено: 2007-08-01 7:29:14
termsl
cu создает терминал как я понял
для нормальной работы cu надо чтобы ей с той стороны отвечали..... железка повторяюсь тупая
при запуске

Код: Выделить всё

#cu -l cuad0 -s 57600 -v
виснят прям как у тебя Лис в посте ... приходится killall делать

Мне более подошел бы алгоритм -
1 вар. открыть порт, сказать, выслушать ответ, закрыть
2 вар. как демон висит слухач, который при старте открывает порт и по команде может говорить.

Re: Работа с COM портом

Добавлено: 2007-08-02 9:17:08
termsl
Разобрался:

Программа посылает символы на входе в обрамлении конструкции " <!XXX> "

Код: Выделить всё

        /*
        *       gcc -O2 -o /test/COM/com /test/COM/com.c
        */


        #include <stdio.h>   /* Standard input/output definitions */
        #include <string.h>  /* String function definitions */
        #include <unistd.h>  /* UNIX standard function definitions */
        #include <fcntl.h>   /* File control definitions */
        #include <errno.h>   /* Error number definitions */
        #include <termios.h> /* POSIX terminal control definitions */
        #include <locale.h>

        #define MAXL 255                /* макс. длина строки */

        /*
        * 'open_port()' - Open serial port 1.
        *
        * Returns the file descriptor on success or -1 on error.
        */

int open_port(void)
        {
        int fd;                         /* File descriptor for the port */
        struct termios options;

        fd = open("/dev/cuad0", O_RDWR | O_NOCTTY | O_NDELAY);
        if (fd == -1)
                {
                /*
                * Could not open the port.
                */
                perror("open_port: Unable to open /dev/cuad0 :( ");
                }
        else
        {
        fcntl(fd, F_SETFL, 0);
        printf ("Port OPEN OK!:>\n");
        }

        tcgetattr(fd, &options);
        cfsetispeed(&options, B57600);
        cfsetospeed(&options, B57600);
        tcsetattr(fd, TCSANOW, &options);


        return (fd);
}

int main (argc, argv)  char **argv;
        {
        int fdd;
        int n;
        char str[10];

        printf("\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n|    (c) Termsl' 2007    |\n-------------------------\n");

        fdd = open_port();
        setlocale(LC_ALL, "");
        if( argc == 1 )
                {

                                        /* программа вызвана без аргументов */
                }else{                  /* аргументы программы - имена файлов */

                while( argv[ 1 ] )
                {
                printf("<%s> ",argv[1]);
                n = write(fdd," <!",3);
                n = write(fdd,argv[1], 8);
                n = write(fdd,"> ",2);

                argv++;
                argc--;
                }
        }
        if (n < 0) fputs("write() failed!\n", stderr);
        close(fdd);
        printf ("\n<: Port CLOSED OK! \n=========================\n\n");

        exit(0);
}

Использование:

Код: Выделить всё

#./com 111 112 113
отошлет в COM1 на скорости 57600 без контроля четности " <!111> <!112> <!113> "