Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/68: Рейтинг темы: голосов - 68, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 13
1

Ошибка при работе с com портом: "Не возможно открыть последовательный порт"

19.11.2012, 22:54. Показов 12692. Ответов 14
Метки нет (Все метки)

Помогите пожалуйста, не могу понять в чем причина. Написал программу открытия com порта, а она выдает "Не возможно открыть последовательный порт".
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
#pragma hdrstop
#include <windows.h>
#include "Unit1.h"
#include <conio.h>
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   HANDLE port;
   DCB dcb;
   port=CreateFileA("COM10",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
   if(port==INVALID_HANDLE_VALUE) {
      Memo1->Lines->Add("Не возможно открыть последовательный порт");
      ExitProcess(1);
   }
   CloseHandle(port);
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2012, 22:54
Ответы с готовыми решениями:

Ошибка при работе с ини файлами когда разделителем является не "=", а ":"
Всем привет. Такая проблема имеются файлы &quot;.ini&quot; в них разделителем является не знак &quot;=&quot;, а...

Подключение USB CDC Device. Не могу открыть СОМ-порт. Ошибка: ".устройство не работает"
Всем здравствуйте! Пишу программу на C# под Win7 в Visual Studio 2013. Требуется подключить...

Ошибка при сборке пустого проекта: "не удается открыть файл "shell32.lib"
Добрый день! Вчера установил Qt Creator последней версии. Создал пустое &quot;Приложение QT Widgets&quot;,...

При создании ярлыка ошибка "Создание ярлыка не возможно, Возможно нет места на диске"
При создании ярлыка на рабочем столе любого приложения, появляется окно с надписью &quot;Создание ярлыка...

14
468 / 317 / 29
Регистрация: 15.08.2011
Сообщений: 995
20.11.2012, 19:50 2
Цитата Сообщение от Snikersman Посмотреть сообщение
Помогите пожалуйста, не могу понять в чем причина. Написал программу открытия com порта, а она выдает "Не возможно открыть последовательный порт".
Либо в системе нету СОМ10, либо он занят другим процессом.
0
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 13
22.11.2012, 12:54  [ТС] 3
Спасибо, коп порт глючил.
0
129 / 112 / 39
Регистрация: 27.09.2012
Сообщений: 305
22.11.2012, 13:31 4
Цитата Сообщение от Snikersman Посмотреть сообщение
Спасибо, коп порт глючил.
Просто то, как ты написал наименование порта - непременимо. Так можно только для COM1-COM9;
Надо так:
"\\\\.\\COM%d"
2
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 7
01.02.2015, 23:33 5
Цитата Сообщение от Antiplayer Посмотреть сообщение
Просто то, как ты написал наименование порта - непременимо. Так можно только для COM1-COM9;
Надо так:
"\\\\.\\COM%d"
А можно пояснить подробнее? У меня схожая задача: при инициализации программа должна определить имеющиеся в системе компорты и вывести их имена на кнопки, чтобы дать возможность юзеру выбрать для связи один из них. Сейчас корректно определяются порты с 1 по 9, остальные не видны. Делаю так:

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
  int btn_num = 1;  // текущий номер кнопки выбора порта
  int port_num = 1;
  while ( port_num <= 256 )
   {
    AnsiString p1 = IntToStr ( port_num );
    char port_name [8] = "COM";
    strcat ( port_name, p1.c_str());
    hCom = OpenComm( port_name, baud1 );
    if( hCom != INVALID_HANDLE_VALUE )
     {
      CloseHandle( hCom );
      if( btn_num == 1 )// RadioButton1->Enabled == false )
       {
        RadioButton1->Enabled = true;
        RadioButton1->Checked = true;
        RadioButton1->Caption = port_name;
       }
      if( btn_num == 2 )// RadioButton2->Enabled == false )
       {
        RadioButton2->Enabled = true;
        RadioButton2->Caption = port_name;
       }
      if( btn_num == 3 )// RadioButton3->Enabled == false )
       {
        RadioButton3->Enabled = true;
        RadioButton3->Caption = port_name;
       }
      if( btn_num == 4 )// RadioButton4->Enabled == false )
       {
        RadioButton4->Enabled = true;
        RadioButton4->Caption = port_name;
       }
      btn_num ++;
     }
     if( btn_num > 4 ) break;
     port_num ++;
   }
Что нужно исправить, чтобы определялись все порты ,а не только СОМ1 - COM9?
Заранее благодарен за совет.
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 7
03.02.2015, 21:53 6
Разобрался сам. Проверил, все порты определяются и работают корректно от COM1 до COM256. Если кому интересно, код получился такой:

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
  int btn_num = 1;  // òåêóùèé íîìåð êíîïêè âûáîðà ïîðòà
  int port_num = 1; // òåêóùèé íîìåð îïðàøèâàåìîãî ïîðòà
  while ( port_num <= 256 )
   {
    AnsiString p1 = IntToStr ( port_num );
    AnsiString port_name = "\\\\.\\COM";
    port_name += p1;
    //strcat ( port_name, p1.c_str());
    hCom = OpenComm( port_name.c_str(), baud1 );
    if( hCom != INVALID_HANDLE_VALUE )
     {
      CloseHandle( hCom );
      if( btn_num == 1 )// RadioButton1->Enabled == false )
       {
        RadioButton1->Enabled = true;
        RadioButton1->Checked = true;
        RadioButton1->Caption = port_name.SubString(5, 7);
       }
      if( btn_num == 2 )// RadioButton2->Enabled == false )
       {
        RadioButton2->Enabled = true;
        RadioButton2->Caption = port_name.SubString(5, 7);
       }
      if( btn_num == 3 )// RadioButton3->Enabled == false )
       {
        RadioButton3->Enabled = true;
        RadioButton3->Caption = port_name.SubString(5, 7);
       }
      if( btn_num == 4 )// RadioButton4->Enabled == false )
       {
        RadioButton4->Enabled = true;
        RadioButton4->Caption = port_name.SubString(5, 7);
       }
      btn_num ++;
     }
     if( btn_num > 4 ) break;
     port_num ++;
   }
Единственное, чего я не понял - почему SubString нужно брать с 5-й позиции, чтобы вывести имя порта на кнопку без предваряющих символов. По логике должно быть с 7-й позиции.
0
случайный прохожий
1516 / 1018 / 374
Регистрация: 20.07.2013
Сообщений: 2,954
04.02.2015, 17:22 7
Потому что, как подозреваю, не нужно забывать про экранирующие слеши.
Пусть меня поправят, если ошибаюсь или не так понял проблему.
P.S.: и зачем ты выводишь по 7 символов? У тебя получается вроде как максимум 6. Или для совместимости с вариантом вплоть до COM9999?
0
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 7
04.02.2015, 19:46 8
и зачем ты выводишь по 7 символов? У тебя получается вроде как максимум 6. Или для совместимости с вариантом вплоть до COM9999?
ну как же, а символ конца строки?
0
случайный прохожий
1516 / 1018 / 374
Регистрация: 20.07.2013
Сообщений: 2,954
04.02.2015, 20:46 9
А есть ли он в данном случае?
0
Я Фоюмчанин ? дааааа)
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
04.02.2015, 21:01 10
Цитата Сообщение от gunslinger Посмотреть сообщение
А есть ли он в данном случае?
зачем же гадать? дебагом посмотрите и все.
0
случайный прохожий
1516 / 1018 / 374
Регистрация: 20.07.2013
Сообщений: 2,954
04.02.2015, 23:19 11
Насколько помню, (Ansi)String не имеет "признака" конца строки.
Скорее какой-нибудь char * (но тут я могу жутко тупить).
И отладчиком редко пользуюсь. Попросту он мне не нужен (для задач, которые решаю) - я лучше головой подумаю, где скрывается проблема. Больше толку для общего развития, а так как деньги кодом не зарабатываю, то ограничения во времени не имею и дополнительные "фичи" для ускорения процесса не требуются (как правило).
0
Я Фоюмчанин ? дааааа)
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
04.02.2015, 23:55 12
gunslinger, В C++Builder тип строк AnsiString реализован как класс, объявленный в файле vcl/dstring.h и аналогичный типу длинных строк в Delphi - это строки с нулевым символом в конце.
1
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 7
05.02.2015, 00:10 13
Вот меня тоже одолели сомнения насчёт признака конца строки в AnsiString. Вроде бы есть явные указания на его отсутствие, но я погуглил и получил ПРОТИВОРЕЧИВЫЕ ответы на этот вопрос.
Но поскольку метод SubString не генерирует никаких исключений, можно задавать длину конечной строки с запасом - работает, проверено. Иначе строки "COM1" и "COM256", отличающиеся длиной на 2 символа, не обрабатывались бы одинаково.
0
Почетный модератор
Эксперт С++
5843 / 2853 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
05.02.2015, 09:43 14
AnsiString это не просто обертка над массивом чаров, это мощнейшая штука, которая даже кофе варит. И детей в школу собирает.
Символ конца строки ему не требуется. Взамен у него есть метод, определяющий количество символов: Length.
Но если так хочется проверить наличие пустого символа в конце, то пожалуйста:
C++
1
2
3
4
5
6
7
8
9
10
AnsiString str = "a1", str2 = "b2";
 
char *pdata = (char*)str.data(); // Берем прям самые сырые данные
 
int length = str.Length(); 
 
if( *(pdata + length) == '\0' )
  ShowMessage( "Пустой символ в конце есть." );
 
//ShowMessage( (int)*(pdata + length) );
P.S. Вот здесь можете почитать еще интересного: Сконвертить PCHAR в AnsiString
0
Я Фоюмчанин ? дааааа)
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
05.02.2015, 10:21 15
SatanaXIII, к чему заморочки?
Я же говорю дебагом проще и быстрее:Название: Безымянный.png
Просмотров: 153

Размер: 2.7 Кб
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2015, 10:21

Ошибка при работе со списком: "Сбой при преобразовании в COFF: Файл недопустим или поврежден"
struct stud { int data; stud *prev; // Указатель на предыдущую запись stud *next; //...

Ошибка при работе с OpenCV: "нарушение прав доступа при чтении по адресу"
Привет, всем:-) Имеется следующий код: #include &lt;opencv2/core/core.hpp&gt; #include...

Ошибка при работе программы " list index out of bounds 0"
при запуске программы.а именно при нажатии на кнопку выдает ошибку list index out of bounds 0 ...

Ошибка "неопределенная ссылка" при работе с std::thread
При попытке сделать что-либо с std::thread, выдает ошибку компиляции, &quot;неопределенная ссылка &quot; . ...


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

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

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