Тема: RS232 com port
Показать сообщение отдельно
Старый 02.10.2008, 09:05   #19  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Вот несколько функций для работы с com портом на С++ Builder.
Мож что пригодиться.
X++:
DCB dcb;
HANDLE hComm;

//Установка настроек com-порта
bool __fastcall InstallComm(int iPort) //номер порта
{
  BOOL fSuccess;
  char szCommPattern[8];
  if (iPort == 0)
    return false;
  sprintf(szCommPattern, "COM%d", iPort);
  hComm = CreateFile(szCommPattern,
      GENERIC_READ | GENERIC_WRITE,0,0,
      OPEN_EXISTING,0,0);
  if (hComm == INVALID_HANDLE_VALUE)
    return false;
  fSuccess = GetCommState(hComm, &dcb);
  if (!fSuccess)
    return false;
  dcb.BaudRate = CBR_57600;
  dcb.ByteSize = 8;
  dcb.fParity = FALSE;
  dcb.Parity = NOPARITY;
  dcb.StopBits = TWOSTOPBITS;
  dcb.fOutxCtsFlow = FALSE;
  dcb.fOutxDsrFlow = FALSE;
  dcb.fDtrControl = DTR_CONTROL_DISABLE;
  dcb.fDsrSensitivity = FALSE;
  dcb.fRtsControl = RTS_CONTROL_DISABLE;
  fSuccess = SetCommState(hComm, &dcb);
  if (!fSuccess)
    return false;
  SetupComm(hComm, 1024, 1024);
  COMMTIMEOUTS TO;
  TO.ReadIntervalTimeout = 80;// 50
  TO.ReadTotalTimeoutMultiplier = 1;  ///1
  TO.ReadTotalTimeoutConstant = 100; ///500
  TO.WriteTotalTimeoutMultiplier = 200; ///10
  TO.WriteTotalTimeoutConstant = 2000; ///100
  SetCommTimeouts(hComm, &TO);
  return true;
}
//Запись в com-порт
bool __fastcall WriteBuffer(byte* lpBufWrite,DWORD dwToWrite)
{
DWORD dwWritten;
GetCommState(hComm,&dcb);
dcb.fDtrControl=DTR_CONTROL_DISABLE;
SetCommState(hComm,&dcb);
GetCommState(hComm,&dcb);
dcb.fDtrControl=DTR_CONTROL_ENABLE;
SetCommState(hComm,&dcb);
  for(unsigned i=0;i<dwToWrite;i++)
  {
    if (i==dwToWrite-1)
    {
      GetCommState(hComm,&dcb);
      dcb.fDtrControl=DTR_CONTROL_DISABLE;
      SetCommState(hComm,&dcb);
    }
    WriteFile(hComm,lpBufWrite+i,1,&dwWritten,NULL);
    Sleep(1);
  }
  return true;
}

//-------------------------------------------------------------------------------
//Чтение из com-порта
int __fastcall ReadBuffer(byte* lpBufRead,DWORD dwToRead)
{
  DWORD dwRead=0;
  Sleep(2);
  ReadFile(hComm,lpBufRead,dwToRead,&dwRead,NULL);//Читаем буффер
  PurgeComm(hComm,PURGE_RXCLEAR);//Очищаем буффер
  return dwRead;
}

//Использование

DWORD dwBytesReceived;
byte  buf[64];
dwBytesReceived = ReadBuffer((char *)buf,13);

byte OutText[22];
  OutText[0]=adr;
-----------------
  OutText[22]= X;
WriteBuffer(OutText,22);
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.