![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение и запись в СОМ порт [D6, Win2k]
andrey__ © (2004-07-27 14:39:00)Нашёл ссылку:
D:\Internet\delphi\Мастера DELPHI Работа с COM-портами под Windows_ (документация, исходники, скачать).htm
вроде всё понятно но пример не работает. В чем дело?
andrey__ (2004-08-05 10:52:00) [1]Все нашел, в чем дело разъем (заглушка, которую я поставил на СОМ1)который мне дали, оказался поломан.
>Reindeer Moss Eater © (03.08.04 16:29) [40]
>А почему ТЫ должен прочитать то, что ТЫ записал в порт?
>Причем и читаешь и пишешь ты в один и тот же порт.
>Я бы еще понял нуль-модемный кабель и запись в com1 с чтением >из com2.
Если ты начал читать эту тему с начала, то понял бы что я вожусь с конкретным примером andrey__ (27.07.04 14:41) [1]который использует заглушку на порт и записывает и считывает данные с одного порта.
Если на COM1 установить перемычку между сигналами TxD и RxD, то переменная buf_in, после выполнения ReadFile, будет содержать ту же информацию, что и buf_out. Других пояснений пример не требует, все уже было подробно рассмотрено раньше. Хотя твой вариант тоже работает но у меня один СОМ порт.
>PS не надо тупо и настойчиво алёкать. Не надо приводить здесь >свои бредовые примеры.
А ты "крутой" только на клавиатуре?
DeepProg (2004-08-04 00:45:00) [2]А с чем, собственно, поговорить пытаетесь?
С модемом аль еще чем?
Reindeer Moss Eater (2004-08-03 16:29:00) [3]Почему я не могу считать с порта то что записал? Кто знает прошу подсказать.
А почему ТЫ должен прочитать то, что ТЫ записал в порт?
Причем и читаешь и пишешь ты в один и тот же порт.
Я бы еще понял нуль-модемный кабель и запись в com1 с чтением из com2.
PS не надо тупо и настойчиво алёкать. Не надо приводить здесь свои бредовые примеры.
Надо читать и разбирать примеры из документаци.
Прощай.
andrey__ (2004-08-03 16:24:00) [4]ало!
andrey__ (2004-08-03 11:29:00) [5]Давайте так. Я написал примерчик см. ниже. Поместите на форму кнопку и Label и скопируете пример в обработчик кнопки.
строка fl:=WriteFile(port,buf_out,strlen(buf_out),bc,nil);
выполняетсянормально: fl=true, bc=11 как и понимаю запись в порт произошла.
А вот строка fl:=ReadFile(port,buf_in,strlen(buf_out),bc,nil);
после ее выполнения: fl=true bc=0т.е. ничего не считал.
Почему я не могу считать с порта то что записал? Кто знает прошу подсказать.
procedure TForm1.Button1Click(Sender: TObject);
var
dcb:tDCB;
ct:COMMTIMEOUTS;
port:tHANDLE;
bc:DWORD;
buf_out:Pchar;
buf_in:Pchar;
fl:LongBool;
begin
buf_out:=StrNew('Test string');
dcb.DCBlength:=sizeof(tDCB);
BuildCommDCB('baud=9600 parity=N data=8 stop=1',dcb);
//dcb.fNull:=TRUE;
ct.ReadIntervalTimeout:=10;
ct.ReadTotalTimeoutMultiplier:=100;
ct.ReadTotalTimeoutConstant:=100;
ct.WriteTotalTimeoutMultiplier:=10;
ct.WriteTotalTimeoutConstant:=10;
port:=CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
SetCommState(port,dcb);
SetCommTimeouts(port,ct);
PurgeComm(port,PURGE_TXCLEAR or PURGE_RXCLEAR);
SetupComm(port,256,256);
buf_in:=HeapAlloc(GetProcessHeap(),0,strlen(buf_out)+1);
fl:=WriteFile(port,buf_out,strlen(buf_out),bc,nil);
if not fl then
beep;
fl:=ReadFile(port,buf_in,strlen(buf_out),bc,nil);
if not fl then
beep;
Label1.Caption:=string(buf_in);
HeapFree(GetProcessHeap(),0,buf_in);
CloseHandle(port);
end;
Reindeer Moss Eater (2004-08-02 14:15:00) [6]Возьми ссылку из поста 13 и щупай наздоровье.
Там пример тоже элементарный, но рабочий.
andrey__ (2004-08-02 13:51:00) [7]Я хотел прощупать механизмы работы с СОМ портами (так как текущая задача предполагает это), но у меня не работает даже элементарный пример:
andrey__ (27.07.04 14:41) [1]
Reindeer Moss Eater (2004-08-02 13:19:00) [8]Я что-то нить беседы терять начал.
Ты же асинхронную запись в порт отлаживаешь, а не чтение
Зачем тебе WaitCommEvent вообще?
andrey__ (2004-08-02 11:39:00) [9]Как я понял, переменная TransMask не инициализирует маску события, а служит для того чтобы в неё записывался результат - маска того события, которое произошло.
TransMask:=0;
WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие
само событие задаётся :
SetCommMask(CommHandle,EV_RXFLAG);
Reindeer Moss Eater (2004-08-02 10:39:00) [10]Вот чем:
SetCommMask(CommHandle,EV_RXFLAG);
А вот это кто писал?
TransMask:= 0;
fl:= WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
andrey__ (2004-08-02 10:35:00) [11]ало.
andrey__ (2004-07-30 17:08:00) [12]>Reindeer Moss Eater © (30.07.04 16:47) [30]
>А ты посмотри чем ты маску проинициализировал
Вот чем:
SetCommMask(CommHandle,EV_RXFLAG);
Reindeer Moss Eater (2004-07-30 16:47:00) [13]Дело в том что я не паподаю на строку
А ты посмотри чем ты маску проинициализировал
andrey__ (2004-07-30 16:15:00) [14]То что я понял:
procedure TForm1.FormCreate(Sender: TObject);
begin
Ovr.hEvent := CreateEventA(nil, False, False,'SendEvent');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
CloseHandle(Ovr.hEvent);
end;
procedure ReadComm;
var
Resive:array [0..255] of char;
fl :LongBool;
n, ErrorCode: Cardinal;
begin
while true do
begin
TransMask:=0;
fl:= WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
if not fl then
begin //1
ErrorCode := GetLastError;
if ErrorCode = ERROR_IO_PENDING then
if WaitForSingleObject(Ovr.hEvent, 5000) <> WAIT_OBJECT_0 then
begin //11
ErrorCode := GetLastError;
end //11
else
begin //12
if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие
begin //121
ClearCommError(CommHandle,Errs,@Stat);//сбрасываем флаг
Kols := Stat.cbInQue;
ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);//читаем
Form1.Panel1.Caption:=string(Resive);
end; //121
end; //12
end; //1
end;//while
end;
Дело в том что я не паподаю на строку
if (TransMask and EV_RXFLAG)=EV_RXFLAG then//проверяем нужное событие
Reindeer Moss Eater (2004-07-30 15:47:00) [15]Третью строчку поста 21 проситай вниметельно.
Особенно вторую её половину.
andrey__ (2004-07-30 15:19:00) [16]WaitCommEvent(CommHandle,TransMask,@Ovr);
постоянно выдаёт False, я TransMask равняется - 0;
Как мне тогда впоймать нужное событие?
anton. (2004-07-30 11:00:00) [17]нашел вот такой пример
wOverlapped.hEvent := CreateEventA(nil, False, False,‘SendEvent‘);
IsSended := WriteFile(hComm, Buff, SizeOf(Buff), ByteNum, @wOverlapped);
if not IsSended then begin
ErrorCode := GetLastError;
if ErrorCode = ERROR_IO_PENDING then begin
if WaitForSingleObject(wOverlapped.hEvent, TimeOut) <> WAIT_OBJECT_0 then begin
ErrorCode := GetLastError;
CloseHandle(wOverlapped.hEvent);
Reindeer Moss Eater (2004-07-30 10:53:00) [18]Это имелось в виду?
Это, но не только это.
Перед GetOverLappedResult надо дождаться пока просигналит евент
anton. (2004-07-30 10:40:00) [19]Мне нужно что бы хоть что то появилось на панели прием :-)
andrey__ (2004-07-30 10:25:00) [20]Это имелось в виду?
WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr);
if GetLastError = Error_IO_PENDING then
if not GetOverlappedResult(CommHandle,Ovr,n,true)then
ShowMessage(SysErrorMessage(GetLastError))
else