Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

чтение данных с ком порта... [D5, Win95/98]


pvn ©   (2002-03-03 16:44:00) 

Мужики, я уже понял, что про ком порт спрашивают каждый день, но вот посмотрите код:

procedure TForm1.Button2Click(Sender: TObject);
var
S, D: array[0..127] of Char;
actual_bytes: Cardinal;
// The DCB structure defines the control setting
// for a serial communications device
DCB: TDCB;
begin
FillChar(S, 128, #0);
FillChar(D, 128, #0);
try
GetCommState(hPort, dcb);
dcb.BaudRate:= CBR_9600;
dcb.DCBlength:= Sizeof(DCB);
dcb.ByteSize := 8;
dcb.StopBits := 1;
dcb.Parity:=NOPARITY;
SetCommState(hPort, dcb);
except
ShowMessage("Error connection...");
end;
PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
// StrPCopy(S, Edit1.Text+ #13 + #10);
StrPCopy(S, "AT"+ #13 + #10);
if not WriteFile(hPort, S, StrLen(S), actual_bytes, nil) then
begin
ShowMessage("Can""t write to port: " + IntToStr(GetLastError)) ;
Exit;
end;
Memo2.Lines.Add(S);

if not ReadFile(hPort, D, 1, actual_bytes, nil) then
ShowMessage("Can""t read from port: " + IntToStr(GetLastError))
else
ShowMessage("Read " + IntToStr(actual_bytes) + " bytes");
Memo1.Text := D;
end;

порт открывается, вроде даже данные отсылаются, но не могу получить ответ от модема...
что не так


Королев   (2002-03-04 05:26:00) [1]

подробно не могу - не делал, но думаю надо читать побайтно (D должно быть размером в 1 байт), и чтение производить только при возникновении события WaitCommEvent для пришедшего байта. в SDK подробно описано WaitCommEvent.


pvn   (2002-03-04 05:03:00) [2]

пара вопросов:
1) почему ждет, ведь в чтении if not ReadFile(hPort, D, 1, actual_bytes, nil) стоит 1? как правильно?
2) а как это событие сделать? только по подробнее плз, а то я на Делфи лет 5 не писал...


Королев   (2002-03-03 19:54:00) [3]

в такой записи он тоже читает, но он читает все 127 char D массива, т.е. пока все 127 не прийдут событие чтения не остановится. надо воспользоваться WaitCommEvent.


pvn   (2002-03-03 19:27:00) [4]

инициализацию порта я закинул в ф-ию создания формы...

hPort := CreateFile(PChar("COM2"), GENERIC_READ + GENERIC_WRITE,
0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hPort = INVALID_HANDLE_VALUE then
ShowMessage("Can""t open COM2");


Королев   (2002-03-03 16:56:00) [5]

может я конечно тоже что-то не понимаю, но мне кажется, что тут нигде не указано имя порта: com1 или com2. надо получить его хэндл: hport:=createfile("com1",.....)


Наверх

Титульная страница Поиск, карта сайта Написать письмо