COMPORT ошибка последнего байта
От: 0x64Rm  
Дата: 13.11.03 08:40
Оценка:
Добрый день,

Выполняю передачу-прием по COM порту, иногда возникает ошибка приема последнего байта.
т.е. счетчик приема показывает что он пришел, а фактически в буффере памяти значение старое, не обновленное.
Если после приема данных поставить время общей задержки Sleep(10) все срабатывает нормально.
Если увеличить передаваемые-принимаемые данные на один dummy байт и просто гонять его по вместе с данными, то тоже проблема решается. Но не ставить же эти заглушки. Что делать? Кто сталкивался с подобным прошу ответте. Времени очень мало.
Алексей.
с уважением,
Алексей
Re: COMPORT ошибка последнего байта
От: DAY_NEW Россия  
Дата: 13.11.03 08:52
Оценка:
Здравствуйте, 0x64Rm, Вы писали:

R>Добрый день,


R>Выполняю передачу-прием по COM порту, иногда возникает ошибка приема последнего байта.

R>т.е. счетчик приема показывает что он пришел, а фактически в буффере памяти значение старое, не обновленное.
R>Если после приема данных поставить время общей задержки Sleep(10) все срабатывает нормально.
R>Если увеличить передаваемые-принимаемые данные на один dummy байт и просто гонять его по вместе с данными, то тоже проблема решается.

Ставишь ли ты явно таймауты ? если нет то почитай в MSDN статью "Configuring Time-Outs"
Re[2]: COMPORT ошибка последнего байта
От: 0x64Rm  
Дата: 13.11.03 09:04
Оценка:
DAY>Ставишь ли ты явно таймауты ? если нет то почитай в MSDN статью "Configuring Time-Outs"

ставлю, ставлю явно. вот последний вариант. перепробовано много вариантов установки структуры COMMTIMEOUTS

    COMMTIMEOUTS ctmoCommPort;            
    if(!GetCommTimeouts(hComPort, &ctmoCommPort)) return GetLastError();
    ctmoCommPort.ReadIntervalTimeout        = MAXDWORD;
    ctmoCommPort.ReadTotalTimeoutConstant        = 1;
    ctmoCommPort.ReadTotalTimeoutMultiplier        = 1;
    ctmoCommPort.WriteTotalTimeoutConstant        = 0;
    ctmoCommPort.WriteTotalTimeoutMultiplier    = 0;
    if(!SetCommTimeouts(hComPort, &ctmoCommPort)) return GetLastError();


Еще ошибки нет, когда читаю по 1 байту, т.е. по приходу 1 байта на порт сразу его забираю

Примерно так читаю (много кода уже порезал...)

DWORD CComPort::ReadFromPort(LPCVOID buffer, DWORD lenght)
{
    if(!hComPort) return -1;

    DWORD Tmp = 0;
    DWORD Cnt = 0;

    memset((void*) buffer, 77, lenght); // debug

    byte *pB = (byte*) buffer;
    byte p = 0;

    while(Cnt < lenght)
    {
        DWORD res = ReadFile(hComPort, &p, 1, &Tmp, NULL);    
//        Sleep(10);
        if(Tmp)
        {
            pB[Cnt] = p;
            Cnt +=Tmp;
        }
    };
    return 0;
}
с уважением,
Алексей
Re[3]: COMPORT ошибка последнего байта
От: 0x64Rm  
Дата: 13.11.03 09:07
Оценка:
пардон выше был код вроде как нормально работающий
вот функция для чтения, когда получается такая ошибка.
от скорости передачи не зависит. это уже проверил


    DWORD res = ReadFile(hComPort, buffer, lenght, &Tmp, NULL);
с уважением,
Алексей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.