📄 comm.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 + -