Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
krv
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
1

Ошибка при закрытии и переоткрытии COM порта

14.02.2019, 16:19. Просмотров 272. Ответов 1
Метки нет (Все метки)

Доброго времени суток!
Может быть кто сталкивался...
Использую для работы с COM портами код в потоках, взятый из
Работа с COM-портом с помощью потоков

Код отлично работает, если в качестве порта использую MOXA порт.
а вот когда поставил драйвер ICPCON i-7565 (переходник на CAN)
получается непонятная ошибка.

При первом открытии порта после запуска программы он открывается корректно.
После чего закрываю его.
При повторном открытии функция CreateFile возвращает INVALID_HANDLE_VALUE
Лечится это дело закрытием программы и повторным её запуском, но опять же один раз.
Повторюсь. При использовании Моксы таких проблем не наблюдалось - всё работает корректно.
На всяк случай приведу код функций открытия закрытия порта
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
void __fastcall TComPort::ComOpen()
{
  DCB dcb;                                                                    //структура для общей инициализации порта DCB
  COMMTIMEOUTS timeouts;                                                      //структура для установки таймаутов
  //открыть порт, для асинхронных операций обязательно  нужно указать флаг FILE_FLAG_OVERLAPPED
  ComError = 0;
  gct_COMport = CreateFile(FNamePort.c_str(),GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
  //здесь:
  // - NamePort.t_str() - имя порта в качестве имени файла, t_str() преобразует строку типа String в строку в виде массива типа char, иначе функция не примет
  // - GENERIC_READ | GENERIC_WRITE - доступ к порту на чтение/записть
  // - 0 - порт не может быть общедоступным (shared)
  // - NULL - дескриптор порта не наследуется, используется дескриптор безопасности по умолчанию
  // - OPEN_EXISTING - порт должен открываться как уже существующий файл
  // - FILE_FLAG_OVERLAPPED - этот флаг указывает на использование асинхронных операций
  // - NULL - указатель на файл шаблона не используется при работе с портами
  if(gct_COMport == INVALID_HANDLE_VALUE) //если ошибка открытия порта
  {
    //обработать ошибку открытия порта
    ComError = erIHV;
    return;
  }
  //инициализация порта
  dcb.DCBlength = sizeof(DCB);                                                //в первое поле структуры DCB необходимо занести её длину, она будет использоваться функциями настройки порта для контроля корректности структуры
  //считать структуру DCB из порта
  if(!GetCommState(gct_COMport, &dcb))                                            //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
  {
    ComClose();
    ComError = erGetDBC;
    return;
  }
  //инициализация структуры DCB
  dcb.BaudRate = Fspeed;                                         //задаём скорость передачи 115200 бод
  dcb.fBinary = TRUE;                                                         //включаем двоичный режим обмена
  dcb.fOutxCtsFlow = FALSE;                                                   //выключаем режим слежения за сигналом CTS
  dcb.fOutxDsrFlow = FALSE;                                                   //выключаем режим слежения за сигналом DSR
  dcb.fDtrControl = DTR_CONTROL_DISABLE;                                      //отключаем использование линии DTR
  dcb.fDsrSensitivity = FALSE;                                                //отключаем восприимчивость драйвера к состоянию линии DSR
  dcb.fNull = FALSE;                                                          //разрешить приём нулевых байтов
  dcb.fRtsControl = RTS_CONTROL_DISABLE;                                      //отключаем использование линии RTS
  dcb.fAbortOnError = FALSE;                                                  //отключаем остановку всех операций чтения/записи при ошибке
  dcb.ByteSize = Fsize;                                                           //задаём 8 бит в байте
  dcb.Parity = Fparity;                                                             //отключаем проверку чётности
  dcb.StopBits = Fstop;                                                           //задаём один стоп-бит
  //загрузить структуру DCB в порт
  if(!SetCommState(gct_COMport, &dcb))                                            //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
  {
    ComClose();
    ComError = erSetDBC;
    return;
  }
  //установить таймауты
  timeouts.ReadIntervalTimeout = 0;                                           //таймаут между двумя символами
  timeouts.ReadTotalTimeoutMultiplier = 0;                                    //общий таймаут операции чтения
  timeouts.ReadTotalTimeoutConstant = 0;                                      //константа для общего таймаута операции чтения
  timeouts.WriteTotalTimeoutMultiplier = 0;                                   //общий таймаут операции записи
  timeouts.WriteTotalTimeoutConstant = 0;                                     //константа для общего таймаута операции записи
  //записать структуру таймаутов в порт
  if(!SetCommTimeouts(gct_COMport, &timeouts))                                    //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
  {
    ComClose();
    ComError = erTO;
    return;
  }
  //установить размеры очередей приёма и передачи
  SetupComm(gct_COMport,2000,2000);
  PurgeComm(gct_COMport, PURGE_RXCLEAR);                                          //очистить принимающий буфер порта
  ComRead = new TComReadThread(false);                                         //создать и запустить поток чтения байтов
  ComRead->FreeOnTerminate = true;                                         //установить это свойство потока, чтобы он автоматически уничтожался после завершения
  IsOpen = true;
}
 
void __fastcall TComPort::ComClose()
{
    if(ComWrite) ComWrite->Terminate();                                 //если поток записи работает, завершить его; проверка   if(writer) обязательна, иначе возникают ошибки
    Sleep(50);
    if(ComRead) ComRead->Terminate();                                   //если поток чтения работает, завершить его; проверка   if(reader) обязательна, иначе возникают ошибки
    Sleep(100);
    CloseHandle(gct_COMport); //закрыть порт
    gct_COMport=0; //обнулить переменную для дескриптора порта
    IsOpen = false;
}
Что такое добавить в функцию закрытия порта, что, возможно, делается при закрытии программы?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2019, 16:19
Ответы с готовыми решениями:

Ошибка при закрытии
Здравствуйте. Много писать не буду просто: При закрытии билдера выскакивает это и в дальнейшем...

Ошибка при закрытии приложения
Доброго времени суток! Подскажите пожалуйста, в чем проблема. При закрытии приложения (при debug)...

Ошибка при закрытии приложения
Пишу курсовик на С++Builder 2007. При закрытии приложения возникает ошибка: Приложении имеет...

ошибка при закрытии билдер 6
закрываю билдер 6 и обычно он после этого выдает ошибку: Инструкция по адресу 0х40009009...

При закрытии формы появляется ошибка.
Ошибка при попытке наследования cpp-файл: #include <vcl.h> #pragma hdrstop #include "BTN.h"...

1
Avazart
Эксперт С++
7922 / 5742 / 569
Регистрация: 10.12.2010
Сообщений: 26,288
Записей в блоге: 17
16.02.2019, 22:02 2
Хорош г*вномутить используй компонент TBComPort

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2019, 22:02

Ошибка при закрытии DataSet в С++ Builder
Здраствуйте. Кто-нибудь может подсказать по какой причине может возникать ошибка при работе с...

Ошибка при закрытии программы в компиляторе, из-за TMediaPlayer
Программа сама по себе запускается и завершается без ошибок. Но стоит мне открыть аудио файл в...

QSerialPort зависает при попытки закрытии порта
Доброго времени суток! ПО: Qt 5.3.2, Mingw 4.8.2, windows 7 32бит. Подключаемое устройство USB...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru