Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
ВнизCom порт, срочно помогите, pls, вторую неделю бьёмся ... Найти похожие ветки
← →
UVV © (2004-10-15 15:29) [0]Ребят, срочно помогите, 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));
В чём ошибка в процедуре чтения?
← →
-=SS=- (2004-10-15 15:46) [1]Програма зависает ?
← →
UVV © (2004-10-15 15:49) [2]Нет, просто считывается 0 байт!!!!
← →
Анатолий (2004-10-15 16:03) [3]
> UVV ©
В структуре Overlapped создать Event?
← →
UVV © (2004-10-15 16:06) [4]А пример...
← →
Анатолий (2004-10-15 16:22) [5]Создать Event можно так:
FillChar(Ovr, SizeOf(Ovrl), #0);
Ovr.hEvent := CreateEvent(nil, False, False, nil);
И посмотрите-ка http://bcb.net.ru/article/hard/index003.html
ИМХО, там найдете ответ.
← →
Анатолий (2004-10-15 16:25) [6]Про асинхронные операции там ближе к концу статьи, дочитайте.. :)
← →
tesseract (2004-10-16 12:07) [7]в 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 - хоть посмотришь что у тебя реально приходит/уходит
← →
OSokin © (2004-10-16 13:18) [8]А лучше через асму:
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;
Тока во второй я чето намудрил
← →
VMcL © (2004-10-16 13:46) [9]>>OSokin © (16.10.04 13:18) [8]
В Win2k? Ну-ну.
← →
jack128 © (2004-10-16 13:54) [10]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 - таккая хрень в порт отправиться может - не поверишь.
"ты просто не умеешь их готовить" (с)
← →
GuAV © (2004-10-16 14:25) [11]
> GENERIC_READ+GENERIC_WRITE а
> GENERIC_READ or GENERIC_WRITE
В данном случае возможно без разницы но флаги лучше складывать черезor
а то вдруг у них общие биты есть.
← →
Cashmare (2004-10-20 12:01) [12]Попробуй заменить FILE_FLAG_OVERLAPPED на FILE_ATTRIBUTE_NORMAL. Вроде когда-то помогало...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c