Конференция "WinAPI" » COM порт Win API. Проблемы с приёмом. [D7, WinXP]
 
  • PooHer (07.07.09 14:58) [20]
    cId := CreateFile(PChar('COM'+IntToStr(Num)),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

    SetCommMask(cId, EV_RXCHAR);


    Вот так было.
  • Сергей М. © (07.07.09 15:23) [21]

    > PooHer   (07.07.09 14:58) [20]


    Работа с маской событий вообще не нужна, равно как и Wait/ClearCommEvent
    Равно как лишен смысла и overlapped ввод-вывод в доп.потоке, не делающем более ничего существенного, кроме собственно ввода-вывода из/в СОМ-порт
  • PooHer (07.07.09 15:50) [22]

    > Работа с маской событий вообще не нужна, равно как и Wait/ClearCommEvent

    Ну а как тогда работать?
  • Вариант (07.07.09 15:55) [23]

    > PooHer   (07.07.09 15:50) [22]

    Если не нужна специфика работы с портом и подробная расшифровка специфичных ошибок, то достаточно ReadFile и WriteFile. Но настройка порта нужна.
  • Вариант (07.07.09 15:57) [24]

    > PooHer   (07.07.09 15:50) [22]

    Статьий глянь, их много в интернете. На королевстве дельфи посмотри, ссылки давал
  • PooHer (07.07.09 18:51) [25]
    Ну если просто вот так, в цикле сразу после передачи читать, должно работать?
    (Не смеяться, это просто в качестве эксперимента.
    procedure TForm2.Button4Click(Sender: TObject);

    var
    datas: string;
    dwWrite: DWORD;
    OverWrite: TOverlapped;
    //WriteBytes: array of Byte;
    //********************************
    Buf: array[0..1] of Char;
    dwRead, Read: DWORD;
    i: integer;
    //********************************
    begin
    //передача
    datas:='a';
    //dwWrite:=datas;
    OverWrite.hEvent := CreateEvent(nil, True, False, nil);
    if OverWrite.hEvent = Null then
    raise Exception.Create('Error creating write event');

    if (not WriteFile(cId, datas, SizeOf(datas),
    dwWrite, @OverWrite))
    and (GetLastError <> ERROR_IO_PENDING) then
    raise Exception.Create('Îøèáêà îòïðàâêè');

    //********************************
    //цикл приёма
    for i:=1 to 2000 do
    begin
    dwRead:=10;
    buf:='0';
    ReadFile(cId, Buf, dwRead, Read, nil);
    if Buf[0] <> '0' then
    panel1.caption:=string(Buf);
    end;
    //********************************
    end;

  • Вариант (08.07.09 06:48) [26]

    > PooHer   (07.07.09 18:51) [25]

    Не смеюсь.Нет, работать не будет. " В одну телегу впрячь не можно. Коня и трепетную лань." (с) А. С. Пушкин - это к тому, что есди ты используешь перектрытый ввод/вывод, открыл порт с флагом FILE_FLAG_OVERLAPPED, то и запись и чтение у тебя должны быть overlapped, а ты читать пытаешься синхронно.
    И потом, если ты делаешь overlapped(перекрытую) операцию ввода/вывода, то где -то и как-то надо получить и результат ее завершения - это значит использовать или GetOverlappedResult и/или WaitForSingleObject или WaitForMultipleObjects. И ты не читал статей ?

    Прочитай, выбери один какой-то вариант работы и доводи его до ума. А то у тебя тут куча вариантов, все разные. И ошибки появляются снова и не уходят из-за этого.
  • Сергей М. © (08.07.09 10:26) [27]

    > PooHer   (07.07.09 18:51) [25]


    Зачем тебе overlapped ввод-вывод ?
    Не нужен он тебе вообще.
    Не усложняй себе жизнь.
 
Конференция "WinAPI" » COM порт Win API. Проблемы с приёмом. [D7, WinXP]
Есть новые Нет новых   [134433   +25][b:0][p:0.001]