專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實(shí)例 >> 瀏覽文章

PS2轉(zhuǎn)串口鍵盤WIN端驅(qū)動(主要寫了兩個類串口操作類和譯碼類)

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時間:2013年12月27日   【字體:

這個類把串口操作進(jìn)行封裝
#include
class COM //串口操作類
{
//私有方法部分
protected:
HANDLE hCom; //串口句柄
COMMTIMEOUTS TimeOuts; //設(shè)置讀寫超時
DCB dcb; //設(shè)置串口狀態(tài)結(jié)構(gòu)體
//公共方法部分
public:
COM(void);
~COM(void);
//以阻塞方式打開一個串口參數(shù)依次為[串口號,波特率,校驗(yàn)標(biāo)記,停止位長度]
int open(LPCTSTR com_name,DWORD com_bt,BYTE com_jy,BYTE com_sz,BYTE com_tz);
//關(guān)閉當(dāng)前串口
void close(void);
//從串口讀sz個字節(jié)到r_data
int read(LPVOID r_data,DWORD sz);
//從w_data發(fā)送sz個字節(jié)到串口
int write(LPCVOID w_data,DWORD sz);

};


#include "stdafx.h"
#include "串口操作類.h"

COM::COM()
{
}


COM::~COM()
{
//銷毀對象時先關(guān)閉串口
close();
}

int COM::open(LPCTSTR com_name,DWORD com_bt,BYTE com_jy,BYTE com_sz,BYTE com_tz)
{
//以阻塞方式打開一個串口參數(shù)依次為[串口號,波特率,校驗(yàn)標(biāo)記,停止位長度]
hCom=CreateFile(com_name,//COM1口
GENERIC_READ|GENERIC_WRITE, //允許讀和寫
0, //獨(dú)占方式
NULL,
OPEN_EXISTING, //打開而不是創(chuàng)建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
printf("打開%s失敗!\n",com_name);
return 0;
}
SetupComm(hCom,1024,1024); //輸入緩沖區(qū)和輸出緩沖區(qū)的大小都是1024
COMMTIMEOUTS TimeOuts;
//設(shè)定讀超時
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//設(shè)定寫超時
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=5000;
SetCommTimeouts(hCom,&TimeOuts); //設(shè)置超時
GetCommState(hCom,&dcb); //獲取串口原始參數(shù)
dcb.BaudRate=com_bt; //設(shè)置波特率取值范圍是 CBR_110,CBR_300,CBR_600,CBR_1200,CBR_2400,CBR_4800,CBR_9600,CBR_19200, CBR_38400,CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000, CBR_14400
dcb.ByteSize=com_sz; //設(shè)置通信字節(jié)位數(shù)取值范圍是 4到8
dcb.fParity=1; //允許奇偶校驗(yàn)檢查
dcb.Parity=com_jy; //設(shè)置奇偶校驗(yàn)位取值范圍是 EVENPARITY 偶校驗(yàn),NOPARITY 無校驗(yàn) ,MARKPARITY 標(biāo)記校驗(yàn),ODDPARITY 奇校驗(yàn)
dcb.StopBits=com_tz; //設(shè)置停止位取值范圍是 ONESTOPBIT 1位停止位 ,TWOSTOPBITS 2位停止位,ONE5STOPBITS 1.5位停止位
SetCommState(hCom,&dcb); //設(shè)置串口新的參數(shù)
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);//操作串口前先清空緩沖區(qū)
printf("打開%s成功!\n",com_name);
return 1;
}

void COM::close(void)
{
//關(guān)閉當(dāng)前串口
CloseHandle(hCom);
}


int COM::read(LPVOID r_data,DWORD sz)
{
//從串口讀sz個字節(jié)到r_data
DWORD wCount;//讀取的字節(jié)數(shù)
BOOL bReadStat;
bReadStat=ReadFile(hCom,r_data,sz,&wCount,NULL);
if(!bReadStat)
{
printf("讀串口失敗!\n");
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return 0;
}
if(wCount!=sz) return 0;
return 1;
}


int COM::write(LPCVOID w_data,DWORD sz)
{
//從w_data發(fā)送sz個字節(jié)到串口
BOOL bWriteStat;
DWORD dwBytesWrite;
bWriteStat=WriteFile(hCom,w_data,sz,&dwBytesWrite,NULL);
if(!bWriteStat)
{
printf("寫串口失敗!\n");
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return 0;
}
if(dwBytesWrite!=sz) return 0;
return 1;
}這個類對按鍵譯碼進(jìn)行封裝,鍵碼太多我只譯碼了26個字母按鍵,譯碼表這部分是個體力活大家可以根據(jù)實(shí)際使用情況來調(diào)整。

#include
class PS2
{
//私有方法部分
protected:
SYSTEMTIME TIME; //標(biāo)準(zhǔn)系統(tǒng)時間存放結(jié)構(gòu)體共8個成員16字節(jié)
int up; //按鍵釋放標(biāo)記
//公共方法部分

public:
PS2(void);
~PS2(void);
int PS2_ym(BYTE m); //譯碼函數(shù)通過一個按鍵碼來翻譯成WINDOWS鍵盤事件

};

 

#include "stdafx.h"
#include "PS2鍵盤譯碼.h"

BYTE key[26][2]={{0x1c,65},{0x32,66},{0x21,67},{0x23,68},{0x24,69},{0x2b,70},{0x34,71},{0x33,72},{0x43,73},{0x3b,74},{0x42,75},{0x4b,76},{0x3a,77},{0x31,78},{0x44,79},{0x4d,80},{0x15,81},{0x2d,82},{0x1b,83},{0x2c,84},{0x3c,85},{0x2a,86},{0x1d,87},{0x22,88},{0x35,89},{0x1a,90}}; //鍵碼表
char *key_name[]={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};

PS2::PS2()
{
up=0;//釋放標(biāo)記清0
}

PS2::~PS2()
{
}

int PS2::PS2_ym(BYTE m)
{
//譯碼函數(shù)通過一個按鍵碼來翻譯成WINDOWS鍵盤事件
int i;
if(m==0xf0)
{
//有斷碼就做標(biāo)記
up=1;
return 0;
}else
{
if(up==0)
{
for(i=0;i<26;i++)
{
if(m==key[i][0])
{
keybd_event(key[i][1], 0, 0 ,0);
printf("按鍵%s按下!",key_name[i]);
GetLocalTime(&TIME);//獲得系統(tǒng)當(dāng)前時間
printf("事件觸發(fā)時間為:%d年%d月%d日%d時%d分%d秒\n",TIME.wYear,TIME.wMonth,TIME.wDay,TIME.wHour,TIME.wMinute,TIME.wSecond);
}
}
}else if(up==1)
{
for(i=0;i<26;i++)
{
if(m==key[i][0])
{
keybd_event(key[i][1], 0,KEYEVENTF_KEYUP,0);
printf("按鍵%s彈起!",key_name[i]);
GetLocalTime(&TIME);//獲得系統(tǒng)當(dāng)前時間
printf("事件觸發(fā)時間為:%d年%d月%d日%d時%d分%d秒\n",TIME.wYear,TIME.wMonth,TIME.wDay,TIME.wHour,TIME.wMinute,TIME.wSecond);
up=0; //鍵已經(jīng)釋放標(biāo)記清0
}
}
}


}

return 1;
}

 

關(guān)閉窗口

相關(guān)文章