Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325

Прием и передача данных в последовательный порт

22.09.2015, 17:17. Показов 5456. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, отправляю вот так

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
static void configDevSer(void){
  
    struct termios termios_p;
    tcflush(device,TCIFLUSH);
    tcgetattr(device,&termios_p);
    cfsetispeed(&termios_p, baud_rate);
    cfsetospeed(&termios_p, baud_rate);
    cfmakeraw(&termios_p);
    tcgetattr(device, &termios_p);
   cfsetispeed(&termios_p, B9600);
   cfsetospeed(&termios_p, B9600);
   
   termios_p.c_cflag &= ~CSTOPB;
   termios_p.c_cflag &= ~CSIZE;
   termios_p.c_cflag |= CS8;
   termios_p.c_cflag &= PARENB;
   termios_p.c_cc[VMIN] = 0; 
   termios_p.c_cc[VTIME] = 10; 
  tcsetattr(device, TCSANOW, &termios_p);
}
int main()
{
    device = open("/dev/ttyS0", O_RDWR| O_NOCTTY | O_NONBLOCK);
    baud_rate = atoi("9600");
    if (device == -1)
    perror("Open_port: Unable to open /dev/ttyS0");
    else
    {
       cout<<"Port is Open!"<<endl;
       configDevSer();
       fcntl(device, F_SETFL, 0);
    }
    int con;
    float val;   
    val =5;
    con=write(device, &val, sizeof(float));
    if (con < 0)
        fputs("write() of 4 bytes failed!\n", stderr);  
    return 0;
}
а принимаю вот так
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
static void configDevSer(void){
    struct termios termios_p;
    tcflush(device,TCIFLUSH);
    tcgetattr(device,&termios_p);
    cfsetispeed(&termios_p, baud_rate);
    cfsetospeed(&termios_p, baud_rate);
    cfmakeraw(&termios_p);
    tcgetattr(device, &termios_p);
   cfsetispeed(&termios_p, B9600);
   cfsetospeed(&termios_p, B9600);   
   termios_p.c_cflag &= ~CSTOPB;
   termios_p.c_cflag &= ~CSIZE;
   termios_p.c_cflag |= CS8;
   termios_p.c_cflag &= PARENB;
   termios_p.c_cc[VMIN] = 0; 
   termios_p.c_cc[VTIME] = 10; 
  tcsetattr(device, TCSANOW, &termios_p);
}
int main()
{
    device = open("/dev/ttyS0", O_RDWR| O_NOCTTY | O_NONBLOCK);
    baud_rate = atoi("9600");
    if (device == -1)
    perror("Open_port: Unable to open /dev/ttyS0");
    else
    {
       cout<<"Port is Open!"<<endl;
       configDevSer();
       fcntl(device, F_SETFL, 0);
    }
    int rc;
    float value;
    rc=read(device,&value,sizeof(float));
       cout<<"Rec: "<<value;
}
и тот и тот код запускается и компилируется нормально, я сначало запускаю отправку, а потом прием, подскажите что может быть не так, я щас постараюсь что как мне кажется должно работать, но я думаю что я розмышляю не правильно
сначало я отправляю данные в com порт и они там как бы "находятся", потом я запускаю считывания и считываю данные что там "находятся" (что я думаю не верно), но оно нечего не работает, может надо как то в цыкл загнать и там что то делать? еще я удмаю что это должно работать как клиент-сервер на сокетах, что я думаю тоже является ошибкой, неочень могу понять как на одном компьютере послать в ком порт и считать, у меня есть провод с ком портом и на usb, может надо его втыкнуть в компьютер и как бы посылка будет по этому шнурку

подскажите пожалуйста с програмной реализацией и физически нужно вставлять какой то шнур в компютер и соединять два входа или по идее должно все програмно работать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2015, 17:17
Ответы с готовыми решениями:

(MCS-51) Выполнить прием из внешней памяти данных 20 байт и передать через последовательный порт в режиме 3
Как я понял, помогают тут и так с неохотой. А под такую ерундовину, как МСS-51 – это вообще абзац. Но, может кто ни будь, все же, шарит?...

Передача данных через последовательный порт
Ребят, всем добрый вечер! Предстоит следующая задача: нужно реализовать, например - в отдельном классе, функции для передачи данных через...

Передача и приём данных через COM порт
Задача такая, нужно через ком порт передавать и принимать пачки байтов, всё это по протоколу modbus rtu. Установил библиотеки ком порта...

2
...
 Аватар для anmartex
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
24.09.2015, 09:11

Не по теме:

Для начала хотел бы сказать, что у меня, у безграмотного (русский/литература - 3/4), стынет кровь от ваших речевых оборотов и грамматических ошибок. Пожалуйста, уважайте свой родной язык!



А теперь по существу. Com-порт - не сокет, и даже близко таковым не является. Когда вы что-то посылаете в порт, то данные там "как бы не находятся". И никто эти данные держать "там" не будет. Вам необходимо сначала подтянуть матчасть.

Цитата Сообщение от итернал Посмотреть сообщение
вставлять какой то шнур в компьютер и соединять два входа
Да, это как вариант, но у вас вряд ли на PC есть два последовательных порта. Но даже если они есть, то вам необходимы кое-какие знания для объединения их.

Цитата Сообщение от итернал Посмотреть сообщение
или по идее должно все программно работать?
Нет, не должно

Теперь по поводу выхода из ситуации:
1. Можно создать виртуальные порты объединёные в мост. К примеру утилитой tty0tty. Собирается легко (1 исходный файл), эмулирует устройства /dev/pts/1, /dev/pts/2 и т.д. При запуске выдаст что-то на подобии: (/dev/pts/3) <=> (/dev/pts/4). Соответственно, одну программу "вешаете" на 3, другую на 4. Всё, смотрите как работает.
2. Можно установить минимальную сборку linux-а на VirtualBox-е и добавить в настройках 2 порта, а их уже объединить, хотя бы тем же файлом (правда сам не проверял).
3. Можно воспользоваться преобразователем интерфейса usb/serial, но тут необходим будет драйвер и естественно шнурок объединяющий usb преобразователь с физическим портом.
4. Ещё можно воспользоваться какой-нибудь утилитой которая преобразует TCP/serial и обратно, к примеру socat, ser2net.
0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
24.09.2015, 10:47  [ТС]
спасибо большое, ну я пока сделал так, поставил на com-порт заглушку, ну всмысле что туда посылается приходит назад
но всеравно через программу посмотреть что я туда посылаю немогу
я в одном терминале посылаю через echo "asdfsdf" > /dev/ttyS0
а в другом смотрю сначало сделав
stty 9600 -F /dev/ttyS0 raw -echo
и потом смотрю через
cat /dev/ttyS0
все нормально приходит, а вот пытаюсь посылать через echo
а смотреть через такую программу, нечего не выходим, подскажите что может быть не так, пожалуйста
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
int main()
{
    device = open("/dev/ttyS0", O_RDWR| O_NOCTTY | O_NONBLOCK);    
    baud_rate = atoi("9600");
    if (device == -1)
    perror("Open_port: Unable to open /dev/ttyS0");
    else
    {
         cout<<"Port is Open!"<<endl;
         struct termios options; /*структура для установки порта*/
         tcgetattr(device, &options); /*читает пораметры порта*/
         cfsetispeed(&options, baud_rate); /*B115200установка скорости порта*/
         cfsetospeed(&options, baud_rate); /*установка скорости порта*/
         options.c_cflag &= ~PARENB; /*выкл проверка четности*/
         options.c_cflag &= ~CSTOPB; /*выкл 2-х стобит, вкл 1 стопбит*/
         options.c_cflag &= ~CSIZE; /*выкл битовой маски*/
         options.c_cflag |= CS8; /*вкл 8бит*/
         fcntl(device, F_SETFL, 0);
         tcsetattr(device, TCSANOW, &options); /*сохронения параметров порта*/
         cout<<"Port is Open!"<<endl;
    } 
    char buf[512];
    while(1)
    {
      cout<<"Port is Open!"<<endl;
      rc=read(device,buf,8); /*чтения приходящих данных из порта*/
      cout<<"Rec: "<<buf<<endl;
    }
}
cout<<"Port is Open!"<<endl;
подабавлял в разных местах что бы выводило и понимать куда доходит моя программа, до read она доходит и и ждет, но потом я начию посылать через echo и некакой реакции, что может быть не так?
я уже пробывал и посылать ровно 8 символом и 7 и незнаю, всеравно некакой реакции

Добавлено через 35 минут
хотя щас сделал вот так
C++
1
cout<<"Rec: "<<buf[0]<<endl;
и посылаю через echo 1 символ принимается, но почему через раз, неподскажите в чем может быть причина?

Добавлено через 1 минуту
а не и как до этого принимает, но всеравно только через раз, подскажите почему оно так? принимает через одно сообщение

Добавлено через 1 минуту
а все разобрался, я закрыл терминал где у меня была
cat /dev/ttyS0
половина туда уходила
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2015, 10:47
Помогаю со студенческими работами здесь

Передача и приём данных через COM-порт
Добрый день! Передо мной поставили задачу написать программу для работы с адаптером OBD2 Elm327 через виртуальный COM-порт. Пробую пока...

Прием/передача текстовых файлов через 80 порт
Установил выделенную линию в инет и теперь хочу сделать что бы клиенты могли передавать файлы на сервер и принимать файлы с сервера через...

Протокол передачи данных через последовательный порт
Ребят, всем добрый вечер! Предстоит следующая задача: нужно реализовать, например - в отдельном классе, функции для передачи данных через...

Bash-скрипт для отправки данных в последовательный порт
Добрый день уважаемые эксперты! Помогите пожалуйста с написание bash-скрипта, который будет отправлять строку байт в последовательный ...

Прием данных через COM - порт
Привет! Мне нужно реализовать прием данных с МК на компьютер через COM порт. Пишу в VS 2005, С++. Создаю приложение MFC Aplication. ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru