這次終於成功寫出來簡易console版本
有實際上跟設備連接側試過
編譯工具:Dev-C++
註解沒有,詳情請洽MSDN!
別人都只講長篇大論,至少我還有一個可以用的完整可以看。
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
DWORD WINAPI ReadProc(LPVOID);
HANDLE hCom;
OVERLAPPED osRead = {0}, osWrite = {0};
int main(void)
{
HANDLE ReadThread;
DWORD dwError,dw;
DCB PortDCB;
COMMTIMEOUTS TimeOuts;
char ComName[15];
int PortNum = 1;
PortNum > 9 ? sprintf(ComName, "\\\\.\\COM%d", PortNum) : sprintf(ComName, "COM%d", PortNum);
hCom=CreateFile(ComName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
if(hCom == INVALID_HANDLE_VALUE)
{
dwError=GetLastError( );
cout << "Get Error: " << dwError;
cout << "\n Create COM1 failed\n";
return 0;
}
if ( !SetupComm( hCom, 1024, 128 ) )
{
dwError=GetLastError( );
cout << "Get Error: " << dwError;
cout << "\n Set Comm buffer failed\n";
return 0;
}
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
TimeOuts.WriteTotalTimeoutMultiplier=10;
TimeOuts.WriteTotalTimeoutConstant=1000;
if( !SetCommTimeouts(hCom, &TimeOuts) )
{
dwError = GetLastError( );
cout << "Get Error: " << dwError;
cout << "\n Set Timeout failed\n";
return 0;
}
GetCommState(hCom, &PortDCB);
PortDCB.BaudRate = CBR_115200;
PortDCB.ByteSize = 8;
PortDCB.Parity = NOPARITY;
PortDCB.StopBits = ONESTOPBIT;
if( !SetCommState(hCom, &PortDCB) )
{
dwError = GetLastError( );
cout << "Get Error: " << dwError;
cout << "\n Set DCB failed\n";
return 0;
}
if ( !SetCommMask(hCom, EV_RXCHAR) )
{
dwError = GetLastError( );
cout << "Get Error: " << dwError;
cout << "\n SetCommMask failed\n";
return 0;
}
osRead.hEvent = CreateEvent(NULL, true, false, NULL);
if ( osRead.hEvent == NULL )
{
dwError = GetLastError( );
cout << "Get Error: " << dwError;
cout << "\n Create Read Event failed\n";
return 0;
}
osWrite.hEvent = CreateEvent(NULL, true, false, NULL);
if ( osWrite.hEvent == NULL )
{
dwError = GetLastError( );
cout << "Get Error: " << dwError;
cout << "\n Create Write Event failed\n";
return 0;
}
ReadThread = CreateThread(NULL, 0, ReadProc, NULL, 0, &dw);
while(1)
{
char output;
DWORD dwWrite;
dwWrite = 1;
fflush(stdin);
output = getch();
if ( output == VK_ESCAPE )
break;
if (!WriteFile(hCom, &output, 1, &dwWrite, &osWrite))
{
//cout << "Write Error" << endl;
//break;
}
}
CloseHandle(ReadThread);
CloseHandle(hCom);
return 0;
}
DWORD WINAPI ReadProc(LPVOID lpParam)
{
char Byte;
DWORD CommEvent, dwByte, dwE;
while(1)
{
// Wait for an event to occur for the port.
if( WaitCommEvent(hCom, &CommEvent, NULL) )
{
do
{
if ( ReadFile(hCom, &Byte, 1, &dwByte, &osRead) )
if( dwByte > 0 )
cout << Byte;
} while (dwByte);
}
}
return 0;
}
浙公网安备 33010602011771号