0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 3
1

Не приходят данные из COM порта при использовании ReadFile()

09.04.2022, 19:49. Показов 907. Ответов 3

Студворк — интернет-сервис помощи студентам
Я студент на удалёнке. Требуется написать лабораторную по отправке и получению данных из COM. Само задание понятно, однако столкнулся с проблемой что не приходят данные при чтении из порта функцией ReadFile(). Я написал преподавателю, но ответ затянулся, возможно здесь получу его быстрее. Я прочитал документацию msdn по работе с портами, не понимаю в чем ошибка, скорее всего банальна и на поверхности. Любая помощь будет очень ценна
Листинг
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
#include <windows.h>
#include <iostream>
#include <conio.h>
 
using namespace std;
 
HANDLE hCOM;
 
void close()
{
    CloseHandle(hCOM);
    cout << endl;  ExitProcess(0);
}
 
int main()
{
    setlocale(LC_ALL, ".1251");
//----------------------------------------- открываем порт
    hCOM = CreateFile(L"\\\\.\\COM10",      
                    GENERIC_READ | GENERIC_WRITE,NULL,NULL,
                    OPEN_EXISTING,NULL,NULL);
 
    if (hCOM == INVALID_HANDLE_VALUE)
    {
        cout << "Ошибка открытия порта" << endl; 
        close();
    }
 
    cout << "Порт COM10 открыт. Описатель: " << hCOM << endl;
//----------------------------------------- инициализируем порт
    DCB dcb;
    GetCommState(hCOM, &dcb);
 
    dcb.fBinary = TRUE;                   // Включаем двоичный режим обмена
    dcb.BaudRate = CBR_9600;              // Скорость передачи данных
    dcb.ByteSize = 8;                     // Размер байта данных
    dcb.StopBits = ONESTOPBIT;            // Количество стоповых бит
    dcb.fParity = NOPARITY;               // Проверка четности
 
    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 2000;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
    CommTimeOuts.ReadTotalTimeoutConstant = 1000;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
    CommTimeOuts.WriteTotalTimeoutConstant = 1000;
 
    if (!SetCommState(hCOM, &dcb) || !SetCommTimeouts(hCOM, &CommTimeOuts))
    {
        cout << "Ошибка настройки порта" << endl;
        close();
    }
 
    unsigned char ch;
    cout << "Символ для передачи: "; ch = _getche();
//----------------------------------------- отправляем символ в порт
    DWORD rb;
    bool Wchar = WriteFile(hCOM, &ch, sizeof(ch), &rb, 0);
    
    if (Wchar && rb > 0) printf("\nСимвол '%c' отправлен в порт\n", ch);
 
    unsigned char rez = 0;
    rb = 0;
    int i = 0;
//----------------------------------------- ожидаем получения из порта
    while (++i<10) {
        bool Rchar = ReadFile(hCOM, &rez, sizeof(rez), &rb, 0);
        if (Rchar && rb > 0) {
            printf("\nСимвол '%с' получен\n", rez);
            break;
        }
        cout << "ожидаем получения символа из COM10 .." << endl;
    }
 
    close();
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2022, 19:49
Ответы с готовыми решениями:

Зацикливание при чтении COM-порта в функции ReadFile()
Создал класс Transmit для работы с виртуальным COM-портом ПК. Transmit.h #include...

Утечки при использовании порта завершения и соккетов
Здравствуйте, уважаемые Гуру! Реализовываю сервер с использованием порта завершения. Всё работает,...

Приходят неправильные данные при чтении из Serial Port
Доброго времени суток. Имеется проблема с реализацией обмена данными с COM портом. Прибор,...

Проблема искажения данных при использовании ком-порта с четностью, установленной в режим ODD и EVEN
Добрый день. Я пишу программу, которая должна опрашивать микроконтроллер по юарт. Одна из функций -...

3
Модератор
3377 / 2149 / 352
Регистрация: 13.01.2012
Сообщений: 8,349
11.04.2022, 10:55 2
pirocsilin, вроде буквы верные, у меня только FILE_ATTRIBUTE_NORMAL в CreateFile, а еще имя файла без префикса - просто COM10
0
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 3
15.04.2022, 13:15  [ТС] 3
Выставил FILE_ATTRIBUTE_NORMAL. Без префикса порт не открывается. Позвонил на кафедру, пообщался с преподавателем, он сказал что ему пока не до меня. На сегодняшний день решение не найдено.
0
2338 / 803 / 304
Регистрация: 10.02.2018
Сообщений: 1,885
15.04.2022, 13:35 4
Цитата Сообщение от pirocsilin Посмотреть сообщение
Требуется написать лабораторную по отправке и получению данных из COM
Вы же понимаете, что порт сам по себе никакие данные вам не отправит. Данные отправляет устройство, которое связано с компьютером посредством порта и RS-232 интерфейса. Устройство может не отвечать по множеству причин: устройство выключено или не готово к работе, неправильные параметры передачи данных (частота, битность или четность), неправильный протокол обмена. Из вашего описания совершенно не известно куда именно вы отправляете символы вводимые с клавиатуры и должно ли хоть что-то приходить на них в ответ.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2022, 13:35
Помогаю со студенческими работами здесь

[SIP] При использовании клиентом параметра rport сервер отправляет запросы INVITE с нового порта
Здравствуйте. Пытаюсь разобраться с sip-телефонией. Каждый раз новые сюрпризы выдаёт. Проблема в...

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

Некорректные данные при считывании с COM-порта
Добрый день! Прошу помочь разобраться с работой COM-порта. Опрашиваю порт в ручном режиме:...

Пропадают данные COM порта при закрытии формы
MainForm using System; using System.Collections.Generic; using...

Портятся данные при использовании memcpy()
Мне нужно &quot;переганять&quot; большие массивы данных, поэтому решил использовать функцию memcpy()....

Странные данные при использовании оператора for
Здравствуйте, выполняю задание из учебника, не понимаю, почему программа возвращает такие данные....

Теряются данные при использовании метода post, get
Есть такая форма ввода: &lt;section class=&quot;loginform cf&quot;&gt; &lt;form name=&quot;login&quot;...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru