С++: Win32: Особенности чтения информации с КОМ порта используя WIn API

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by carnage, 27 Feb 2008.

  1. carnage

    carnage New Member

    Joined:
    20 Feb 2008
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    С++: Win32: Особенности асинхронного чтения информации с КОМ порта используя Win API

    Всем привет. Извиняюсь за кривой код, я не программер.В общем есть проблемка,может кто 4то подскажет, буду признателен.

    1) При первом запуске программы, И посылании телеграммы все работает кошерно.
    2) Если же припервом запуске проги не подана телеграмма, И функция WaitForSingleObject ожидает обьект не дождавшись передает управление дальше, затем после цыкла while(byte_count<len) когда все повторяется происходит вот 4то:

    Согласно примеру функции асинхронного 4тения данных из порта(используя WinAPI), если моя телеграмма приходит в момент времени до вызова функции WaitForSingleObject, то я 4ерез дебаггер вижу 4то данные помещены в буфер, однако моя фукция GetOverlappedResult не выполняется (так как ветка иф не туда идет). Полу4ается мой алгоритм работает только тогда когда активна (в ожидании в те4ении времени(последний аргумент)) функция WaitForSingleObject. Я же боюсь 4то вдруг если устройство пошлёт телеграмму до выполнения этой функции, тогда я ее про4есть не смогу.
    Полу4ается WaitForSingleObject ждет, ждет данных И уходит с тайм аутом, хотя приемные данные вроде как в буфере. При4ем придальнейшем прогоне проге в цикле по томуже алгоритму, иногда WaitForSingleObject хавает мою телеграмму. Закономерности я впоймать немогу. Такое впя4атление 4то порт работает нестабильно в режиме 4тения, хотя запись в него идет на УРА. Для посылания телеграммы я исползовал прогу HyperTerminal. Да И 4тение я производил 4ерез (USB) в режиме емуляции COM порта(Проверит’ 4тение с COM1 пока не представляется возможным), может в етом И кроется при4ина моих боков?
    COM1 посылает данные (HyperTERminal не может работать с USB(COM7)) а 4ерез COM7 с помощ’ю моей проги 4итаю данные. Полу4ается как бы петля.

    Кусок проги (функция отве4ающая за 4тение) вот.
    Крыпным текстом выделены те фрагменты функции,которые имеют прямое отношение к вопросу


    RdBuffer IOP_comPort::getMsg()
    {
    // declaration
    DWORD num_bytes_ok;
    OVERLAPPED Event;

    unsigned char rd_buf[COM_BUF_SIZE];
    int stop = 0;
    int len = 6; // potom eto zna4enie vytjagivaetsja iz telegrammy
    int byte_count = 0;


    num_bytes_ok = 0;

    memset(&Event, 0, sizeof(Event)); Event.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
    while(byte_count<len)
    {
    ReadFile(hPort, rd_buf, COM_BUF_SIZE, &num_bytes_ok, &Event);

    if(WaitForSingleObject(Event.hEvent,m_timeOut)==WAIT_OBJECT_0)
    { GetOverlappedResult(hPort,&Event, &num_bytes_ok, FALSE);
    Status.Read_GetOverlappedResult = GetLastError();
    }

    else
    {
    // Error
    }

    for (int j=0;j<num_bytes_ok;j++)
    m_rd_buf.buf[j+byte_count]=rd_buf[j];

    byte_count +=num_bytes_ok;
    decodeMsg(len, Status.Read_GetOverlappedResult);
    }


    return m_rd_buf;
    }
     
    #1 carnage, 27 Feb 2008
    Last edited: 27 Feb 2008
  2. LynXzp

    LynXzp Elder - Старейшина

    Joined:
    21 Oct 2007
    Messages:
    147
    Likes Received:
    22
    Reputations:
    0
    Не вчитывлася, нет сейчас времени. Вот мой код который нормально работает.
    Посмотри может поможет. Х.м. у меня немного не так.. : )

    bool WriteCPort(unsigned char* buf_in, DWORD cnt)
    {
    DWORD numbytes_ok;
    WriteFile(port, buf_in, cnt, &numbytes_ok, NULL);
    if (cnt!=numbytes_ok) return false;
    else return true;
    }
    bool ReadCPort(unsigned char* buf_in, DWORD cnt)
    {
    DWORD numbytes_ok;
    ReadFile(port, buf_in, cnt, &numbytes_ok, NULL);
    if (cnt!=numbytes_ok) return false;
    else return true;
    }

    Перед этим открываю порт.
     
  3. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    http://www.intuit.ru/department/pl/cil/12/2.html
     
  4. carnage

    carnage New Member

    Joined:
    20 Feb 2008
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Я дополнил и подправил свое первое сообщение, может быть поможет.

    LynXzp, спасибо , но алгоритм похож на синхронное 4тение. На крайняк попробую и его.
    Delimiter спасибо за линк, доступно икратко написано, кое-4то я для себя новое нашел, но ето не решает моей проблеммы.
     
  5. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    :D ..... видимо невнимательно читал
    своместное использование этих функций я не нашел.... может это чисто твои измышления!

    Какой смысл в использовании обеих функций? Обьясни плиз!
     
    #5 Delimiter, 27 Feb 2008
    Last edited: 27 Feb 2008
  6. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    ... пацаны я невруливаю ваще о чем речь ......
     
  7. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    :D об асинхронных операциях на ком порте