Warning
This page is located in archive.

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] (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)