使用CSerial类的一个有关问题,求大神速进
使用CSerial类的一个问题,求大神速进!
先给出代码吧
先给出代码吧
- C/C++ code
#define STRICT #include <tchar.h> #include <windows.h> #include <stdio.h> #include <string.h> #include <Serial.h> int ShowError (LONG lError, LPCTSTR lptszMessage) { TCHAR tszMessage[256]; wsprintf(tszMessage,_T("%s\n(error code %d)"), lptszMessage, lError); ::MessageBox(0,tszMessage,_T("Listener"), MB_ICONSTOP|MB_OK); return 1; } int __cdecl _tmain (int /*argc*/, char** /*argv*/) { CSerial serial; LONG lLastError = ERROR_SUCCESS; lLastError = serial.Open(_T("COM4"),0,0,true); //就是这个地方,可不可以实现执行程序的时候,先给一个printf("请输入COM口"),然后记录下来,再到这里使用? if (lLastError != ERROR_SUCCESS) return ::ShowError(serial.GetLastError(), _T("Unable to open COM-port")); lLastError = serial.Setup( CSerial::EBaud9600, CSerial::EData8, CSerial::EParNone, CSerial::EStop1); if (lLastError != ERROR_SUCCESS) return ::ShowError(serial.GetLastError(), _T("Unable to set COM-port setting")); lLastError = serial.SetMask(CSerial::EEventBreak | CSerial::EEventCTS | CSerial::EEventDSR | CSerial::EEventError | CSerial::EEventRing | CSerial::EEventRLSD | CSerial::EEventRecv); if (lLastError != ERROR_SUCCESS) return ::ShowError(serial.GetLastError(), _T("Unable to set COM-port event mask")); lLastError = serial.SetupReadTimeouts(CSerial::EReadTimeoutNonblocking); if (lLastError != ERROR_SUCCESS) return ::ShowError(serial.GetLastError(), _T("Unable to set COM-port read timeout.")); HANDLE hevtOverlapped = ::CreateEvent(0,TRUE,FALSE,0);; if (hevtOverlapped == 0) return ::ShowError(serial.GetLastError(), _T("Unable to create manual-reset event for overlapped I/O.")); OVERLAPPED ov = {0}; ov.hEvent = hevtOverlapped; bool fContinue = true; lLastError = serial.WaitEvent(&ov); if(lLastError != ERROR_SUCCESS) { return ::ShowError(serial.GetLastError(), _T("Unable to wait for a COM-port event.")); } printf("Wait event started.\n"); do { switch (::WaitForSingleObject(hevtOverlapped,INFINITE)) { case WAIT_OBJECT_0: { const CSerial::EEvent eEvent = serial.GetEventType(); if (eEvent & CSerial::EEventBreak) { printf("\n### BREAK received ###\n"); } if (eEvent & CSerial::EEventCTS) { printf("\n### Clear to send %s ###\n", serial.GetCTS()?"on":"off"); } if (eEvent & CSerial::EEventDSR) { printf("\n### Data set ready %s ###\n", serial.GetDSR()?"on":"off"); } if (eEvent & CSerial::EEventError) { printf("\n### ERROR: "); switch (serial.GetError()) { case CSerial::EErrorBreak: printf("Break condition"); break; case CSerial::EErrorFrame: printf("Framing error"); break; case CSerial::EErrorIOE: printf("IO device error"); break; case CSerial::EErrorMode: printf("Unsupported mode"); break; case CSerial::EErrorOverrun: printf("Buffer overrun"); break; case CSerial::EErrorRxOver: printf("Input buffer overflow"); break; case CSerial::EErrorParity: printf("Input parity error"); break; case CSerial::EErrorTxFull: printf("Output buffer full"); break; default: printf("Unknown"); break; } printf(" ###\n"); } if (eEvent & CSerial::EEventRing) { printf("\n### RING ###\n"); } if (eEvent & CSerial::EEventRLSD) { printf("\n### RLSD/CD %s ###\n", serial.GetRLSD()?"on":"off"); } if (eEvent & CSerial::EEventRecv) { DWORD dwBytesRead = 0; char szBuffer[101]; do { lLastError = serial.Read(szBuffer,sizeof(szBuffer)-1,&dwBytesRead); if (lLastError != ERROR_SUCCESS) return ::ShowError(serial.GetLastError(), _T("Unable to read from COM-port.")); if (dwBytesRead > 0) { szBuffer[dwBytesRead] = '\0'; printf("%x", szBuffer); if (strchr(szBuffer,'\n')) fContinue = false; } } while (true); } } break; case WAIT_ABANDONED: { fContinue = false; } break; default: { return ::ShowError(serial.GetLastError(), _T("Error while calling WaitForMultipleObjects.")); } break; } } while (fContinue); serial.Close(); return 0; }