Warning
This page is located in archive. Go to the latest version of this course pages.

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

courses:b3b36prg:tutorials:serial_winapi [2018/02/06 17:18]
courses:b3b36prg:tutorials:serial_winapi [2018/02/06 17:18] (current)
Line 1: Line 1:
 +{{indexmenu_n>​4200}}
 +===== 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 
 +[[courses:​b3b36prg:​tutorials:​serial|]] např.
 +
 +<code c>
 +#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;
 +}
 +</​code>​
 +
 +Příklad použít takové knihovny
 +
 +<code c>
 +#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;
 +}
 +</​code>​
 +
 +Zdrojové soubory modulu prg_serial_winapi jsou dostupné v archivu {{:​courses:​b3b36prg:​tutorials:​prg_serial_winapi.zip|}}.
courses/b3b36prg/tutorials/serial_winapi.txt · Last modified: 2018/02/06 17:18 (external edit)