Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2004.11.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
1-1100358113
cfytr
2004-11-13 18:01
2004.11.28
Алгоритм заполнения массива


8-1093835847
SNV-Soft
2004-08-30 07:17
2004.11.28
Как загрузить в Bitmap изображение из файлов jpeg, gif, и тд.


1-1100264276
klerk
2004-11-12 15:57
2004.11.28
Про удаление файлов


9-1090874908
RyDmi
2004-07-27 00:48
2004.11.28
Для чего нужен параметр doWaitVBlank в DXDRAW?


14-1099615084
Кто---то
2004-11-05 03:38
2004.11.28
Где взять структуру tft-шрифта На Дельфи ?