久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

PS2轉(zhuǎn)串口鍵盤(pán)WIN端驅(qū)動(dòng)(主要寫(xiě)了兩個(gè)類(lèi)串口操作類(lèi)和譯碼類(lèi))

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

這個(gè)類(lèi)把串口操作進(jìn)行封裝
#include
class COM //串口操作類(lèi)
{
//私有方法部分
protected:
HANDLE hCom; //串口句柄
COMMTIMEOUTS TimeOuts; //設(shè)置讀寫(xiě)超時(shí)
DCB dcb; //設(shè)置串口狀態(tài)結(jié)構(gòu)體
//公共方法部分
public:
COM(void);
~COM(void);
//以阻塞方式打開(kāi)一個(gè)串口參數(shù)依次為[串口號(hào),波特率,校驗(yàn)標(biāo)記,停止位長(zhǎng)度]
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個(gè)字節(jié)到r_data
int read(LPVOID r_data,DWORD sz);
//從w_data發(fā)送sz個(gè)字節(jié)到串口
int write(LPCVOID w_data,DWORD sz);

};


#include "stdafx.h"
#include "串口操作類(lèi).h"

COM::COM()
{
}


COM::~COM()
{
//銷(xiāo)毀對(duì)象時(shí)先關(guān)閉串口
close();
}

int COM::open(LPCTSTR com_name,DWORD com_bt,BYTE com_jy,BYTE com_sz,BYTE com_tz)
{
//以阻塞方式打開(kāi)一個(gè)串口參數(shù)依次為[串口號(hào),波特率,校驗(yàn)標(biāo)記,停止位長(zhǎng)度]
hCom=CreateFile(com_name,//COM1口
GENERIC_READ|GENERIC_WRITE, //允許讀和寫(xiě)
0, //獨(dú)占方式
NULL,
OPEN_EXISTING, //打開(kāi)而不是創(chuàng)建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
printf("打開(kāi)%s失敗!\n",com_name);
return 0;
}
SetupComm(hCom,1024,1024); //輸入緩沖區(qū)和輸出緩沖區(qū)的大小都是1024
COMMTIMEOUTS TimeOuts;
//設(shè)定讀超時(shí)
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
//設(shè)定寫(xiě)超時(shí)
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=5000;
SetCommTimeouts(hCom,&TimeOuts); //設(shè)置超時(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 無(wú)校驗(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("打開(kāi)%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個(gè)字節(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個(gè)字節(jié)到串口
BOOL bWriteStat;
DWORD dwBytesWrite;
bWriteStat=WriteFile(hCom,w_data,sz,&dwBytesWrite,NULL);
if(!bWriteStat)
{
printf("寫(xiě)串口失敗!\n");
PurgeComm(hCom, PURGE_TXABORT|
PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return 0;
}
if(dwBytesWrite!=sz) return 0;
return 1;
}這個(gè)類(lèi)對(duì)按鍵譯碼進(jìn)行封裝,鍵碼太多我只譯碼了26個(gè)字母按鍵,譯碼表這部分是個(gè)體力活大家可以根據(jù)實(shí)際使用情況來(lái)調(diào)整。

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

public:
PS2(void);
~PS2(void);
int PS2_ym(BYTE m); //譯碼函數(shù)通過(guò)一個(gè)按鍵碼來(lái)翻譯成WINDOWS鍵盤(pán)事件

};

 

#include "stdafx.h"
#include "PS2鍵盤(pán)譯碼.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ù)通過(guò)一個(gè)按鍵碼來(lái)翻譯成WINDOWS鍵盤(pán)事件
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)前時(shí)間
printf("事件觸發(fā)時(shí)間為:%d年%d月%d日%d時(shí)%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)前時(shí)間
printf("事件觸發(fā)時(shí)間為:%d年%d月%d日%d時(shí)%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)文章

主站蜘蛛池模板: 国产乱码精品1区2区3区 | 亚洲视频在线看 | 久久一起草 | 99re在线视频 | 午夜av一区二区 | 成人在线观看免费 | 中文字幕在线看第二 | 日韩精品一区二区三区 | 色性av | 另类亚洲视频 | 久一精品| 97免费在线观看视频 | 综合久久综合久久 | www.久久精品 | 日韩不卡一二区 | 四虎影院免费在线播放 | 国产精品视频网站 | 精品亚洲91 | 999精品在线观看 | 在线一区 | 极品久久 | 久久久av中文字幕 | 亚洲精品一区二区三区丝袜 | 国产精彩视频在线观看 | 成人不卡 | 久久6| 国产区精品视频 | 精品久久久久久久久久久久久 | 欧美激情综合 | 婷婷色国产偷v国产偷v小说 | 91视频亚洲 | 在线亚洲欧美 | 97精品超碰一区二区三区 | 亚洲国产精品福利 | 国产极品91| 久久九九99 | 91美女在线观看 | 午夜免费小视频 | 国产成人精品久久二区二区91 | 少妇久久久 | 亚洲精品天堂 |