![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Com порт, срочно помогите, pls, вторую неделю бьёмся ... [D7, Win2k]
UVV © (2004-10-15 15:29:00)Ребят, срочно помогите, pls, вторую неделю бьёмся с напарником...
В чём ошибка? Мы не можем прочитать данные!
ComPort := CreateFile(PChar(COM.Text),
GENERIC_READ+GENERIC_WRITE,
FILE_SHARE_READ+FILE_SHARE_WRITE,
nil, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0);
GetCommState(ComPort, ComParams);
GetCommTimeouts(ComPort, ComTimeOuts);
GetCommMask(ComPort, ComMask);
ComParams.BaudRate := 38400;// Скорость
ComParams.ByteSize := 8;// Размер байта
ComParams.Parity := 0;// Чётность
ComParams.StopBits := 1;
ComTimeOuts.ReadIntervalTimeout := 100;
ComTimeOuts.ReadTotalTimeoutMultiplier := 10;
ComTimeOuts.ReadTotalTimeoutConstant := 1000;
ComTimeOuts.WriteTotalTimeoutMultiplier := 10;
ComTimeOuts.WriteTotalTimeoutConstant := 1000;
ComMask := EV_RXCHAR;
SetupComm(ComPort, 32768, 32768);
SetCommState(ComPort, ComParams);
SetCommTimeouts(ComPort, ComTimeOuts);
SetCommMask(ComPort, ComMask);
// Записываем данные
var
s: String;
n: Cardinal;
ovr: TOverlapped;
s := SendText.Text;
FlushFileBuffers(ComPort);
WriteFile(ComPort, s, Length(s), n, @ovr);
if GetLastError <> ERROR_IO_PENDING then MemoTesting.Lines.Add('Ошибка!');
if GetOverlappedResult(ComPort, Ovr, n, False) then
MemoTesting.Lines.Add('Записанных байт ' + IntToStr(n));
// Читаем данные
var
BytesRead: Cardinal;
m: String;
i: Byte;
ClearCommError(ComPort, Err, @ComStat);
MemoTesting.Lines.Add('Буфер ' + IntToStr(ComStat.cbInQue));
m := '';
FlushFileBuffers(ComPort);
for i := 1 to 18 do ReadFile(ComPort, m[i], 1, BytesRead, @ovr);
if GetLastError = ERROR_IO_PENDING then MemoTesting.Lines.Add('Ошибка!');
MemoTesting.Lines.Add(m);
if GetOverlappedResult(ComPort, Ovr, DWORD(BytesRead), False) then
MemoTesting.Lines.Add('Прочитанных байт ' + IntToStr(BytesRead));
В чём ошибка в процедуре чтения?
Cashmare (2004-10-20 12:01:00) [1]Попробуй заменить FILE_FLAG_OVERLAPPED на FILE_ATTRIBUTE_NORMAL. Вроде когда-то помогало...
GuAV (2004-10-16 14:25:00) [2]
> GENERIC_READ+GENERIC_WRITE а
> GENERIC_READ or GENERIC_WRITE
В данном случае возможно без разницы но флаги лучше складывать черезorа то вдруг у них общие биты есть.
jack128 (2004-10-16 13:54:00) [3]tesseract (16.10.04 12:07) [7]
GENERIC_READ+GENERIC_WRITE а
GENERIC_READ or GENERIC_WRITE
без разницы.
tesseract (16.10.04 12:07) [7]
во WriteFile с типом String - таккая хрень в порт отправиться может - не поверишь.
"ты просто не умеешь их готовить" (с)
VMcL (2004-10-16 13:46:00) [4]>> OSokin © (16.10.04 13:18) [8]
В Win2k? Ну-ну.
OSokin (2004-10-16 13:18:00) [5]А лучше через асму:
procedure WriteToPort(port,data:byte);assembler;
asm
out port,data
function ReadFromPort(port:byte):byte;
var temp:byte;
begin
asm
int temp,port
end;
Result:=temp;
end;
Тока во второй я чето намудрил
tesseract (2004-10-16 12:07:00) [6]в CreateFile надо не
GENERIC_READ+GENERIC_WRITE а
GENERIC_READ or GENERIC_WRITE
во WriteFile с типом String - таккая хрень в порт отправиться может - не поверишь.
FlushFileBuffers(ComPort);
for i := 1 to 18 do ReadFile(ComPort, m[i], 1, BytesRead, @ovr);
//
Зачем ?
var
rb:PChar
begin
GetMem(rb,BytesNeed);
REadFile (Comport,rb^,BytesNeed,BytesREad,@ovr);
if GetLastError = ERROR_IO_PENDING then if
begin
res:=WaitForSingleObject(ovr.hEvent,infinity);
if res==WAIT_OBJECT_0 then
GetOverlappedResult(ComPort, Ovr, DWORD(BytesRead), true) then
Begin
MemoTesting.Lines.Add('Прочитанных байт ' + IntToStr(BytesRead));
PChar(Result):=rb;
end;
end;
end;
Да и повесь PortMon от SysInternals - хоть посмотришь что у тебя реально приходит/уходит
Анатолий (2004-10-15 16:25:00) [7]Про асинхронные операции там ближе к концу статьи, дочитайте.. :)
Анатолий (2004-10-15 16:22:00) [8]Создать Event можно так:
FillChar(Ovr, SizeOf(Ovrl), #0);
Ovr.hEvent := CreateEvent(nil, False, False, nil);
И посмотрите-ка http://bcb.net.ru/article/hard/index003.html
ИМХО, там найдете ответ.
UVV (2004-10-15 16:06:00) [9]А пример...
Анатолий (2004-10-15 16:03:00) [10]
> UVV ©
В структуре Overlapped создать Event?
UVV (2004-10-15 15:49:00) [11]Нет, просто считывается 0 байт!!!!
-=SS=- (2004-10-15 15:46:00) [12]Програма зависает ?