Всем доброго времени суток,
Возникла следующая проблема:
Есть класс, в нем такие функции для работы с 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++' — Павел Кузнецов