Используй стандартные функции API:
в Builder5 работа с портом происходит аналогично работа с файлом...
DCB m_dcb;
HANDLE m_hCom;// handle to the comm port.
// Параметры инициализации по умолчанию
m_dcb.DCBlength = sizeof(DCB);
m_dcb.BaudRate =9600;
m_dcb.ByteSize =8;
m_dcb.Parity =NOPARITY; //NOPARITY and friends are #defined in
//windows.h
m_dcb.StopBits =ONESTOPBIT; //ONESTOPBIT is also from windows.h
// Работа с портом происходит аналогично работе с файлом
m_hCom = CreateFile(m_CommPort.c_str(),
GENERIC_READ | GENERIC_WRITE,
0, /* comm devices must be opened w/exclusive-access */
NULL, /* no security attrs */
OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */
0, /* not overlapped I/O */
NULL /* hTemplate must be NULL for comm devices */
);
// Если файл не открыть:
// 1. Порт уже открыт
// 2. Порт не существует
if(m_hCom == INVALID_HANDLE_VALUE)
//throw ECommError(ECommError::OPEN_ERROR);
{
Application->MessageBoxA("Порт 1(или он не существует) открыт, закройте его и перезапустите программу","Внимание",MB_OK);
Application->Terminate();
return;
}
// получаем структуру DCB порта, который мы открыли
if(!GetCommState(m_hCom,&m_dcb))
{
CloseHandle(m_hCom);
throw ECommError(ECommError::GETCOMMSTATE);
}
// Теперь копируем наши параметры в структуру DCB порта
m_dcb.BaudRate = tempDCB.BaudRate;
m_dcb.ByteSize = tempDCB.ByteSize;
m_dcb.Parity = tempDCB.Parity;
m_dcb.StopBits = tempDCB.StopBits;
// устанавливаем наши параметры
if(!SetCommState(m_hCom,&m_dcb))
{
CloseHandle(m_hCom);
throw ECommError(ECommError::SETCOMMSTATE);
}
// устанавливаем размер буферов приема и передачи
if(!SetupComm(m_hCom, 1024*32, 1024*9))
{
CloseHandle(m_hCom);
throw ECommError(ECommError::SETUPCOMM);
}
И усе. Теперь работаем как с файлом
Посылка:
// записываем в буфер передачи и сразу отправляем
VerifyOpen();
DWORD dummy;
BYTE *ptr = buffer;
for (unsigned int j=0; j
// Ожидаем когда байт будет послан
FlushCommPort();
++ptr;
}
Прием:
// чтение буфера приема
int ReadBytes(BYTE *buffer, unsigned int MaxBytes)
{
VerifyOpen();
DWORD bytes_read;
if(!ReadFile(m_hCom,buffer,MaxBytes,&bytes_read,NULL))
throw ECommError(ECommError::READ_ERROR);
// Если кол-во считанных байт больше чем нужно
if(bytes_read < MaxBytes)
buffer[bytes_read]='\0';
return bytes_read;
}
Igor Korataev
Предыдущий вопрос
|
|
Следующий вопрос
источник
by jenyok
|