Sériový port ve Win API

Pokud je z nějakého důvodu nutné použít sériový port s rozhraním Win API liší se způsob oteření rozhraní, zápis a čtení je však identické až na jméno funkce. Jednoduché příkazy pro uložení/načtení jednoho bajtu lze zapozdřit podobně jako v serial např.

#include "prg_serial_winapi.h"
 
#ifndef BAUD_RATE
#define BAUD_RATE B115200
#endif
 
/// ----------------------------------------------------------------------------
HANDLE serialWinApi_open( LPCTSTR lpszDevice )
{
   DWORD dwInQueue = 16;
   DWORD dwOutQueue = 16;
 
   // Open the device
   HANDLE hFile = CreateFile(lpszDevice,
         GENERIC_READ|GENERIC_WRITE,
         0,
         0,
         OPEN_EXISTING,
         0,
         0);
 
   if (hFile == INVALID_HANDLE_VALUE)
   {
      return NULL;
   }
 
   if (!SetupComm( hFile, dwInQueue, dwOutQueue))
   {
      // error
      (void)serialWinApi_close( hFile );
      return NULL;
   }
 
   // Obtain the DCB structure for the device
   {
      DCB dcb;
      if (!GetCommState(hFile,&dcb))
      {
         // error
         (void)serialWinApi_close( hFile );
         return NULL;
      }
 
      // Set the new data
      dcb.BaudRate = (DWORD)(CBR_115200);
      dcb.ByteSize = (BYTE)(8);
      dcb.Parity   = (BYTE)(NOPARITY);
      dcb.StopBits = (BYTE)(ONESTOPBIT);
 
      // Set the new DCB structure
      if (!SetCommState(hFile,&dcb))
      {
         // Obtain the error code
         (void)serialWinApi_close( hFile );
         return NULL;
      }
   }
 
   // Return successful
   return hFile;
}
 
/// ----------------------------------------------------------------------------
int serialWinApi_close( HANDLE hSerial )
{
   // Close COM port
   CloseHandle( hSerial );
   return 1;
}
 
/// ----------------------------------------------------------------------------
int serialWinApi_putc( HANDLE hSerial, char c)
{
   DWORD dwWritten;
   DWORD dwRetVal;
   // Write the data
   dwRetVal = WriteFile(hSerial, &c, 1, &dwWritten, 0); 
   return dwWritten;
}
 
/// ----------------------------------------------------------------------------
int serialWinApi_getc( HANDLE hSerial, char * c)
{
 
   DWORD dwRead;
   DWORD dwRetVal;
   // Read the data
   dwRetVal = ReadFile(hSerial, c, 1, &dwRead, 0);
   return dwRetVal;
}

Příklad použít takové knihovny

#include "stdafx.h"
 
#include "windows.h"
#include "prg_serial_winapi.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
   char cChar;
   int iRetVal			= 0;
   LPCTSTR lpszDevice	= _T("\\\\.\\COM12");
 
   HANDLE hSerial		= serialWinApi_open( lpszDevice );
 
   iRetVal = serialWinApi_putc( hSerial, 'k' );
 
   while( serialWinApi_getc( hSerial, &cChar ) == 0 );
 
   if( cChar == 't' )
   {
      printf( "receive ok");
   } else {
      printf( "receive failed");
   }
 
   iRetVal = serialWinApi_close( hSerial );
 
   getchar();
   return 0;
}

Zdrojové soubory modulu prg_serial_winapi jsou dostupné v archivu prg_serial_winapi.zip.

courses/b3b36prg/tutorials/serial_winapi.txt · Last modified: 2018/02/06 17:18 (external edit)