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

Както и малко помощ за работа с него.
Ще се опитвам да "чета/управлявам" модем, по специално GSM модеми.
Някаква идея?
CPort, TurboPower Async Pro
Аз работя с тези двата:
[линк]
[линк]
Първият е простичък и лекичък. Втория има много богата функционалност. И двата имат добри примери, а този на TurboPower си има и нелоши ръководства (два големи PDF-а).
Linux isn't free, it's worthless.
[линк]
[линк]
Първият е простичък и лекичък. Втория има много богата функционалност. И двата имат добри примери, а този на TurboPower си има и нелоши ръководства (два големи PDF-а).
Linux isn't free, it's worthless.
Re: CPort, TurboPower Async Pro
Благодаря за информацията.
Спрях се на comport. Така или иначе, това което трябва да направя е да взема списък с всички потдържани АТ команди, да мога да набирам номер, да отговарям на позвъняване, както и да затворя слушалката. Дано да няма проблеми, когато е част от DLL, по точно от TSP (Telephone Service Provider)...

Спрях се на comport. Така или иначе, това което трябва да направя е да взема списък с всички потдържани АТ команди, да мога да набирам номер, да отговарям на позвъняване, както и да затворя слушалката. Дано да няма проблеми, когато е част от DLL, по точно от TSP (Telephone Service Provider)...
Re: CPort, TurboPower Async Pro
Някой да има опит с използването на TComPort (cport) в DLL?
Натъквам се на проблем, че мога да "пиша", т.е. да изпращам команди, но по някаква причина не мога да "слушам" COM порта... т.е. събитията, например OnRing, OnRxChar не се случват.... Всичко е ОК, когато кода е в интерактивно приложение (GUI)... Делфи 6, cport ver. 4 от [линк]

Натъквам се на проблем, че мога да "пиша", т.е. да изпращам команди, но по някаква причина не мога да "слушам" COM порта... т.е. събитията, например OnRing, OnRxChar не се случват.... Всичко е ОК, когато кода е в интерактивно приложение (GUI)... Делфи 6, cport ver. 4 от [линк]
Run-time packages
Опитай да си компилираш exe-то и dll-а с run-time packages. Не знам как точно работи вътрешно ComPort компонента, но може би това е проблем за него.
Linux isn't free, it's worthless.
Linux isn't free, it's worthless.
Re: Run-time packages
Не мога - приложението, не би трябвало да е зависимо от делфи пакети.
Тествам тук - нещата отиват към писане от "нулата"

Тествам тук - нещата отиват към писане от "нулата"
Re: Run-time packages
Не става въпрос за зависимо или не. Когато приложението и DLL-а се компилират с run-time пакети нещата стоят по съвсем различен начин. Например компилирай си ги без пакети и си предай на dll-а една форма да речем. След това от dll-а направи следното:
След това си я извикай от ехе-то:
Може би ще се изненадаш от резултата
След това си билдни двата проекта с runtime packages и иопитай пак.
Като цяло когато не са ти компилирани с пакети двата ти модула се държат като две отделни приложения, просто са в общо адресно пространство. А и какво означава "не би трябвало да е зависимо от делфи пакети"? Компилирай си ги само с необходимите ти пакети и освен твоя dll ще си дистрибутираш и още 1 или няколко bpl-а.
Linux isn't free, it's worthless.
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.
Re: Run-time packages
Да, да... Така е... Работя с Делфи от версия 1
Просто не ми трябват в случая "ремаркета". BPL-те имат значение, когато на един компютър се инсталират повече от едно приложение компилирани с един и същ компилатор (версия), и когато има предаване на обекти между две приложения създадени от един и същ Делфи компилатор. Иначе няма никакъв смисъл - само главоболия. Просто едно време Борланд се опитаха да направят нещо като MSVCRTD, но разликата между Борланд и Майкрософт е ... Както и да е... В моя случай, DLL-а се извиква от C/C++ приложение, работещо в svchost.exe.
Открих проблема. Всички COMM компоненти, използват PostMessage или SendMessage към някакъв Window който синхронизира ReadFile/WriteFile и "запалва" обработката на събитията. Всичко е ОК, ако процеса има определени права - INTERACTIVE със Десктопа, иначе - създавания Window е невидим за PostMessage/SendMessage и нищо не се случва, т.е. компонента си чете от порта, но не може да "запали" OnЕдикакво си
. Така че изхода е писане от нулата, тъй като присвояване на допълнителни права е неприемливо, да не кажа невъзможно...
Весели празници от мен...

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

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.
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 на
Re: Предложение за "читав" COMM компонент?
Благодаря... Някакъв начин да се избегне този таймер?

Re: Предложение за "читав" COMM компонент?
Може - с callbacks, ама се дебъгва с пъти по-трудно.