Предложение за "читав" COMM компонент?

12 отговора 0 прегледа
#1

Предложение за "читав" COMM компонент?

Търся "читав" COM (RS 232) компонент за Делфи 6?
Както и малко помощ за работа с него.
Ще се опитвам да "чета/управлявам" модем, по специално GSM модеми.
Някаква идея?

Отговор
в отговор на ИвKo #2

CPort, TurboPower Async Pro

Аз работя с тези двата:
[линк]
[линк]
Първият е простичък и лекичък. Втория има много богата функционалност. И двата имат добри примери, а този на TurboPower си има и нелоши ръководства (два големи PDF-а).

Linux isn't free, it's worthless.


Отговор
в отговор на andrew_nikoloff #3

Re: CPort, TurboPower Async Pro

Благодаря за информацията.

Спрях се на comport. Така или иначе, това което трябва да направя е да взема списък с всички потдържани АТ команди, да мога да набирам номер, да отговарям на позвъняване, както и да затворя слушалката. Дано да няма проблеми, когато е част от DLL, по точно от TSP (Telephone Service Provider)...

Отговор
в отговор на andrew_nikoloff #4

Re: CPort, TurboPower Async Pro

Някой да има опит с използването на TComPort (cport) в DLL?
Натъквам се на проблем, че мога да "пиша", т.е. да изпращам команди, но по някаква причина не мога да "слушам" COM порта... т.е. събитията, например OnRing, OnRxChar не се случват.... Всичко е ОК, когато кода е в интерактивно приложение (GUI)... Делфи 6, cport ver. 4 от [линк]

Отговор
в отговор на ИвKo #5

Run-time packages

Опитай да си компилираш exe-то и dll-а с run-time packages. Не знам как точно работи вътрешно ComPort компонента, но може би това е проблем за него.

Linux isn't free, it's worthless.


Отговор
в отговор на andrew_nikoloff #6

Re: Run-time packages

Не мога - приложението, не би трябвало да е зависимо от делфи пакети.
Тествам тук - нещата отиват към писане от "нулата"

Отговор
в отговор на ИвKo #7

Re: Run-time packages

Не става въпрос за зависимо или не. Когато приложението и DLL-а се компилират с run-time пакети нещата стоят по съвсем различен начин. Например компилирай си ги без пакети и си предай на dll-а една форма да речем. След това от dll-а направи следното:

procedure Test(Form: TObject);
begin
if Form is TForm then
ShowMessage('Form is TForm)
else
ShowMessage('Form is not TForm);
end;

След това си я извикай от ехе-то:

procedure Test(Form: TObject); external 'Project2';

procedure TForm1.FormCreate(Sender: TObject);
begin
Test(Self);
end;

Може би ще се изненадаш от резултата
След това си билдни двата проекта с runtime packages и иопитай пак.

Като цяло когато не са ти компилирани с пакети двата ти модула се държат като две отделни приложения, просто са в общо адресно пространство. А и какво означава "не би трябвало да е зависимо от делфи пакети"? Компилирай си ги само с необходимите ти пакети и освен твоя dll ще си дистрибутираш и още 1 или няколко bpl-а.

Linux isn't free, it's worthless.


Отговор
в отговор на andrew_nikoloff #8

Re: Run-time packages

Да, да... Така е... Работя с Делфи от версия 1
Просто не ми трябват в случая "ремаркета". BPL-те имат значение, когато на един компютър се инсталират повече от едно приложение компилирани с един и същ компилатор (версия), и когато има предаване на обекти между две приложения създадени от един и същ Делфи компилатор. Иначе няма никакъв смисъл - само главоболия. Просто едно време Борланд се опитаха да направят нещо като MSVCRTD, но разликата между Борланд и Майкрософт е ... Както и да е... В моя случай, DLL-а се извиква от C/C++ приложение, работещо в svchost.exe.
Открих проблема. Всички COMM компоненти, използват PostMessage или SendMessage към някакъв Window който синхронизира ReadFile/WriteFile и "запалва" обработката на събитията. Всичко е ОК, ако процеса има определени права - INTERACTIVE със Десктопа, иначе - създавания Window е невидим за PostMessage/SendMessage и нищо не се случва, т.е. компонента си чете от порта, но не може да "запали" OnЕдикакво си . Така че изхода е писане от нулата, тъй като присвояване на допълнителни права е неприемливо, да не кажа невъзможно...
Весели празници от мен...

Отговор
в отговор на ИвKo #9

Re: Предложение за "читав" COMM компонент?

Ами аз имам доста написани програми, ползващи сериен порт, не на Делфи, но на C++ Builder.

Ползвам директно Windows API - ReadFile, WriteFile, SetCommTimeOuts и т.н.


Отговор
в отговор на naki #10

Re: Предложение за "читав" COMM компонент?

Май това е най-чистото решение. И аз стигнах до него, макар и след няколко дена лутане. Получи се много семпло решение...

Отговор
в отговор на ИвKo #11

Re: Предложение за "читав" COMM компонент?

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls, shellapi;


type
TF_SerAPI = class(TForm)
st_empf: TStaticText;
Timer1: TTimer;
Button1: TButton;
Edit1: TEdit;

procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);

procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);


private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
F_SerAPI : TF_SerAPI;
Cid : Integer;
Stat : PComStat; {Windowsstruktur fьr Schnittstellen}
Result : DWord;
Overlapped : TOverlapped;
DCB: TDCB;
ComTemp : PChar;
timeouts: TCommTimeouts;
implementation

{$R *.DFM}

procedure TF_SerAPI.FormCreate(Sender: TObject);
begin
ComTemp := 'COM1';
Cid := CreateFile(ComTemp,GENERIC_WRITE OR GENERIC_READ,0,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);

EscapeCommFunction(Cid , SETDTR); // SETRTS

DCB.BaudRate := 9600; // Baudrate [9600]
DCB.ByteSize := 8; // Anzahl der Bits/Byte, 4-8 [8]
DCB.Parity := 0; // 0-4=keine, ungerade, gerade, [keine], gesetzt oder leer
DCB.StopBits := 0; // 0,1,2 = 1, 1.5, 2 [1Stopbit]
DCB.Flags := 0; // Setzt die ЬbertragungaFlags [keine]
DCB.XonChar := #17; // Tx und Rx X-ON-Zeichen [Ascii#17]
DCB.XoffChar := #19; // Tx und Rx X-OFF-Zeichen [Ascii#19]
DCB.XonLim := 10; // X-ON-Sendeschwelle
DCB.XoffLim := 10; // X-OFF-Sendeschwelle
DCB.EofChar := #0; // Eingabe Ende-Zeichen
DCB.EvtChar := #0; // Ereignis erhalten-Zeichen

SetCommState(cid,DCB) ;
timeouts.ReadIntervalTimeout:=1;
timeouts.ReadTotalTimeoutMultiplier:=100;
timeouts.ReadTotalTimeoutConstant:=100;
timeouts.WriteTotalTimeoutMultiplier:=100;
timeouts.WriteTotalTimeoutConstant:=100;
SetCommTimeouts(Cid,timeouts) ;
end;



procedure TF_SerAPI.FormClose(Sender: TObject; var Action: TCloseAction);

begin
CloseHandle(CID)
end;


procedure TF_SerAPI.Timer1Timer(Sender: TObject);
var
Input,Output:byte ; // PChar

begin
PurgeComm(Cid,PURGE_RXCLEAR) ;
ReadFile(Cid,Input,1,Result,@Overlapped);
st_empf.Caption := inttostr(Input);

GetCommState(Cid,DCB );
//GetCommMask(Cid, EV_CTS );

end;




procedure TF_SerAPI.Button1Click(Sender: TObject);
var
Output:byte ;
begin
Output:=strtointDef(edit1.text,0);
WriteFile(Cid,Output,1,Result,@Overlapped) ;
end;

end.

Редактирано от svetlin на

Отговор
в отговор на svetlin #12

Re: Предложение за "читав" COMM компонент?

Благодаря... Някакъв начин да се избегне този таймер?

Отговор
в отговор на ИвKo #13

Re: Предложение за "читав" COMM компонент?

Може - с callbacks, ама се дебъгва с пъти по-трудно.

Отговор