⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm.cpp

📁 Win 32系统下的串行通信类。采用文件I/O函数提供的打开和关闭通信资源句柄及读写操作的基本接口。
💻 CPP
字号:
#define STRICT#include <windows.h>#include <stdio.h>#include <string.h>#include <stdlib.h>void PrintError( LPCSTR str ){   LPVOID lpMessageBuffer;   int error = GetLastError();   FormatMessage(      FORMAT_MESSAGE_ALLOCATE_BUFFER |      FORMAT_MESSAGE_FROM_SYSTEM,      NULL,      error,      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //The user default language      (LPTSTR) &lpMessageBuffer,      0,      NULL   );   printf("%s: (%d) %s\n",str,error,lpMessageBuffer);   LocalFree( lpMessageBuffer );}DWORD CALLBACK ConInThread( HANDLE h ){   // starts a user input thread using the console   //   // takes console characters and sends them to the com port   OVERLAPPED ov;   HANDLE hconn = GetStdHandle(STD_INPUT_HANDLE);   BOOL quit = FALSE;   ZeroMemory(&ov,sizeof(ov));   ov.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);   if(ov.hEvent == INVALID_HANDLE_VALUE) {      PrintError("CreateEvent failed");      SetCommMask(h,0);      return 0;   }   SetConsoleMode(hconn,0);   printf("press Esc to terminate\n");   do {      char buf[10];      DWORD read = 0;      // wait for user to type something      WaitForSingleObject(hconn,INFINITE);      // read the console buffer      if(!ReadConsole(hconn,buf,sizeof(buf),&read,NULL)) {         PrintError("ReadConsole failed");         quit  = TRUE;      }      if(read) {         DWORD write;         // check for Esc         for(write=0;write<read;write++) {            // terminate when Esc pressed            if( buf[write] == 0x1b ) {               quit = TRUE;               break;            }         }         // send it to the com port         if(write) {            if( !WriteFile(h,buf,write,&write,&ov) ) {               if(GetLastError() == ERROR_IO_PENDING) {                  if( !GetOverlappedResult(h,&ov,&write,TRUE) ) {                     PrintError("GetOverlappedResult failed");                     quit = TRUE;                  }               }            } else {               PrintError("WriteFile failed");               quit = TRUE;            }         }      }   } while(!quit);   // tell terminal thread to quit   SetCommMask(h,0);   return 0;}void Terminal( HANDLE h ){   HANDLE hconn = GetStdHandle(STD_OUTPUT_HANDLE);   DWORD mask;   DWORD id;   OVERLAPPED ov;   HANDLE hconin = CreateThread(NULL,0,ConInThread,h,0,&id);   if( hconin == INVALID_HANDLE_VALUE ) {      PrintError("CreateThread failed");      return;   }   CloseHandle(hconin);  // don't need this handle   ZeroMemory(&ov,sizeof(ov));   // create event for overlapped I/O   ov.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);   if(ov.hEvent == INVALID_HANDLE_VALUE)      PrintError("CreateEvent failed");   // wait for received characters   if(!SetCommMask(h,EV_RXCHAR))      PrintError("SetCommMask failed");   while( 1 ) {      // get the event mask      if( !WaitCommEvent(h,&mask,&ov) ) {         DWORD e = GetLastError();         if( e == ERROR_IO_PENDING ) {            DWORD r;            if( !GetOverlappedResult(h,&ov,&r,TRUE) ) {               PrintError("GetOverlappedResult failed");               break;            }         } else {            PrintError("WaitCommEvent failed");            break;         }      }      // if no event, then UI thread terminated with SetCommMask(h,0)      if( mask == 0 ) {         break;      }      if( mask & EV_RXCHAR) {         char buf[10];         DWORD read;         do {            read = 0;            if( !ReadFile(h,buf,sizeof(buf),&read,&ov) ) {               if( GetLastError() == ERROR_IO_PENDING ) {                  if( !GetOverlappedResult(h,&ov,&read,TRUE) ) {                     PrintError("GetOverlappedResult failed");                     break;                  }               } else {                  PrintError("ReadFile failed");                  break;               }            }            if(read)               WriteFile(hconn,buf,read,&read,NULL);         } while(read);      }      mask = 0;   }   CloseHandle(ov.hEvent);  // close the event}int main( int argc, char **argv ){   if(argc>1) {      // open port for overlapped I/O      HANDLE h = CreateFile(argv[1],                    GENERIC_READ|GENERIC_WRITE,                    0,NULL,                    OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);      if(h == INVALID_HANDLE_VALUE) {         PrintError("Failed to open port");      } else {         // set timeouts         COMMTIMEOUTS cto = { 2, 1, 1, 0, 0 };         DCB dcb;         if(!SetCommTimeouts(h,&cto))            PrintError("SetCommTimeouts failed");         // set DCB         memset(&dcb,0,sizeof(dcb));         dcb.DCBlength = sizeof(dcb);         dcb.BaudRate = 9600;         if(argc>2 && atoi(argv[2]) )            dcb.BaudRate = atoi(argv[2]);         dcb.fBinary = 1;         dcb.fDtrControl = DTR_CONTROL_ENABLE;         dcb.fOutxCtsFlow = 1;         dcb.fRtsControl = DTR_CONTROL_HANDSHAKE;         dcb.Parity = NOPARITY;         dcb.StopBits = ONESTOPBIT;         dcb.ByteSize = 8;         if(!SetCommState(h,&dcb))            PrintError("SetCommState failed");         // start terminal         Terminal(h);         CloseHandle(h);      }   } else {      printf("commtty port [speed]\n");   }   return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -