Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021

Зависание записи в COM порт

24.07.2009, 06:21. Показов 4889. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня в программе идет постоянная запись/считывание данных из COM порта.
На одном компе все работает нормально, поставил тестироваться на более старый Celeron 1.7 512 Мб и выяснилась странная ситуация, через какое то время чтение данных из COM порта прикратилось. Оказалось что поток работы с COM портом завис на вызове:

rez=WriteFile(m_hCom,data,192,(LPDWORD)& byteotpr,NULL);

может кто то с таким сталкивался или подскажет как можно предотвратить эту ситуацию.

проблема возникает хаотически, было что через несколько минут после запуска программы, другой раз через сутки или больше.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2009, 06:21
Ответы с готовыми решениями:

Зависание программы при отправке в com порт
Всем доброго времени суток! Я совсем уж новичок в программировании на c# (до этого писал на delphi). Возникла проблема - программа...

Зависание программы при записи в RichTextBox
Всем привет! Создал я программу, которая шифрует текст. Делал я ее по разному : 1. Закодированный текст добавлялся в строку, а после уже...

Функция записи в порт
Хочу переделать код, что бы буфер содержал не символы, а что бы в начале его объявить как int...

6
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
24.07.2009, 06:53
установить таймауты COMMTIMEOUTS , SetCommTimeouts
1
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
24.07.2009, 07:00  [ТС]
Устанавливал так:
m_CommTimeouts.ReadIntervalTimeout = MAXDWORD;
m_CommTimeouts.ReadTotalTimeoutConstant = 0;
m_CommTimeouts.ReadTotalTimeoutMultiplie r = 0;
m_CommTimeouts.WriteTotalTimeoutConstant = 0;
m_CommTimeouts.WriteTotalTimeoutMultipli er = 0;
m_bPortReady2 = SetCommTimeouts (m_hCom2, &m_CommTimeouts);
Какие тогда мне нужно поставить и для чего?
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
24.07.2009, 08:37
ReadIntervalTimeout

Specifies the maximum time, in milliseconds, allowed to elapse between the arrival of two characters on the communications line. During a ReadFile operation, the time period begins when the first character is received. If the interval between the arrival of any two characters exceeds this amount, the ReadFile operation is completed and any buffered data is returned. A value of zero indicates that interval time-outs are not used.
A value of MAXDWORD, combined with zero values for both the ReadTotalTimeoutConstant and ReadTotalTimeoutMultiplier members, specifies that the read operation is to return immediately with the characters that have already been received, even if no characters have been received.

ReadTotalTimeoutMultiplier

Specifies the multiplier, in milliseconds, used to calculate the total time-out period for read operations. For each read operation, this value is multiplied by the requested number of bytes to be read.

ReadTotalTimeoutConstant

Specifies the constant, in milliseconds, used to calculate the total time-out period for read operations. For each read operation, this value is added to the product of the ReadTotalTimeoutMultiplier member and the requested number of bytes.
A value of zero for both the ReadTotalTimeoutMultiplier and ReadTotalTimeoutConstant members indicates that total time-outs are not used for read operations.

WriteTotalTimeoutMultiplier

Specifies the multiplier, in milliseconds, used to calculate the total time-out period for write operations. For each write operation, this value is multiplied by the number of bytes to be written.

WriteTotalTimeoutConstant

Specifies the constant, in milliseconds, used to calculate the total time-out period for write operations. For each write operation, this value is added to the product of the WriteTotalTimeoutMultiplier member and the number of bytes to be written.
A value of zero for both the WriteTotalTimeoutMultiplier and WriteTotalTimeoutConstant members indicates that total time-outs are not used for write operations.



Remarks

If an application sets ReadIntervalTimeout and ReadTotalTimeoutMultiplier to MAXDWORD and sets ReadTotalTimeoutConstant to a value greater than zero and less than MAXDWORD, one of the following occurs when the ReadFile function is called:

· If there are any characters in the input buffer, ReadFile returns immediately with the characters in the buffer.
· If there are no characters in the input buffer, ReadFile waits until a character arrives and then returns immediately.
· If no character arrives within the time specified by ReadTotalTimeoutConstant, ReadFile times out.
..
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
24.07.2009, 13:49  [ТС]
Это я все читал, если для ReadFile все понятно, и мне это не нужно, я сам таймауты нужные выдерживаю.
То с WriteFile не могу понять смысл этих параметров и в зависимости от чего они должны настраиваться.

Добавлено через 4 часа 58 минут 6 секунд
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
установить таймауты COMMTIMEOUTS , SetCommTimeouts
Конечно спасибо за ответ, поставил, пока работает, посмотрим надолго ли.

Но может кто то объяснит реально что это за параметры для записи, и чем нужно руководствоваться при их задании? Или этого никто даже не знает?
0
 Аватар для Airhand
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
25.07.2009, 13:04
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Но может кто то объяснит реально что это за параметры для записи, и чем нужно руководствоваться при их задании? Или этого никто даже не знает?
Это таймауты записи в компорт. Их нужно устанавливать, чтобы система знала какими порциями ты отправляеш данные в порт. Их же ещё кто-то должен читать. А как он будет читать неизвестно что. Ты когда читаеш, система устанавливает эти значения по-умолчанию. А вообще, нужно вызывать COMTIMEOUTS и для чтения.
1
SquirrelV
14.05.2011, 19:54
Всем привет, у меня назрела следующая проблема
пытаюсь работать с COM портом через VC++
CreateFile - отрабатывает хорошо
WriteFile(m_hCom, &sBuff, sizeof(sBuff), &dwHasWrite, &ov); - отказывает хоть что нибудь записывать, возвращает 0, и dwHasWrite тоже 0
соединяюсь с COM1, на нем висит MAX232, RX и TX между собой замкнуты.
HyperTerminal работает с ним прекрасно (то есть эхо проходит нормально)

Код:

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
133
134
135
136
    DWORD   dwRC;
    DWORD   dwError;
    char    sMsg[512];
 
 
    strcpy(m_sComPort, "\\\\.\\COM1");
 
    DCB  m_dcb; 
    COMMTIMEOUTS m_CommTimeouts;
 
 
    m_bPortReady = TRUE; // всё OK
 
    m_hCom = CreateFile(m_sComPort, 
        GENERIC_READ | GENERIC_WRITE,
        0, // экслюзивно занимаем порт
        NULL, // no security
        OPEN_EXISTING,
        0, // no overlapped I/O
        NULL); // null template
 
 
    if (m_hCom == INVALID_HANDLE_VALUE)
    {
        m_bPortReady = FALSE;
        dwError = GetLastError();
        
        // обработка ошибки
        LPVOID lpMsgBuf;
        lpMsgBuf = NULL;
        dwRC = FormatMessage( 
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM | 
            FORMAT_MESSAGE_IGNORE_INSERTS,
             NULL,
            dwError, //  из GetLastError(),
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 
            (LPTSTR) &lpMsgBuf,
            0,
            NULL);
        
        if (dwRC && lpMsgBuf)
        {
            sprintf(sMsg, "COM open failed: Port=%s Error=%d - %s",
                m_sComPort, dwError, lpMsgBuf);
            AfxMessageBox(sMsg);
        }
        else
        {
            sprintf(sMsg, "COM open failed: Port=%s Error=%d ",
                m_sComPort, dwError);
            AfxMessageBox(sMsg);
        } // end if
        if (dwRC && lpMsgBuf)
        {
            LocalFree( lpMsgBuf );
        } // end if
 
    } // end if
 
    if (m_bPortReady)
    {
        m_bPortReady = SetupComm(m_hCom, 
                128, 128); // размер буфера
        if (!m_bPortReady)
        {
            dwError = GetLastError();
            sprintf(sMsg, "SetupComm failed: Port=%s Error=%d",
                m_sComPort, dwError);
            AfxMessageBox(sMsg);
            
        } // end if
    } // end if
 
    if (m_bPortReady)
    {
        m_bPortReady = GetCommState(m_hCom, &m_dcb);
        if (!m_bPortReady)
        {
            dwError = GetLastError();
            sprintf(sMsg, "GetCommState failed: Port=%s Error=%d",
                m_sComPort, dwError);
            AfxMessageBox(sMsg);
        } // end if
    } // end if
 
    if (m_bPortReady)
    {
        m_dcb.BaudRate = 9600;
        m_dcb.ByteSize = 8;
        m_dcb.Parity = NOPARITY;
        m_dcb.StopBits = ONESTOPBIT;
        m_dcb.fAbortOnError = TRUE;
 
        m_bPortReady = SetCommState(m_hCom, &m_dcb);
        if (!m_bPortReady)
        {
            dwError = GetLastError();
            sprintf(sMsg, "SetCommState failed: Port=%s Error = %d",
                m_sComPort, dwError);
            AfxMessageBox(sMsg);
        }
    } // end if
 
    if (m_bPortReady)
    {
        m_bPortReady = GetCommTimeouts (m_hCom, &m_CommTimeouts);
        if (!m_bPortReady)
        {
            dwError = GetLastError();
            sprintf(sMsg, "GetCommTimeouts failed: Port=%s Error = %d",
                m_sComPort, dwError);
            AfxMessageBox(sMsg);
        } // end if
    } // end if
 
    if (m_bPortReady)
    {
        m_CommTimeouts.ReadIntervalTimeout = 50;
        m_CommTimeouts.ReadTotalTimeoutConstant = 50;
        m_CommTimeouts.ReadTotalTimeoutMultiplier = 10;
        m_CommTimeouts.WriteTotalTimeoutConstant = 50;
        m_CommTimeouts.WriteTotalTimeoutMultiplier = 10;
        m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts);
        if (!m_bPortReady)
        {
            dwError = GetLastError();
            sprintf(sMsg, "SetCommTimeouts failed: Port=%s Error = %d",
                m_sComPort, dwError);
            AfxMessageBox(sMsg);
        } // end if
    } // end if
 
    strcpy(sBuff,"123");
    OVERLAPPED ov;
    int ret = WriteFile(m_hCom, &sBuff, sizeof(sBuff), &dwHasWrite, &ov);

Кто нибудь натыкался на такую проблему? (гуглю уже 5-й час, ничего путнего)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.05.2011, 19:54
Помогаю со студенческими работами здесь

Гуру Си, подскажите по записи в порт STM32
Волею судеб вышло так, что 16-ти битное слово не могу выводить в один порт, железо подключено к двум разным портам. 3 бита выводится в порт...

Порт Ввода-вывода, ошибка записи в файл?
Суть такова: прога принимает файлы по TCP. В серверной части испл.порт ввода-вывода (CreateIoCompletionPort, GetQueuedCompletionStatus),...

Распараллелить потоки при чтении и записи в serial порт
Всем привет! Подскажите с типичной задачей. Я в цикле (в идеале в бесконечном) читаю команды из сериал порта (3 команды мне нужно...

Открыть порт 4444 в брэндмауэре. Антивируса нет. провайдером порт открыт
Подскажите как открыть данный порт,все делал как тут http://windows.microsoft.com/ru-ru/windows/open-port-windows-firewall#1TC=windows-7....

В конфигурационном файле прописан порт, но пишет ошибку порт 80 занят другим приложением
Здравствуйте. Пишу решение с 2 проектами - сервер и клиент с дуплексным контрактом. Служба запускается нормально. Когда же запускаю...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru