Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.01.2011, 18:45
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию Работа с COM-портом, ошибка

Всем привет=)

Писала программу, которая обращается к COM-порту: пока что просто открывает/закрывает его. Открывает нормально, а при закрытии выдается ошибка: "Project project1.exe raised exception class EExternalException with message 'External exception C0000008'. Process stopped. Use Step or Run to continue."

Фрагмент программы:

Код:
var Port:THandle;
begin
if  button1.Caption='Открыть' then
begin
  Port:=CreateFile(
    '\\.\COM3',                   
    GENERIC_READ or GENERIC_WRITE,
    0,                            
    nil,                         
    OPEN_EXISTING,               
    FILE_ATTRIBUTE_NORMAL,         
    0                           
  );
 if (port=INVALID_HANDLE_VALUE)  
  then showmessage('Ошибка!') 
  else begin
  showmessage('Порт открыт');      
  button1.Caption:='Закрыть';
end;   end   else
if button1.Caption='Закрыть' then
begin
showmessage('Порт закрыт');
CloseHandle (port);// тут тупая ошибка
button1.Caption:='Открыть';

end;
  end;
Подскажите, пожалуйста, как избавиться от ошибки?
Ответить с цитированием
  #2  
Старый 29.01.2011, 19:04
Аватар для EvilRussian
EvilRussian EvilRussian вне форума
Начинающий
 
Регистрация: 21.12.2010
Адрес: Россия, Красноярский край
Сообщения: 177
Репутация: 22
По умолчанию

Пользуемся тегом CODE!!!
Почему новоприбывшие никогда не читают правила? >_<
__________________
Если не ты, то кто?
(с) Терри Пратчетт

Не забывайте ставить плюсы и говорить спасибо!
Ответить с цитированием
  #3  
Старый 29.01.2011, 19:12
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию

Простите, прочитала послание начинающим в 4м топике, а правила забыла
Ответить с цитированием
  #4  
Старый 29.01.2011, 19:39
Аватар для movnet
movnet movnet вне форума
Начинающий
 
Регистрация: 24.07.2008
Сообщения: 127
Версия Delphi: Delphi 7
Репутация: 23
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject); 
var 
CommPort : string; 
hCommFile : THandle; 
Buffer : PCommConfig; 
size : DWORD; 
begin 
CommPort := 'COM1'; 
{Открываем Com-порт} 
hCommFile := CreateFile(PChar(CommPort), 
                         GENERIC_WRITE, 
                         0, 
                         nil, 
                         OPEN_EXISTING, 
                         FILE_ATTRIBUTE_NORMAL, 
                         0); 
if hCommFile=INVALID_HANDLE_VALUE then 
begin 
   ShowMessage('Unable to open '+ CommPort); 
   exit; 
end; 
{Выделяем временный буфер} 
GetMem(Buffer, sizeof(TCommConfig)); 
{Получаем размер структуры CommConfig}
size := 0; 
GetCommConfig(hCommFile, Buffer^, size); 
{Освобождаем временный буфер} 
FreeMem(Buffer, sizeof(TCommConfig)); 
{Выделяем память для структуры CommConfig} 
GetMem(Buffer, size); 
GetCommConfig(hCommFile, Buffer^, size); 
{Изменяем скорость передачи} 
Buffer^.dcb.BaudRate := 1200; 
{Устанавливаем новую конфигурацию для COM-порта} 
SetCommConfig(hCommFile, Buffer^, size); 
{Освобождаем буфер} 
FreeMem(Buffer, size); 
{Закрываем COM-порт}
CloseHandle(hCommFile); 
end;

Последний раз редактировалось movnet, 29.01.2011 в 19:45.
Ответить с цитированием
  #5  
Старый 29.01.2011, 20:19
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию

Спасибо, но мне просто нужно, чтобы при втором нажатии на кнопку порт закрывался без ошибки.
Ответить с цитированием
  #6  
Старый 29.01.2011, 20:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Aggression
Спасибо, но мне просто нужно, чтобы при втором нажатии на кнопку порт закрывался без ошибки.

Код:
var Port:THandle;

Похоже на описание локальной переменной. Как ты понимаешь, после выхода из обработчика после первого нажатия кнопки значение этой переменной будет утеряно. Сделай эту переменную глобальной или вообще членом класса. Тогда ошибка должна пропасть.
Ответить с цитированием
  #7  
Старый 29.01.2011, 20:58
Аватар для Aggression
Aggression Aggression вне форума
Прохожий
 
Регистрация: 29.01.2011
Сообщения: 11
Репутация: 10
По умолчанию

Спасибо большое, уже разобралась.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:52.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025