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

📄 winasync.c

📁 这是经典的卫星编程应用程序
💻 C
字号:
#pragma pack(8)
#include <windows.h>
#include <winbase.h>
#include "g7to.h"
#define PROCX

DCB dcb;
HANDLE hCom;
HANDLE inH;
DWORD BaudRate;
DWORD ByteSize;
DWORD Parity;
DWORD StopBits;
DWORD CmodeSave;
COMMTIMEOUTS lpCommTimeouts;
int console_is_on=0;

PROCX void AsyncSet(int wBaudRate, INT wByteSize, INT wStopBits, INT wParity)
{
	BOOL fSuccess;
	DWORD dwError;

	dcb.BaudRate = wBaudRate;
	dcb.ByteSize = wByteSize;
	dcb.StopBits = wStopBits;
	dcb.Parity = wParity;
	dcb.fRtsControl=RTS_CONTROL_ENABLE;
	dcb.fDtrControl=DTR_CONTROL_ENABLE;
	fSuccess = SetCommState(hCom, &dcb);
	if (!fSuccess) {
	    /* Handle the error. */
	    dwError = GetLastError();
		fprintf(stderr,"Comm error 3. Error returned: %d\n",dwError);
		byebye(7);
	}
} // AsyncSet(int wBaudRate, INT wByteSize, INT wStopBits, INT wParity)

PROCX INT AsyncInit(char *port)
{
	DWORD dwError;
	BOOL fSuccess;

	hCom = CreateFile(port,
	    GENERIC_READ | GENERIC_WRITE,
	    0,    			// comm devices must be opened w/exclusive-access
	    NULL, 			// no security attrs
	    OPEN_EXISTING,	// comm devices must use OPEN_EXISTING
	    0,    			// not overlapped I/O
	    NULL  			// hTemplate must be NULL for comm devices
    );

	if (hCom == INVALID_HANDLE_VALUE) {
	    dwError = GetLastError();
	    /* handle error */
		fprintf(stderr,"Comm error 1. Error returned: %d\n",dwError);
		byebye(7);
	}
/*
 * Omit the call to SetupComm to use the default queue sizes.
 * Get the current configuration.
 */

	fSuccess = GetCommState(hCom, &dcb);

	if (!fSuccess) {
	    /* Handle the error. */
	    dwError = GetLastError();
		fprintf(stderr,"Comm error 2. Error returned: %d\n",dwError);
		byebye(7);
	}

	// Fill in the 'saved' DCB

	BaudRate = dcb.BaudRate;
	ByteSize = dcb.ByteSize;
	Parity	 = dcb.Parity;
	StopBits = dcb.StopBits;
//
// at this point the COM port is opened with default parameters.
//  The routine AsyncSet should be called to finish configuring the port
//
 	return 0;
} // AsyncInit()

PROCX void AsyncStop(void)
{
	BOOL fSuccess;
	DWORD dwError;

	dcb.BaudRate = BaudRate;
	dcb.ByteSize = ByteSize;
	dcb.Parity = Parity;
	dcb.StopBits = StopBits;
	fSuccess = SetCommState(hCom, &dcb);

	if (!fSuccess) {
	    /* Handle the error. */
	    dwError = GetLastError();
		fprintf(stderr,"Comm error 4. Error returned: %d\n",dwError);
		return;
	}
	CloseHandle(hCom);
}

PROCX void AsyncOut(unsigned char * msg, INT count)
{
// must add error checking before release
	int bytes;

	WriteFile(hCom, msg, count, &bytes, NULL);
}

PROCX INT AsyncIn(void)
{
	DWORD bytes;
	unsigned char c;
	
	ReadFile(hCom, &c, 1, &bytes, NULL);
	if(bytes) return (INT)c; 
	else return c+1000;
}

PROCX INT AsyncInStat(void)
{
	COMSTAT b;
	unsigned long along;

	ClearCommError(hCom, &along, &b);
	if(b.cbInQue>0) return 1;
	return 0;
} 

PROCX void conson(void)
{
	DWORD cmode,errorrtn;
	
	if(console_is_on) return;
	inH = GetStdHandle(STD_INPUT_HANDLE);
	if(inH ==INVALID_HANDLE_VALUE) {
		fprintf(stderr,"Invalid Standard Input Handle...aborting\n");
		byebye(1);
	}
	errorrtn=GetConsoleMode(inH,&cmode);
	if(errorrtn==0) {
		errorrtn=GetLastError();
		fprintf(stderr,"GetConsoleMode Last Error:%d\n",errorrtn);
	}
	CmodeSave=cmode;
	errorrtn=SetConsoleMode(inH, ENABLE_PROCESSED_INPUT);
	if(errorrtn==0) {
		errorrtn=GetLastError();
		fprintf(stderr,"SetConsoleMode Last Error:%d\n",errorrtn);
	}
	errorrtn=FlushConsoleInputBuffer(inH);
	if(errorrtn==0) {
		errorrtn=GetLastError();
		fprintf(stderr,"FlushConsoleInput Last Error:%d\n",errorrtn);
	}
	console_is_on=1;
} //conson()

PROCX void consoff(void)
{
	if(console_is_on == 0) return;
	SetConsoleMode(inH, CmodeSave);
	FlushConsoleInputBuffer(inH);
} //consoff()

PROCX INT kbraw(void)
{
	DWORD i;
	INPUT_RECORD lpBuffer;
	DWORD er,events_read, bytesread,ev;
	unsigned char bufin[50];

	conson();
// error checking?
	er=GetNumberOfConsoleInputEvents(inH, &events_read);
	if(er==0) {
		er=GetLastError();
		printf("GetNumberOfConsoleInputEvents Last Error:%d\n",er);
	}
	if(events_read==0) return 0;
//printf("Events read: %d\n",events_read);fflush(stdout);
	for(i=1;i<=events_read;i++) {
		er=ReadConsoleInput(inH, &lpBuffer, 1, &ev);
		if(er==0) {
			er=GetLastError();
			printf("ReadConsoleInput Last Error:%d\n",er);
			return 0;
		}
		if(ev==0) continue;
		if(lpBuffer.EventType != KEY_EVENT) continue;
		if(lpBuffer.Event.KeyEvent.bKeyDown==TRUE) continue; // skip key down
		break;
	}
//printf("returning: %d  %c\n",lpBuffer.Event.KeyEvent.uChar.AsciiChar, lpBuffer.Event.KeyEvent.uChar.AsciiChar);
	return lpBuffer.Event.KeyEvent.uChar.AsciiChar;
}
 
PROCX INT AsyncOutStat(void){return 0;}

#pragma pack()

⌨️ 快捷键说明

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