Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.48 MB
Время: 0.03 c
14-1100384582
Змей
2004-11-14 01:23
2004.11.28
MailSlot


3-1098956673
YuRock
2004-10-28 13:44
2004.11.28
Странное поведение функции в Oracle 8i


4-1093466109
Powerland
2004-08-26 00:35
2004.11.28
перехват


4-1097749426
Jetus
2004-10-14 14:23
2004.11.28
Послать сообщение другой программе


3-1099026231
dolmat
2004-10-29 09:03
2004.11.28
работа с Bollean через IBQuery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский