Easyelectronics.ru

Электроника для всех
Текущее время: 17 окт 2019, 15:40

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Терминал на Delhi
СообщениеДобавлено: 30 ноя 2011, 19:56 
Только пришел

Зарегистрирован: 12 июл 2011, 12:53
Сообщения: 7
Здравствуйте.

Хочу сделать что то подобное на терминал в Делфи. Делаю по примеру, который расписан тут: http://compconnect.ru/2010/04/rabota-s- ... hhi-winapi .

Ну а теперь и о самой проблеме:

При нажатии на кнопку "Считать данные" выводит какую-то ерунду.

Вот сама функция кнопки:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  TRBuf:PChar;    //буфер данных для передачи
  nToWrite:DWord; //число байт для записи
  nWrite:DWord;   //число записанных байт
begin
  TRBuf:=PChar(Edit1.Text);         //заполняем буфер данными
  nToWrite:=length(TRBuf)+1;        //число передаваемых байт
  WriteFile(port,TRBuf^,nToWrite,nWrite,nil); //собственно отпавляем данные
end;


Ну, и если нужно, функция передачи:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  TRBuf:PChar;    //буфер данных для передачи
  nToWrite:DWord; //число байт для записи
  nWrite:DWord;   //число записанных байт
begin
  TRBuf:=PChar(Edit1.Text);         //заполняем буфер данными
  nToWrite:=length(TRBuf)+1;        //число передаваемых байт

end;


Ниже во вложении прилагаю свой проект в архиве.


Вложения:
COM_ATAMAN.zip [233.93 Кб]
Скачиваний: 108
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 30 ноя 2011, 20:22 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
А где чтение-то? В проекте оно закомментировано...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 30 ноя 2011, 20:30 
Только пришел

Зарегистрирован: 12 июл 2011, 12:53
Сообщения: 7
ploop писал(а):
А где чтение-то? В проекте оно закомментировано...

Да, закометированно. Не обратил внимание. Это я прост очто то там эксперементировал.

Раскоментровав все равно не работает...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 30 ноя 2011, 21:44 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Как конкретно реагирует? Что идёт в порт, что получаете в поле Edit1.Text ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 30 ноя 2011, 21:51 
Только пришел

Зарегистрирован: 12 июл 2011, 12:53
Сообщения: 7
ploop писал(а):
Как конкретно реагирует? Что идёт в порт, что получаете в поле Edit1.Text ?

На сколько понял вопрос, сделал скриншет:

Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 30 ноя 2011, 23:24 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Не понял... А с чего ты взял, что данные должны быть на порте, если туда ничего не передаётся?
Я имею ввиду железный порт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 30 ноя 2011, 23:48 
Только пришел

Зарегистрирован: 12 июл 2011, 12:53
Сообщения: 7
ploop писал(а):
Не понял... А с чего ты взял, что данные должны быть на порте, если туда ничего не передаётся?
Я имею ввиду железный порт.


Как я понимаю функция WriteFile(port,TRBuf^,nToWrite,nWrite,nil); как раз и отправляет данные


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 01 дек 2011, 00:31 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:08
Сообщения: 7549
Откуда: Алма-ата
ataman писал(а):
Как я понимаю функция WriteFile(port,TRBuf^,nToWrite,nWrite,nil); как раз и отправляет данные

Так на порту - дуплекс. Передатчик передает, приемник - принимает. Если вы на прием ничего не даете, чего он примет-то? Так же и передатчик. Чтобы узнать, что он передал - надо подключить к нему приемник.

В простейшем случае - соедините прием с передачей на разьеме (2 и 3 штырьки). Тогда сможете принимать свою передачу.
А еще лучше - если в компе два COM порта, соединить передачу одного с приемом другого.
По одному принимать и передавать вашей программой, по другому - какой - нибудь терминальной, хотя бы Виндовским терминалом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 01 дек 2011, 01:19 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Опять же, у него буфер какой, или что-нибудь есть? Ваша процедура просто считывает данные с порта по нажатию кнопки. А как определить момент, что данные пришли? Похоже или читать в отдельном потоке (thread), или отслеживать системные сообщения, или что-то типа этого...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 01 дек 2011, 02:05 
Только пришел

Зарегистрирован: 12 июл 2011, 12:53
Сообщения: 7
SWG писал(а):
ataman писал(а):
Как я понимаю функция WriteFile(port,TRBuf^,nToWrite,nWrite,nil); как раз и отправляет данные

Так на порту - дуплекс. Передатчик передает, приемник - принимает. Если вы на прием ничего не даете, чего он примет-то? Так же и передатчик. Чтобы узнать, что он передал - надо подключить к нему приемник.

В простейшем случае - соедините прием с передачей на разьеме (2 и 3 штырьки). Тогда сможете принимать свою передачу.
А еще лучше - если в компе два COM порта, соединить передачу одного с приемом другого.
По одному принимать и передавать вашей программой, по другому - какой - нибудь терминальной, хотя бы Виндовским терминалом.

Делаю так как вы говорите, соеденеяю Рх и Тх, но нечего...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 01 дек 2011, 09:10 
Только пришел

Зарегистрирован: 12 мар 2011, 08:42
Сообщения: 10
Прежде чем использовать переменную:
TRBuf:PChar; //буфер данных для передачи
нужно выделить для нее память. У вас это обычный указатель.
Выделить можно например так:

TRBuf:=GlobalLock(GlobalAlloc(GPTR,Size));

где Size:=Length(Edit1.Text)+1;
Освободить память:

GlobalFree(GlobalHandle(TRBuf));

Должно получиться как-то вот так:

Цитата:
procedure TForm1.Button2Click(Sender: TObject);
var
TRBuf:PChar; //буфер данных для передачи
nToWrite:DWord; //число байт для записи
nWrite:DWord; //число записанных байт
begin
nToWrite:=length(Edit1.Text);

TRBuf:=GlobalLock(GlobalAlloc(GPTR,nToWrite+1));
CopyMemory(TRBuf,ptr(integer(Edit1.Text)),nToWrite);

WriteFile(port,TRBuf,nToWrite,nWrite,nil); //собственно отпавляем данные

GlobalFree(GlobalHandle(TRBuf));

end;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 04 дек 2011, 05:09 
Только пришел

Зарегистрирован: 12 июл 2011, 12:53
Сообщения: 7
lvngeo писал(а):
Прежде чем использовать переменную:
TRBuf:PChar; //буфер данных для передачи
нужно выделить для нее память. У вас это обычный указатель.
Выделить можно например так:

TRBuf:=GlobalLock(GlobalAlloc(GPTR,Size));

где Size:=Length(Edit1.Text)+1;
Освободить память:

GlobalFree(GlobalHandle(TRBuf));

Должно получиться как-то вот так:

Цитата:
procedure TForm1.Button2Click(Sender: TObject);
var
TRBuf:PChar; //буфер данных для передачи
nToWrite:DWord; //число байт для записи
nWrite:DWord; //число записанных байт
begin
nToWrite:=length(Edit1.Text);

TRBuf:=GlobalLock(GlobalAlloc(GPTR,nToWrite+1));
CopyMemory(TRBuf,ptr(integer(Edit1.Text)),nToWrite);

WriteFile(port,TRBuf,nToWrite,nWrite,nil); //собственно отпавляем данные

GlobalFree(GlobalHandle(TRBuf));

end;


Сделал в точности как вы написали. Результат такойже. Выдает полную ерунду... Что может быть еще не правильно ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 04 дек 2011, 10:15 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:08
Сообщения: 7549
Откуда: Алма-ата
Работать с портом как с файлом - паршивое дело. Лучше напрямую. В WIN-98 вообще было просто, как и в DOS. В системах на ядре NT (WIN-2000, WIN XP) сложнее, но в Интернете есть куча готовых компонент для DELPHI, позволяющих работать напрямую и в них.
Например, я в своем виртуальном пульте робота под WIN XP PRO так с COM работаю. Без проблем, каждый байт отслеживается. А через файл - и тормоза жуткие, и еще там чего-то мне не понравилось, не помню уже. Правда, не знаю, как под 64 битными пойдет, не пробовал. Там возможно другой компонент для работы с портом нужно будет использовать. А под 32 битные - полно их было. Я в своем пульте не только прием с передачей, но и все 5 служебных линий отслеживаю, могу состояние RTS и DTR менять. Например, RTS использую для включения несущей передатчика радиоканала.
А работа с портом как с файлом - херня все это. Там все еще и буферируется, и времена непредсказуемые. Файл - штука в Виндах неторопливая... Бывало, скинешь файл на дискетку, проверишь - все нормально. Сунешь в другой комп - а она чистая, все в буфере осталось. Хотя показывало якобы на дискете...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 04 дек 2011, 17:42 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 25 фев 2010, 16:34
Сообщения: 60
Откуда: Уфа
SWG, выложили бы исходники своего пульта. ну хотя бы ту часть которая с комом работает. если не сложно канешно


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 04 дек 2011, 19:15 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Я бы готовые компоненты взять посоветовал. Благо их много.
И статьи почитать, типа этой: http://delphikingdom.com/asp/viewitem.asp?catalogid=723
Вообще, delphikingdom замечательный ресурс, можно найти ответы на любые вопросы касаемо delphi, или спросить, если не нашлось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 04 дек 2011, 21:31 
Только пришел

Зарегистрирован: 12 мар 2011, 08:42
Сообщения: 10
Цитата:
Сделал в точности как вы написали. Результат такойже. Выдает полную ерунду... Что может быть еще не правильно ?


В приведенной мной листинге в буфере точно содержатся нужные данные для отправки, значит нужно ковырять функцию WriteFile. Дескриптор port определен? Если он определен - должен равняться какому-то целому числу, например, 36789?
А вообще, действительно - лучше и быстрее посмотреть готовые компоненты.
Вот, например, я использую:
DomIS Internet Solution http://www.domis.de
Fully Serial Communication with Delphi and Windows 95/98/Me/NT/2000/XP.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Терминал на Delhi
СообщениеДобавлено: 05 дек 2011, 00:22 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:08
Сообщения: 7549
Откуда: Алма-ата
хнырг писал(а):
SWG, выложили бы исходники своего пульта. ну хотя бы ту часть которая с комом работает. если не сложно канешно

Да я уже выкладывал, и EXEшник пульта, и исходники. Правда, исходники - давно было, много добавилось.

Вот сама программа (инсталляции не требует, работает из любого каталога):
Вложение:
PULT.RAR [217.37 Кб]
Скачиваний: 110


А вот полностью папка проекта:
Вложение:
Пульт с исходниками.RAR [1.44 Мб]
Скачиваний: 120

У меня она на диске E, сответственно настройка путей на E:\ROB\SOUR.
Дельфи - 6.0, Enterprise, русская.
Все стандартное, единственно - в моей программе используется компонент
TBComPort ver.2.12. Работает с Delphi 2..7 под Windows 9X/ME/NT4/2K/XP. (c) 2005 Брусникин И.В.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB