Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/23: Рейтинг темы: голосов - 23, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 8

Не работает драйвер для работы приема/передачи по ком порту

24.06.2011, 15:40. Показов 4419. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа, прошу совета или помощи. Который день мучаюсь, все никак не решу проблемку...

Суть дела - пишу драйвер для работы приема/передачи по ком порту. Вот исходник:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <stdio.h> // standard input / output functions
#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 definitionss
#include <time.h>   // time calls
#include <sys/ioctl.h>
#include <linux/serial.h>           // Здесь описана serial_icount_struct
 
int fd;
int open_port(void)
{
int iret;
int fl_flags;
 
     
    fd = open("/dev/ttyS0", O_NONBLOCK | O_RDWR);
 
    if(fd == -1) // if open is unsucessful
    {
        
        printf("open_port: Unable to open /dev/ttyS0. \n");
        return -1;
    }
    else
    {
        fl_flags = fcntl(fd,F_GETFL);
        iret = fcntl(fd, F_SETFL, FNDELAY);
//      iret = fcntl(fd, F_SETFL, fl_flags & ~O_NONBLOCK);
        if (iret)
            printf("Error fcntl %s\n", strerror(errno));
        printf("port is open.\n");
 
    // Переведем устройство в exclusive mode
    iret = ioctl(fd, TIOCEXCL, 0);
    if (iret < 0) {
        return -1;
    };
 
        return 0;
    }
 
}
 
int configure_port()
{
int iret;
    struct termios port_settings;      // structure to store the port settings in
 
    iret = tcgetattr(fd, &port_settings);
    if (iret) 
        printf("Error tcgetattr %s\n", strerror(errno));
    cfsetispeed(&port_settings, B110);   // set baud rates
    cfsetospeed(&port_settings, B110);
 
/*  cfsetispeed(&port_settings, B9600);    // set baud rates
    cfsetospeed(&port_settings, B9600);
 
        port_settings.c_cflag     &= ~(CSIZE | CSTOPB | PARENB | CLOCAL);
        port_settings.c_cflag     |= CS8 | CREAD | HUPCL;
 
        port_settings.c_iflag      = IGNBRK | IGNPAR;
        port_settings.c_oflag      = 0;
        port_settings.c_lflag      = 0;
        port_settings.c_cc[VMIN]   = 1;
        port_settings.c_cc[VTIME]  = 10;
*/
    port_settings.c_iflag      = IGNBRK | IGNPAR;
    port_settings.c_oflag      = 0;
    port_settings.c_lflag      = 0;
    port_settings.c_cc[VMIN]   = 1;
    port_settings.c_cc[VTIME]  = 10;
 
 
    port_settings.c_cflag &= ~PARENB;    // set no parity, stop bits, data bits
 
    port_settings.c_cflag &= ~CSTOPB;
 
    port_settings.c_cflag &= ~CSIZE;
 
    port_settings.c_cflag |= CS8;
    port_settings.c_cflag |= (CLOCAL | CREAD); 
 
    iret = tcsetattr(fd, TCSANOW, &port_settings);    // apply the settings to the port
 
    return 0;
}
 
int read_write()
{
 
 
    unsigned char send_bytes[] = {'h','e','l','l','o'};
    char buffer[5];
 
    int n_write = write(fd, send_bytes, 5);  //Send data
    printf("Wrote the bytes. \n");
    usleep(10000000);
    int n_read=read(fd,buffer,1);
    if (n_read == -1)
        printf("Error read %s\n", strerror(errno));
 
    printf("read %d bytes. \n", n_read);
//  bufptr=buffer;
//  while((n_read=read(fd, bufptr, buffer+sizeof(buffer)-bufptr-1))>0)  
//{
//  bufptr+=n_read;
//} 
printf(buffer); 
 
    return 0;
 
 
 
}
 
int main(void)
{
    open_port();
 
    configure_port();
 
    read_write();
 
    close(fd);
 
    return(0);
 
 
 
}
На чтении возвращает -1, Port temporarily unavaible... Уже всю голову блин сломал...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2011, 15:40
Ответы с готовыми решениями:

MIDI, FT232, драйвер ком-миди от Roland. Не работает.
Итак, миня завут Илексиндр, я хотел бы вас попросить о совете, суть такова. Есть фтшка с мегой с одной стороны, есть роландовский...

Использование DLL для приема-передачи данных в разных приложениях
Здраствуйте, я новичок в С++, недавно столкнулся с проблемой, не могу передать два числа типа int из одной программы, созданной в С++...

Определения скорости передачи и приема по сети для процесса в Windows
Как определить скорость передачи и приема данный по сети (Ethernet, Wi-Fi) для процесса в WIndows. Как на картинке надо Не...

14
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
24.06.2011, 20:32
Стесняюсь спросить... А там точно есть что читать?
0
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 8
25.06.2011, 01:08  [ТС]
Вообще, честно говоря, если б не было, то в любом случае возвращалось бы 0...
Ну а вообще стоит заглушка для проверки работоспособности, я думаю было бы глупо публиковать сюда, если бы дело было в этом
Мне не понятно почему порт на запись работает, флаги устанавливаются, а на чтение не хочет... Просто может кто-то кто сталкивался поможет, а то честно уже прям печаль берет...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.06.2011, 10:06
Цитата Сообщение от alter_man Посмотреть сообщение
ообще, честно говоря, если б не было, то в любом случае возвращалось бы 0...
Вы же с O_NONBLOCK открываете...
Заглушка это железка? А скажем cu или tip с ней прекрасно работают?
0
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 8
25.06.2011, 15:39  [ТС]
Если я правильно понимаю, если стоит флаг nonblock, то собственно как раз и должен возвращаться 0, если никаких байтов прочитано не было... но уж точно не -1 и порт временно недоступен, разве нет?
Проблема-то не в том, что байты не приходят, а в том, что порт при наличии nonblock все равно временно недоступен для чтения...
P.S: если я в чем-то глубоко заблуждаюсь, прошу разъяснить моменты, буду очень благодарен...
P.P.S: по существу заглушка спаяна для теста приема-передачи, она отлично работает с такими программами ... хотя в принципе для проверки этого кода должно быть вполне достаточно соединить 2 и 3 pin...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
25.06.2011, 17:47
Заблуждаетесь, глубоко...
с O_NONBLOCK read() как раз вернет -1 и EAGAIN если читать нечего.
0 это EOF (в не зависимости от того установлен O_NONBLOCK или нет) и если не ошибаюсь в случае заглушки 0 там просто не удивить т.к. DCD всегда присутствует.
Во общем просто попробуйте сделать poll/select перед чтением/записью или уберите O_NONBLOCK
1
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 8
27.06.2011, 00:47  [ТС]
ладно, спасибо что уделили время...
Просто странно - запись ведь проходит, по идее ведь есть что считывать
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
27.06.2011, 09:39
Цитата Сообщение от alter_man Посмотреть сообщение
Просто странно - запись ведь проходит, по идее ведь есть что считывать
Мне тоже странно. Я почему-то думал, что паузы в 0.01 секунды (а если там секунду поставить?) вполне достаточно для того чтоб ваш hello физически просочился через порт, правда вы этот самый write() не проверяете...
0
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 8
27.06.2011, 13:05  [ТС]
Я просто если честно, в отладчике смотрю буфер, значение n_write, как раз 5 на n_write и буферу передалось Hello.
P.S: а нет ли у вас случаем какой-нибудь шпаргалки по poll? А то нормальную документацию я не нашел, а сам не так давно начал со всем этим работать, пока куча непонятного...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
27.06.2011, 13:51
Кроме man poll ничего в голову не приходит...
C
1
2
3
4
5
6
struct pollfd pfd;
pfd.fd = fd;
pfd.events = POLLIN;
if (poll(&pfd, 1, -1) == -1 || pfd.revents & (POLLERR|POLLHUP|POLLNVAL))
  /* ошибка */
/* пора читать */
0
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 8
28.06.2011, 01:26  [ТС]
бррр... результаты все равно не радуют..

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
 
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <sys/poll.h>
#include <errno.h>
 
int fd;
 
int main(void)
{
    unsigned char send_bytes[] = {'H','e','l','l','o'};
    char buffer[255];
    int ret;
    int k;
 
        struct termios oldtio,newtio;
 
        fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY| O_NONBLOCK);
        if (fd <0) { printf("error opening port"); return(-1);}
 
        fcntl(fd, F_SETOWN, getpid());
    fcntl(fd, F_SETFL, 0);
 
 
        tcgetattr(fd,&oldtio); /* save current port settings */
 
    newtio.c_ispeed = B9600;
    newtio.c_ospeed = B9600;
        newtio.c_cflag = (CS8 | CLOCAL | CREAD | CRTSCTS);
        newtio.c_iflag = (IGNPAR | ICRNL);
        newtio.c_oflag = OPOST;
        newtio.c_lflag = (ICANON|ECHO|ECHOE|ISIG);
        newtio.c_cc[VMIN]=1;
        newtio.c_cc[VTIME]=10;
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);
 
    struct pollfd poll_fd[1];
    k = poll(poll_fd, 1, 100);
    poll_fd[0].fd = fd;
    poll_fd[0].events = POLLIN;
    poll_fd[0].revents = POLLIN;
    int n_write = write(fd, send_bytes, sizeof(send_bytes));  //Send data
    printf("Wrote the bytes. \n");
    sleep(5);
    if((poll_fd[0].revents & POLLIN) !=0)
{
    int n_read=read(fd,buffer,sizeof(buffer));
    if (n_read == -1)
        printf("Error read %s\n", strerror(errno));
 
    printf("read %d bytes. \n", n_read);
}
 
printf(buffer); 
 
    return 0;
 
}
Что же тут не так? при FNDELAY -1 port temp unavaible, при fcntl(fd, F_SETFL,0) виснет на чтении...

Добавлено через 2 минуты
Если не сложно кому-нибудь, проверьте у себя плз, может у меня с машиной что-то не то... пробовал канонический ввод, raw mode, все равно ничего нет...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
28.06.2011, 15:43
Вы уж определитесь ко второй странице чего желаете...

Канонический режим: read()/poll(POLLIN) будет спать вечно, т.к. в вашем Hello нет \n/EOF/EOL.
Не канонический режим:
1. O_NONBLOCK не установлен - работать будут VMIN(у вас 1байт) и VTIME(у вас 1сек) следующим образом:
read спит пока не появиться VMIN байт, как только в буфере накопилось VMIN байт данных, запускается таймер VTIME, если по истечении VTIME больше ничего не пришло, то read вернет прочитанное, иначе таймер перезапускается.
2. O_NONBLOCK установлен - read вернет прочитанное либо -1.

ЗЫ: poll() в качестве таймаута перед write() прикольно...
0
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 8
28.06.2011, 17:08  [ТС]
сделал вроде все как вы сказали, все равно -1 , read source temporarily unavaible...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
 
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#include <sys/poll.h>
#include <errno.h>
 
int fd;
 
int main(void)
{
    unsigned char send_bytes[] = {'H','e','l','l','o'};
    char buffer[255];
    int ret;
    int k;
 
        struct termios oldtio,newtio;
 
        fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK);
        if (fd <0) { printf("error opening port"); return(-1);}
 
 
    fcntl(fd, F_SETFL, O_NONBLOCK);
 
 
        tcgetattr(fd,&newtio); /* save current port settings */
 
    cfsetispeed(&newtio, B9600);    // set baud rates
    cfsetospeed(&newtio, B9600);
        newtio.c_cflag = (CS8 | CLOCAL | CREAD);
        newtio.c_iflag = (IGNPAR | ICRNL);
        newtio.c_oflag &= ~OPOST;
        newtio.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);
        newtio.c_cc[VMIN]=1;
        newtio.c_cc[VTIME]=10;
 
        tcsetattr(fd,TCSANOW,&newtio);
 
    int n_write = write(fd, send_bytes, sizeof(send_bytes));  //Send data
    if (n_write < 0)
{
    return -1;
}
    if (n_write > 0)
{
    printf("Wrote the bytes. \n");
}
    struct pollfd poll_fd[1];
    k = poll(poll_fd, 1, 100);
    poll_fd[0].fd = fd;
    poll_fd[0].events = POLLIN;
    poll_fd[0].revents = POLLIN;
    if((poll_fd[0].revents & POLLIN) !=0)
{
    int n_read=read(fd,buffer,sizeof(buffer));
    if (n_read < 0)
        printf("Error read %s\n", strerror(errno));
 
    printf("read %d bytes. \n", n_read);
}
 
printf(buffer); 
 
    return 0;
 
}
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
28.06.2011, 17:33
Вы уж простите, но такой фигни я не говорил... Пытайтесь хотя бы капельку понимать что вы пишите в своей программе.
Ну вот объясните мне, какого хрена сначала poll() незнамо чего, а только потом инициализация структуры???
Зачем делать fcntl(fd, F_SETFL, O_NONBLOCK); если файл уже открыт с O_NONBLOCK???
Для чего вы ставите ECHOE и прочие флаги???
Нафига сохранять настройки порта если они никогда не восстанавливаются в программе?
Что по вашему выведет printf(buffer); если произойдет чудо и прога заработает?

И в конце концов я уже 2 раза повторил, что канонический режим и O_NONBLOCK с вашим "Hello" не дружат. Вот "man termios\n" будет работать, а "Hello" нет...
0
0 / 0 / 0
Регистрация: 24.06.2011
Сообщений: 8
28.06.2011, 18:14  [ТС]
знаете, в этом вся проблема нашей страны - все считают что если человек не понял объяснения, значит он тупой, а это совсем не так, просто умение объяснять понятно - очень редкий дар. Да и потом - у всех разный опыт программирования, да и вообще работы в частности, и объяснения на одном уровне не обязательно соответствуют уровню, на котором сейчас человек и, казалось бы понятные для вас вещи, могут быть не такими уж понятными, а принцип - "ну тогда и не суйся" вот это апогей таланта, если б учителя вам в школе говорили - не суйся, многого бы вы достигли? они-то точно побольше знали, но тем не менее показывали ошибки и приводили пример, хоть могли этого вполне и не делать - книга есть - читай...
В любом случае спасибо, и, если уж вас так задевает мой непрофессионализм извините за возможно потраченные ваши нервы...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2011, 18:14
Помогаю со студенческими работами здесь

Сделать замер времени,которое потребовалось для приема / передачи используя таймер
Здравствуйте, помогите пожалуйста с дополнением кода. Суть моего задания такова: Передать информацию при помощи uart-usb на плату...

Как читать 9-й бит по ком порту?
Возникла задача. Есть девайс который отправляет 9-битные посылки в COM-порт. Их надо отслеживать. Стандартные API как ReadFile принимают...

Разные скорости приема и передачи
Жизнь заставила заняться Cisco. Опыта нет, потому прошу помочь. Возникла проблема. Cisco 1890 подсоединяется к спутниковому модему по...

Поделитесь программой приема/передачи файла
Приветсвую всех! Потребовалось в программе передавать файлик по сети, поделитесь кто может прграммкой передачи файлов посети, желательно...

Linux Qt QSerialPort: Зависание приема/передачи
На QSerialPort реализован скоростной (460800) обмен данными с внешним устройством. Данные приходят асинхронно, примерно раз в 40 мс. Размер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru