Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ Builder

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Snikersman
0 / 0 / 0
Регистрация: 22.04.2012
Сообщений: 13
#1

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

19.11.2012, 22:54. Просмотров 3049. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка при работе с com портом: "Не возможно открыть последовательный порт" (C++ Builder):

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

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

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

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

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

Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") - C++ Builder
При использовании следующего кода: Word = CreateOleObject(&quot;Word.Application.8&quot;); Word.OlePropertySet(&quot;Visible&quot;, true); ...

14
paskal
450 / 299 / 28
Регистрация: 15.08.2011
Сообщений: 911
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
51 / 51 / 8
Регистрация: 27.09.2012
Сообщений: 171
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
случайный прохожий
1179 / 797 / 207
Регистрация: 20.07.2013
Сообщений: 2,239
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
случайный прохожий
1179 / 797 / 207
Регистрация: 20.07.2013
Сообщений: 2,239
04.02.2015, 20:46 #9
А есть ли он в данном случае?
0
ivan.-94
Я Фоюмчанин ? дааааа)
209 / 200 / 13
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
04.02.2015, 21:01 #10
Цитата Сообщение от gunslinger Посмотреть сообщение
А есть ли он в данном случае?
зачем же гадать? дебагом посмотрите и все.
0
gunslinger
случайный прохожий
1179 / 797 / 207
Регистрация: 20.07.2013
Сообщений: 2,239
04.02.2015, 23:19 #11
Насколько помню, (Ansi)String не имеет "признака" конца строки.
Скорее какой-нибудь char * (но тут я могу жутко тупить).
И отладчиком редко пользуюсь. Попросту он мне не нужен (для задач, которые решаю) - я лучше головой подумаю, где скрывается проблема. Больше толку для общего развития, а так как деньги кодом не зарабатываю, то ограничения во времени не имею и дополнительные "фичи" для ускорения процесса не требуются (как правило).
0
ivan.-94
Я Фоюмчанин ? дааааа)
209 / 200 / 13
Регистрация: 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
Супер-модератор
Эксперт С++
5694 / 2749 / 258
Регистрация: 01.11.2011
Сообщений: 6,710
Завершенные тесты: 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 / 13
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
05.02.2015, 10:21 #15
SatanaXIII, к чему заморочки?
Я же говорю дебагом проще и быстрее:Название: Безымянный.png
Просмотров: 98

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

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

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

Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd" - C++
вот код, нужно найти 3 минимальных положительных числа в массиве. При размере массива больше 950 в конце заполнения рандомным способом...

При первом ходе в игре "города" возникает ошибка при считывании пустого Edit - C++ Builder
Есть код... Игра &quot;города&quot;... этот код проверяет схожи ли последняя буква в 1 слове и последняя во 2. void Bred::find(char a, char b) ...


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

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

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