Искажение данных при чтении с COM порта
От: Alexei_z_  
Дата: 11.11.04 17:14
Оценка:
Всем доброго времени суток,
Возникла следующая проблема:
Есть класс, в нем такие функции для работы с COM портом:
int SerialPort::ReadData(unsigned char *buffer, const int buffer_size) // reads from port into buffer amount of bytes specified //by buffer_size 
{
    if(idCom == 0) return -1; //port is not opened
    unsigned long nbread;
    Sleep(100); // wait to meet COM port requirements
    if(!ReadFile(idCom, buffer, COMMAND_LENGTH, &nbread, NULL)) return -2; //if were errors during reading
    if(nbread != COMMAND_LENGTH) return -3; //if wrong amount of bytes was read
    return 0;
}

int SerialPort::WriteData(unsigned char *buffer, const int buffer_size) // writes into port from buffer amount of bytes specified by buffer_size 
{
    if(idCom == 0) return -1; //port not opened
    unsigned long nbread;
    Sleep(100); // wait to meet COM port requirements
    PurgeComm(idCom,PURGE_TXCLEAR); // clear output buffer
    // serial pooling
    if(!WriteFile(idCom, buffer, buffer_size, &nbread, NULL)) return -1; 

    PurgeComm(idCom,PURGE_RXCLEAR); // clear input buffer
    return 0;
}


Отсылаются данные по 4 байта через COM порт на другой компютер

Прога на другом компьютере принимает данные и их же возвращает назад. Прога иденитчная отпраляющей, за исключением того, что первая сначала пишет, потом читает, а вторая наоборот

Все это запускаю в цикле (на двух компах, соединенных через COM-порт — на одном — write\read, на другом -наоборот)
Цикл примерно такой :

    for (int k=0;k<50; k++)
    {

        line[0]= 0xF0; 
        line[1]= 0x23; 
        line[2]= 0x52; 
        line[3]= 0x35; 
        
        memcpy(line_to_compare, line, COMMAND_LENGTH);
        p_SerialPort->WriteData(line,COMMAND_LENGTH); //reset
        read_result = p_SerialPort->ReadData(line,COMMAND_LENGTH);
    }
    
    return 0;
}

Функция открытия порта:
int SerialPort::OpenPort(unsigned port)// Opens COM port with number "port"
    {

        char pcPort [5];
        sprintf(pcPort,"%s%i","COM",port);
        idCom = CreateFile(pcPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
        if(idCom == INVALID_HANDLE_VALUE) return -1; // if cannot open COM port
        if(!SetupComm(idCom, 4096, 4096)) return -3; // if cannot set port parameters 
        if(!GetCommState(idCom, &dcb)) return -3;  // loading "dcb" by default values 
    
        dcb.ByteSize = 8;
        dcb.BaudRate = 115200;
//        dcb.BaudRate = 1200;

        dcb.Parity = NOPARITY;
        dcb.StopBits = ONESTOPBIT;
        dcb.fDtrControl = DTR_CONTROL_DISABLE;
        if(!SetCommState(idCom, &dcb)) return -3; // if cannot set port parameters 

        if(!GetCommState(idCom, &dcb)) return -3; // if cannot set port parameters 

        if(!PurgeComm(idCom,PURGE_RXCLEAR)) return -3; // clear input   buffer
        if(!PurgeComm(idCom,PURGE_TXCLEAR)) return -3; // clear output  buffer

        return 0;
}

При приеме данных переодически возникает искажение данных, иногда потеря. C чем это связано?
Если соеденить контакты скрепкой, писать и читать одной программой — все работает идеально






12.11.04 05:06: Перенесено модератором из 'C/C++' — Павел Кузнецов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.