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

Решение проблем связванных с работой железа. Проблемы программно-аппаратной совместимости.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
termsl
мл. сержант
Сообщения: 121
Зарегистрирован: 2007-04-10 23:26:41
Откуда: Moscow

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

Непрочитанное сообщение termsl » 2007-07-31 23:38:36

Есть железка самопальная, ей по RS232 (COM-порт) говоришь сделай то-то (несколько байт просто пересылаются) она делает и отвечает - "сделала то-то"

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

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35332
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2007-07-31 23:41:42

Убей их всех! Бог потом рассортирует...

Аватара пользователя
termsl
мл. сержант
Сообщения: 121
Зарегистрирован: 2007-04-10 23:26:41
Откуда: Moscow

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

Непрочитанное сообщение termsl » 2007-08-01 7:29:14

cu создает терминал как я понял
для нормальной работы cu надо чтобы ей с той стороны отвечали..... железка повторяюсь тупая
при запуске

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

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

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

Аватара пользователя
termsl
мл. сержант
Сообщения: 121
Зарегистрирован: 2007-04-10 23:26:41
Откуда: Moscow

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

Непрочитанное сообщение termsl » 2007-08-02 9:17:08

Разобрался:

Программа посылает символы на входе в обрамлении конструкции " <!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> "