Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизПочему код не работает на Win98, но чудесно работает в XP(RS232) Найти похожие ветки
← →
Stasmor © (2006-11-15 12:38) [0]Здравствуйте!
Можете мне помочь с кодом!
Это очень важно!
Данный код отлично работает с WinXP но никак не хочет работать с Win98...
Если есть глобальные ошибки в коде, помогите исправить...
Собственно сам код:unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, XPMan;
type
TForm1 = class(TForm)
Memo1: TMemo;
Edit1: TEdit;
XPManifest1: TXPManifest;
Button5: TButton;
Button1: TButton;
Button6: TButton;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ComFile: THandle;
W,V,Rad,R:integer;
nulling:boolean;
implementation
uses unit2;
{$R *.dfm}
function OpenCOMPort: Boolean;
var
DeviceName: array[0..80] of Char;
begin
{ First step is to open the communications device for read/write.
This is achieved using the Win32 "CreateFile" function.
If it fails, the function returns false.
Wir versuchen, COM1 zu offnen.
Sollte dies fehlschlagen, gibt die Funktion false zuruck.
}
StrPCopy(DeviceName, "COM1:");
ComFile := CreateFile(DeviceName,
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if ComFile = INVALID_HANDLE_VALUE then
Result := False
else
Result := True;
end;
function SetupCOMPort: Boolean;
const
RxBufferSize = 256;
TxBufferSize = 256;
var
DCB: TDCB;
Config: string;
CommTimeouts: TCommTimeouts;
begin
Result := True;
Config:="baud=9600 parity=n data=8 stop=1";
if not BuildCommDCB(@Config[1], DCB) then
Result := False;
if not SetCommState(ComFile, DCB) then
Result := False;
with CommTimeouts do
begin
ReadIntervalTimeout := 3;
ReadTotalTimeoutMultiplier := 3;
ReadTotalTimeoutConstant := 3;
WriteTotalTimeoutMultiplier := 3;
WriteTotalTimeoutConstant := 3;
end;
if not SetCommTimeouts(ComFile, CommTimeouts) then
Result := False;
end;
{
The following is an example of using the "WriteFile" function
to write data to the serial port.
Folgendes Beispiel verwendet die "WriteFile" Funktion, um Daten
auf den seriellen Port zu schreiben.
}
procedure SendText(s: string);
var
BytesWritten: DWORD;
begin
{
Add a word-wrap (#13 + #10) to the string
An den ubergebenen String einen Zeilenumbruch (#13 + #10) hangen
}
s := s ;
WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
end;
{
The following is an example of using the "ReadFile" function to read
data from the serial port.
Folgendes Beispiel verwendet die "ReadFile" Funktion, um Daten
vom seriellen Port zu lesen.
}
function ReadText: string;
var
d: array[1..80] of Char;
s: string;
BytesRead, i: Integer;
begin
Result := "";
if not ReadFile(ComFile, d, SizeOf(d), cardinal(BytesRead), nil) then
begin
{ Raise an exception }
end;
s := "";
for i := 1 to BytesRead do s := s + d[I];
Result := s;
end;
procedure CloseCOMPort;
begin
// finally close the COM Port!
// nicht vergessen den COM Port wieder zu schliessen!
CloseHandle(ComFile);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SendText("V");
procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Text:="Открытие COM1..."+#13#10;
if OpenCOMPort then
begin
SetupCOMPort;
memo1.Text:=memo1.text+"Порт открыт и готов к работе..."+#13#10;
end
else
begin
memo1.Clear;
memo1.Text:="Error to open COM1..."+#13#10;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseCOMPort;
end;
end.
не смотрите пожалуйсто на лишние куски кода ...=)
Заранее спасибо!!!
← →
Array © (2006-11-15 12:42) [1]
> Данный код отлично работает с WinXP но никак не хочет работать
> с Win98...
а конкретнее
> не смотрите пожалуйсто на лишние куски кода ...=)
а куда собсвенно сматреть , милейший
> Заранее спасибо!!
да пока незашо впринципе )))
← →
clickmaker © (2006-11-15 12:43) [2]
> Stasmor © (15.11.06 12:38)
что, прямо так и говорит: "Не хочу я твую 98-ю, ХР давай"?
SysErrorMessage(GetLastError) оченно помогает в таких случаях, лучше утюга и пассатиж
← →
Германн © (2006-11-15 13:32) [3]
> Данный код отлично работает с WinXP но никак не хочет работать
> с Win98...
Опять нам лапшу вешают. Хорошо ещё, если окажется в результате, что виноваты 64К в мемо :-)
← →
Anatoly Podgoretsky © (2006-11-15 13:53) [4]> Stasmor (15.11.2006 12:38:00) [0]
> не смотрите пожалуйсто на лишние куски кода ...=)
Значит ты знаешь какие лишнии куски, так почему же не убрал, а вывалил весь мусор не форум.
← →
Anatoly Podgoretsky © (2006-11-15 13:54) [5]> Германн (15.11.2006 13:32:03) [3]
64К, щедрый ты.
← →
Vlad Oshin © (2006-11-15 14:58) [6]
> Anatoly Podgoretsky © (15.11.06 13:54) [5]
32?
← →
Anatoly Podgoretsky © (2006-11-15 21:33) [7]> Vlad Oshin (15.11.2006 14:58:06) [6]
Реально 32-38 кб, зависит от многих факторов. Просто 64 это логический предел, но из этих 64 кое что и система использует.. Можно даже несколько раз запускать, результаты будут колебаться.
Проще считать 32 кб. Это ограничение пошло от win 16
← →
Германн © (2006-11-16 02:18) [8]
> Anatoly Podgoretsky © (15.11.06 13:54) [5]
>
> > Германн (15.11.2006 13:32:03) [3]
>
> 64К, щедрый ты.
>
Я не "щедрый"! Я "справедливый" :-)
Memo.Text:=Memo.Text+ "a"; даст почти 64К. :-)
← →
Германн © (2006-11-16 02:29) [9]Но вот тут вот что ещё интересно. Данное ограничение в Win9x влияет на работу программы, только если даноое мемо "видимо".
← →
stasmor © (2006-11-19 23:39) [10]Спасибо всем кто откликнулся...
> что, прямо так и говорит: "Не хочу я твую 98-ю, ХР давай"?
>
> SysErrorMessage(GetLastError) оченно помогает в таких случаях,
> лучше утюга и пассатиж
Воспользуюсь вашим советом и гляну...
как я понимаюSysErrorMessage(GetLastError)
нужно вставить после попытки посылки или приема инфы?
Прошу прощения если я туплю...я с Дэлфой только начал работать...
← →
Германн © (2006-11-20 01:08) [11]
> stasmor © (19.11.06 23:39) [10]
>
> Спасибо всем кто откликнулся...
>
Для начала лучше пройдись отладчиком по программе. (Т.е. используя "волшебные" клавиши F5, F9, F8, F7).
Кстати. Откуда "содрал" код?
← →
Stasmor © (2006-11-20 08:39) [12]На почти весь код содрал с ДэлфиВорлда...
Когдато(курсе на первом) писал сразу в регистры(через АСМ), но с появлением ХРени, АСМ перестал быть актуальным...
А чем мне может помочь Отладчик? код же работает на ХР, значит, ничего нового я не найду...Единственное подозрение у меня вызывает правильная ли установка Тайм-аутов...(хотя все может быть)
Кстати. как правильно юзать SysErrorMessage(GetLastError)?
← →
Делфи (2006-11-20 11:42) [13]
> Кстати. как правильно юзать SysErrorMessage(GetLastError)?
как я понимаю просто писать после глючного кода :)
например
i := i/0;
showmessage(IntToStr(SysErrorMessage(GetLastError)));
ps. надеюсь я прав...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.061 c