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

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

19.11.2012, 22:54. Просмотров 3285. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2012, 22:54
Ответы с готовыми решениями:

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

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

Появляется ошибка "Unable to open file 'C0W32.OBJ'" при работе с двумя формами
При работе с двумя формами выдает следующее: Fatal: Unable to open file...

Открыть папку "мой компьютер", "панель управления", "program files"
Нужно открыть папку &quot;мой компьютер&quot;, &quot;панель управления&quot;, &quot;program files&quot;

Ошибка при компиляции: "E2275 { expected" и "E2040 Declaration terminated incorrectly"
Здравствуйте! При компиляции выдает такую ошибку: C++ Error] Unit1.cpp(12):...

14
paskal
450 / 299 / 28
Регистрация: 15.08.2011
Сообщений: 922
20.11.2012, 19:50 2
Цитата Сообщение от Snikersman Посмотреть сообщение
Помогите пожалуйста, не могу понять в чем причина. Написал программу открытия com порта, а она выдает "Не возможно открыть последовательный порт".
Либо в системе нету СОМ10, либо он занят другим процессом.
0
Snikersman
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 13
22.11.2012, 12:54  [ТС] 3
Спасибо, коп порт глючил.
0
Antiplayer
69 / 66 / 21
Регистрация: 27.09.2012
Сообщений: 202
22.11.2012, 13:31 4
Цитата Сообщение от Snikersman Посмотреть сообщение
Спасибо, коп порт глючил.
Просто то, как ты написал наименование порта - непременимо. Так можно только для COM1-COM9;
Надо так:
"\\\\.\\COM%d"
2
sky14
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
sky14
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
gunslinger
случайный прохожий
1325 / 840 / 330
Регистрация: 20.07.2013
Сообщений: 2,375
04.02.2015, 17:22 7
Потому что, как подозреваю, не нужно забывать про экранирующие слеши.
Пусть меня поправят, если ошибаюсь или не так понял проблему.
P.S.: и зачем ты выводишь по 7 символов? У тебя получается вроде как максимум 6. Или для совместимости с вариантом вплоть до COM9999?
0
sky14
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 7
04.02.2015, 19:46 8
и зачем ты выводишь по 7 символов? У тебя получается вроде как максимум 6. Или для совместимости с вариантом вплоть до COM9999?
ну как же, а символ конца строки?
0
gunslinger
случайный прохожий
1325 / 840 / 330
Регистрация: 20.07.2013
Сообщений: 2,375
04.02.2015, 20:46 9
А есть ли он в данном случае?
0
ivan.-94
Я Фоюмчанин ? дааааа)
209 / 200 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
04.02.2015, 21:01 10
Цитата Сообщение от gunslinger Посмотреть сообщение
А есть ли он в данном случае?
зачем же гадать? дебагом посмотрите и все.
0
gunslinger
случайный прохожий
1325 / 840 / 330
Регистрация: 20.07.2013
Сообщений: 2,375
04.02.2015, 23:19 11
Насколько помню, (Ansi)String не имеет "признака" конца строки.
Скорее какой-нибудь char * (но тут я могу жутко тупить).
И отладчиком редко пользуюсь. Попросту он мне не нужен (для задач, которые решаю) - я лучше головой подумаю, где скрывается проблема. Больше толку для общего развития, а так как деньги кодом не зарабатываю, то ограничения во времени не имею и дополнительные "фичи" для ускорения процесса не требуются (как правило).
0
ivan.-94
Я Фоюмчанин ? дааааа)
209 / 200 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
04.02.2015, 23:55 12
gunslinger, В C++Builder тип строк AnsiString реализован как класс, объявленный в файле vcl/dstring.h и аналогичный типу длинных строк в Delphi - это строки с нулевым символом в конце.
1
sky14
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 7
05.02.2015, 00:10 13
Вот меня тоже одолели сомнения насчёт признака конца строки в AnsiString. Вроде бы есть явные указания на его отсутствие, но я погуглил и получил ПРОТИВОРЕЧИВЫЕ ответы на этот вопрос.
Но поскольку метод SubString не генерирует никаких исключений, можно задавать длину конечной строки с запасом - работает, проверено. Иначе строки "COM1" и "COM256", отличающиеся длиной на 2 символа, не обрабатывались бы одинаково.
0
SatanaXIII
Почетный модератор
Эксперт С++
5779 / 2777 / 380
Регистрация: 01.11.2011
Сообщений: 6,757
Завершенные тесты: 1
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
ivan.-94
Я Фоюмчанин ? дааааа)
209 / 200 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
05.02.2015, 10:21 15
SatanaXIII, к чему заморочки?
Я же говорю дебагом проще и быстрее:Название: Безымянный.png
Просмотров: 100

Размер: 2.7 Кб
1
05.02.2015, 10:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2015, 10:21

Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add")
При использовании следующего кода: Word =...

Почему "тормозит" XE6 при работе с Android-ом?
Уважаемые эксперты! Не могу понять, почему так &quot;тормозит&quot; RAD Studio XE6 при...

Что обозначает сообщение "Плавающая точка переполнения". При работе со СТРИНГРИД
Здравствуйте Форумчани. Всех с прошедшим летом. Начинаем работать. Тема...


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

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

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