C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Список портов  (Прочитано 62222 раз)
Лена
Гость
« : 16 Апрель 2008, 19:12:49 »

Работа с железом полные дебри. Подмигивающий
Вот так получаю список портов:
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE port;
int i;
AnsiString S = "";
SetLastError(0);
i = 1;
while (1)
{
S = "COM" + IntToStr(i);
port=CreateFile(S.c_str(),GENERIC_READ|GENERIC_WRITE,
                0,NULL,OPEN_EXISTING,0,NULL);
if(GetLastError() == 0)
{
 ComboBox1->Items->Add("COM" + IntToStr(i));
 i++;
 CloseHandle(port);
}
else break;
}
ComboBox1->ItemIndex = 0;
}
 

Вижу в ComboBox1 запись COM1. Действительно есть один свободный порт.
Вопрос такой: а монитор он же тоже включен в СОМ порт, почему же в списке только один порт а не два? Улыбка
Записан
VerZer
Участник
**

Сказали спасибо: +92/-10
Offline Offline

Сообщений: 1138


« Ответ #1 : 16 Апрель 2008, 19:27:49 »

хыы Улыбка
монитор включен не в COM порт)
Записан
Лена
Гость
« Ответ #2 : 16 Апрель 2008, 19:28:54 »

А этот код показал, что у меня 16 штук портов:
Код
TRegistry* Reg = new TRegistry;
TStringList *List = new TStringList;
int i;
AnsiString w;
 
Reg->RootKey = HKEY_LOCAL_MACHINE;
Reg->OpenKey("HARDWARE\\DEVICEMAP\\SERIALCOMM", false);
Reg->GetValueNames(List);
for (i = 0; i< List->Count; i++)
{
w= Reg->ReadString(List->Strings[i]).SetLength(3);
if (w.SetLength(3) == "COM")
   ComboBox1->Items->Add(Reg->ReadString(List->Strings[i]));
}
List->Free();
Reg->CloseKey();
Reg->Free();
 
ComboBox1->ItemIndex = 0;
 
Шокирован
Записан
Лена
Гость
« Ответ #3 : 16 Апрель 2008, 19:31:32 »

Поскольку оба кода показывают порт с именем СОМ1. Буду пологать, что мой свободный порт взади компа и есть этот самый СОМ1 и с ним надо работать. Правильно? Непонимающий
Записан
VerZer
Участник
**

Сказали спасибо: +92/-10
Offline Offline

Сообщений: 1138


« Ответ #4 : 16 Апрель 2008, 19:36:15 »

ага
остальные виртуальные
Записан
Лена
Гость
« Ответ #5 : 16 Апрель 2008, 21:01:32 »

В документации к прибору, присоединенному к СОМ сказано, что он общается на скорости 57600. Я своим кодом вижу, что скорость моего СОМ порта 4800. Мне, что надо принудительно установить скорость 57600 порту, потому что код ниже ничего не возвращает из порта:
Код
TForm1 *Form1;
HANDLE port;
TDCB lpDCB;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------
//cначала нажимаю кнопку
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ComboBox1->Clear();
int i;
AnsiString S = "";
SetLastError(0);
i = 1;
while (1)
{
 S = "COM" + IntToStr(i);
 port=CreateFile(S.c_str(),GENERIC_READ|GENERIC_WRITE,
                 0,NULL,OPEN_EXISTING,0,NULL);
 if(GetLastError() == 0)
 {
  ComboBox1->Items->Add("COM" + IntToStr(i));
  i++;
  CloseHandle(port);
  Button3->Enabled = true;
 }
 else break;
}
ComboBox1->ItemIndex = 0;
port = 0;
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if (port != 0)
  CloseHandle(port);
 
}
//---------------------------------------------------------------------------
//вижу параметры порта
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 if (port == 0)
    port = CreateFile(ComboBox1->Text.c_str(),
                      GENERIC_READ | GENERIC_WRITE, 0,
                      NULL, OPEN_EXISTING, 0, 0);
 
if(! GetCommState(port, &lpDCB))
{
 ShowMessage("Не удалось открыть порт " + ComboBox1->Text);
 exit;
}
//комбобоксы
CBBaudRate->ItemIndex = CBBaudRate->Items->IndexOf(IntToStr(lpDCB.BaudRate));
CBParity->ItemIndex = lpDCB.Parity;
CBByteSize->ItemIndex = lpDCB.ByteSize - 4;
CBStopBits->ItemIndex = lpDCB.StopBits;
}
//---------------------------------------------------------------------------
//записываю в порт
void __fastcall TForm1::Button4Click(TObject *Sender)
{
AnsiString buf;
int n;
 
buf = "$ST+VERSION";
FlushFileBuffers(port);
WriteFile(port, buf.c_str(),
         strlen(buf.c_str()), &DWORD(n), NULL);
ShowMessage("Передано " + IntToStr(n) + " байт"); //вижу что ушло 11 байт
Button5->Enabled=true;
}
//---------------------------------------------------------------------------
 
//хочу прочитать ответ
void __fastcall TForm1::Button5Click(TObject *Sender)
{
AnsiString buf;
int n;
DWORD lpEvtMask;
SetCommMask(port, EV_RXCHAR);
WaitCommEvent(port, &lpEvtMask,NULL);  //тут зависание и нет ответа :(
ReadFile(port, buf.c_str(), 128, &DWORD(n), NULL);
ShowMessage("Принято " + IntToStr(n) + " байт: " + buf);
}
//---------------------------------------------------------------------------
 
 
Записан
Zor
Глобальный модератор
***

Сказали спасибо: +158/-30
Offline Offline

Сообщений: 2946


« Ответ #6 : 16 Апрель 2008, 21:13:26 »

ага, и скорость и прочие параметры устанавливать вручную, после открытия но до работы с портом.
и в Button1Click() у вас ошибка - порты могут идти не по порядку.
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #7 : 16 Апрель 2008, 21:24:00 »

Ставь библиотеку ComPort Library version 3.10   for Delphi 3, 4, 5, 6, 7, 2005, 2006  and C++ Builder 3, 4, 5, 6  by Dejan Crnila 1998-2002.

На вкладке Builder появятся дополнительные компоненты.
Там списки портов и скорость порта в виде ComboBox (и еще куча настроек для порта, по желанию). и писать код для этого не надо, все за тебя уже сделали (все интуитивно понятно), работает на ура. Я когда тестировал прогу (без устройства) то в качесте теста перегонял файл с компа на комп по двум проводкам, вставленным в СОМ порт. Синхронизируешь скорость, количество бит, бит четности и вперед.

Хочешь сократить время на разработку своей программы, тогда качай, если нет- то и суда нет.
« Последнее редактирование: 16 Апрель 2008, 21:34:57 от Nikita » Записан
bred
А моск есть?
Участник
**

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 387

Нет - это фантастика!


« Ответ #8 : 17 Апрель 2008, 09:58:57 »

2 Лена порты вы ищете немного не корректно. вы перебираете все порты порты подряд до тех пор пока они свободны и в случае если COM1 будет занят вы получите просто пустой список. Точно так же если у вас в системе 3 порта, устройство подключено к COM3, а на втором допустим висит мыша, то с помощью вашего кода вы не сможите выбрать COM3 - в списке будет отображен только COM1. могу предложить свой вариант, но у него тоже есть не достатки, во первых порты с номерами выше 9 не обнаруживает (там надо другую строку задавать, а мне было лень Строит глазки ) и я подозреваю что можно его упростить.
Код
//---------------------------------------------------------------------------
// create list acsessible port's
void __fastcall TMainForm::PortBtnClick(TObject *Sender)
{
 HANDLE ComPort = INVALID_HANDLE_VALUE;
 int ind = PortCBox->ItemIndex;
 PortCBox->Items->Clear();
 char buff[]="COM9";
 for(int i = 1;i<10;i++)
 {
  buff[3] = i+48;
  ComPort = CreateFile
                   (
                    buff,
                    GENERIC_READ | GENERIC_WRITE,
                    NULL,
                    NULL,
                    OPEN_EXISTING,
                    FILE_FLAG_OVERLAPPED,
                    NULL
                   );
 
 if(ComPort != INVALID_HANDLE_VALUE)
  {
   PortCBox->Items->Add(buff);
   CloseHandle(ComPort );
  }
}
if( (ind == -1)||( ind >= PortCBox->Items->Count) )
  PortCBox->ItemIndex = 0;
else
  PortCBox->ItemIndex = ind;
PortCBox->Tag = 0;
if ( PortCBox->Items->Text.IsEmpty() == true )
  {
   Application->MessageBoxA("Несоответствие конфигурации ПК",
               "Com-порты не обнаружены!",
               MB_ICONHAND|MB_OK);
   Application->Terminate();
  }
}
 
Для настройки параметров обмена с портом используйте функции BuildCommDCB и SetCommState. Кстати возможно еще следует покрутиь таймауты (SetCommTimeouts)
Записан
Rius
Давний друг
**

Сказали спасибо: +116/-5
Offline Offline

Сообщений: 753


WWW
« Ответ #9 : 17 Апрель 2008, 10:30:01 »

а чем не устраивает чтение из реестра HARDWARE\\DEVICEMAP\\SERIALCOMM ?
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #10 : 17 Апрель 2008, 10:38:01 »

а чем не устраивает чтение из реестра HARDWARE\\DEVICEMAP\\SERIALCOMM ?

лехких путей не ищем...
щас посоветуют взять паяльник и разобрать материнку, что бы убедиться в их наличии... а потом историю выучить Веселый
Записан
Лена
Гость
« Ответ #11 : 17 Апрель 2008, 10:48:59 »

а чем не устраивает чтение из реестра HARDWARE\\DEVICEMAP\\SERIALCOMM ?

Получение списка всех портов вопрос решенный.
В моем сообщении номер 2 я как раз и использую этот код - получаю 16 портов.
Мне не понятно какой номер у моего единственного свободного порта, который я вижу взади компьютера.
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #12 : 17 Апрель 2008, 10:51:46 »

а чем не устраивает чтение из реестра HARDWARE\\DEVICEMAP\\SERIALCOMM ?

Получение списка всех портов вопрос решенный.
В моем сообщении номер 2 я как раз и использую этот код - получаю 16 портов.
Мне не понятно какой номер у моего единственного свободного порта, который я вижу взади компьютера.

COM1
ЗЫ: обячно с девайсом поставляется какая либо аппликуха-тестер, в которой все настройки и пр. прописаны, можно посмотреть с какими портами и с какими значениями портов она работает и для отладки вбить жоско эти данные в свою программу, а потом уже париться со списками портов и их настроек
Записан
Asher
Администратор
***

Сказали спасибо: +111/-5
Offline Offline

Сообщений: 425


« Ответ #13 : 17 Апрель 2008, 10:54:26 »

Привет.
А этот код показал, что у меня 16 штук портов:
Сзади - Com1
а такая толпа виртуальных ...
BT модуль случаем на подключали?
Записан
bred
А моск есть?
Участник
**

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 387

Нет - это фантастика!


« Ответ #14 : 17 Апрель 2008, 11:13:27 »

а чем не устраивает чтение из реестра HARDWARE\\DEVICEMAP\\SERIALCOMM ?
Эта ветка дает вообще все порты, а мой код дает только свободные;)

ЗЫ: обычно с девайсом поставляется какая либо аппликуха-тестер, в которой все настройки и пр. прописаны, можно посмотреть с какими портами и с какими значениями портов она работает и для отладки вбить жоско эти данные в свою программу, а потом уже париться со списками портов и их настроек
Угу. а если сами эти девайсы разрабатываете? Подмигивающий тестовые поисковики как раз писать и придется Улыбка
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #15 : 17 Апрель 2008, 11:25:24 »

Угу. а если сами эти девайсы разрабатываете? Подмигивающий тестовые поисковики как раз писать и придется Улыбка

Насколько я понял, это сторонний девайс
ЗЫ: так вот почему советовали научиться паяльником орудовать! оказываеца он не только для получения информации нужен Улыбка
Записан
Rius
Давний друг
**

Сказали спасибо: +116/-5
Offline Offline

Сообщений: 753


WWW
« Ответ #16 : 17 Апрель 2008, 12:08:43 »

Цитировать
Эта ветка дает вообще все порты, а мой код дает только свободные;)
...и обернул программер баг в фичу...  Подмигивающий
Записан
BlackFox
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 271


« Ответ #17 : 17 Апрель 2008, 12:49:45 »

Цитировать
Эта ветка дает вообще все порты, а мой код дает только свободные;)
...и обернул программер баг в фичу...  Подмигивающий
точна  Веселый
Записан
bred
А моск есть?
Участник
**

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 387

Нет - это фантастика!


« Ответ #18 : 17 Апрель 2008, 14:07:22 »

Цитировать
Эта ветка дает вообще все порты, а мой код дает только свободные;)
...и обернул программер баг в фичу...  Подмигивающий
ну т.к. т.з. пишу себе я сам, то это просто реализация задачи из т.з.  Показывает язык

но вернемся к вопросам.
Мне не понятно какой номер у моего единственного свободного порта, который я вижу взади компьютера.
я вижу только один путь - опросить все свободные порты кидая какую-то команду понимаемую устройством. и там там где будет отклик тот порт нам и нужен.
Записан
Rius
Давний друг
**

Сказали спасибо: +116/-5
Offline Offline

Сообщений: 753


WWW
« Ответ #19 : 17 Апрель 2008, 17:49:46 »

...и по закону подлости на другом порту найдётся девайс, который воспримет вашу пробу как команду самоуничтожения...
одумайтесь, опрос подходит если стоит задачи автоматического определения, к какому из кучи портов подключен конкретно этот экзмемпляр из нашей кучи устройств;
иначе лучший путь - реестр Подмигивающий

также можно получить список через wmi, но примера для с++ у меня нет
Цитировать
Caption: Communications Port (COM1)
ClassGuid: {4D36E978-E325-11CE-BFC1-08002BE10318}
ConfigManagerErrorCode: 0
ConfigManagerUserConfig: False
CreationClassName: Win32_PnPEntity
Description: Communications Port
DeviceID: ACPI\PNP0501\1
Manufacturer: (Standard port types)
Name: Communications Port (COM1)
PNPDeviceID: ACPI\PNP0501\1   
Service: Serial
Status: OK
SystemCreationClassName: Win32_ComputerSystem
« Последнее редактирование: 17 Апрель 2008, 18:03:08 от Rius » Записан
Лена
Гость
« Ответ #20 : 17 Апрель 2008, 19:10:07 »

Скажите, а как проверить работоспособность порта? Достаточно ли записать в него настройки и если запись прошла успешно, то является ли это гарантийей того, что СОМ порт работоспособен как устройство?
Записан
Rius
Давний друг
**

Сказали спасибо: +116/-5
Offline Offline

Сообщений: 753


WWW
« Ответ #21 : 17 Апрель 2008, 19:16:13 »

нет. мне встречался случай, когда с одними дровами usb-rs232 работал с девайсом, а с другими нет, хотя и так и так порт в системе находился.
Записан
Лена
Гость
« Ответ #22 : 17 Апрель 2008, 19:32:02 »

Замучал меня прибор подключенный к СОМ порту.  Строит глазки
В документации сказано, что скорость обмена 57600. Установила. Шлю команду, которая указана для первичного тестирования $ST+TEST. Команда уходит, мой код показывает, что команда ушла (рис). Код отправки/получения правильный - взят тз книги. Подмигивающий
Однако при попытке получить ответ - никаго эффекта (кроме зависания).
Позвонила в фирму, спрашиваю, что делать? В ответ в вашей документации есть коды ошибок по которым можно определить причину. Ну так я без них вижу описание кода ошибок в этой документации. Как же я увижу ошибку, которую возвращает прибор, если он вообще при попытке получить ответ ничего не вовращает, кроме зависания. Плачущий
Записан
Rius
Давний друг
**

Сказали спасибо: +116/-5
Offline Offline

Сообщений: 753


WWW
« Ответ #23 : 17 Апрель 2008, 19:43:30 »

возьмите готовую утилиту типа терминала, пошлите тестовые команды и посмотрите придёт ли ответ. возможно просто \r\n не хватает...
Записан
Лена
Гость
« Ответ #24 : 18 Апрель 2008, 10:34:01 »

Утилита терминал, идет в стандартной поставке Windows. Однако среди меню "Стандартные" этой программы у меня нет. Поиск файла hypertrm.exe на компьютере, тоже ничего не дал. Я могу где-то скачать дистрибутив и доустновить терминал?
Записан
Gedeon
Ы
Администратор
***

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 291


« Ответ #25 : 18 Апрель 2008, 10:55:59 »

Лена, уточните не нужен ли там шнурок с какой-то нестандартной распайкой, я когда-то неделю дебажил, а оказалось что шнурок не тот был.
Записан
Лена
Гость
« Ответ #26 : 18 Апрель 2008, 11:15:34 »

Прибор ганантировано работал. Мне его дали с проводом прямо со стенда.
Я вот установили этот самый терминал и настроила его на свой СОМ порт (рис). Растолкуйте как послать команду порту через терминал? Я пытаюсь набрать текст команды в окне после слова Ready ниже, а текст не набирается. В меню передача есть возможность отправлять файлы, а мне нужно отправить команду в порт. Непонимающий
Записан
Gedeon
Ы
Администратор
***

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 291


« Ответ #27 : 18 Апрель 2008, 11:37:51 »

У тебя есть исходник какого-то образца или описание? Без доки по прибору ничего никто не подскажет.
Записан
Лена
Гость
« Ответ #28 : 18 Апрель 2008, 11:44:17 »

У меня есть список команд которые принимает прибор. Когда он подключен к СОМ порту с ним можно работать напрямую посылая в порт команды. Сам прибор: http://www.systech.com.tw/old/english/products_x8plus.html
Подскажите, почему я не могу набрать команду в окне терминала? Нажимаю любую клавишу - результата нет, символы не печаются. Глюк терминала или где-то есть настройка?
Записан
Rius
Давний друг
**

Сказали спасибо: +116/-5
Offline Offline

Сообщений: 753


WWW
« Ответ #29 : 18 Апрель 2008, 11:49:06 »

попробуйте одной из этих прог
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines
Страница сгенерирована за 0.141 секунд. Запросов: 22.