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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

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

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年12月27日   【字體:

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

};


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

COM::COM()
{
}


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

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

void COM::close(void)
{
//關閉當前串口
CloseHandle(hCom);
}


int COM::read(LPVOID r_data,DWORD sz)
{
//從串口讀sz個字節到r_data
DWORD wCount;//讀取的字節數
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發送sz個字節到串口
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;
}這個類對按鍵譯碼進行封裝,鍵碼太多我只譯碼了26個字母按鍵,譯碼表這部分是個體力活大家可以根據實際使用情況來調整。

#include
class PS2
{
//私有方法部分
protected:
SYSTEMTIME TIME; //標準系統時間存放結構體共8個成員16字節
int up; //按鍵釋放標記
//公共方法部分

public:
PS2(void);
~PS2(void);
int PS2_ym(BYTE m); //譯碼函數通過一個按鍵碼來翻譯成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;//釋放標記清0
}

PS2::~PS2()
{
}

int PS2::PS2_ym(BYTE m)
{
//譯碼函數通過一個按鍵碼來翻譯成WINDOWS鍵盤事件
int i;
if(m==0xf0)
{
//有斷碼就做標記
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);//獲得系統當前時間
printf("事件觸發時間為:%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);//獲得系統當前時間
printf("事件觸發時間為:%d年%d月%d日%d時%d分%d秒\n",TIME.wYear,TIME.wMonth,TIME.wDay,TIME.wHour,TIME.wMinute,TIME.wSecond);
up=0; //鍵已經釋放標記清0
}
}
}


}

return 1;
}

 

關閉窗口

相關文章

主站蜘蛛池模板: 久久精品亚洲 | 日本超碰在线 | 91在线视频在线观看 | 欧美一级二级在线观看 | 久干网 | 日本久久久一区二区三区 | 高清一区二区三区 | 特黄毛片视频 | 国产一区2区 | 在线成人免费视频 | 久久一区二区三区四区 | 欧美黄色录像 | 激情国产 | 一级国产精品一级国产精品片 | 成人教育av | 国产亚洲成av人片在线观看桃 | 日韩精品在线播放 | 国产精品国产精品国产专区不片 | 一区二区三区四区五区在线视频 | 欧美不卡一区二区三区 | 一区二区三区观看视频 | 国产精品久久久久av | www.97zyz.com| 久久久久久国产精品 | 精品一区二区三区电影 | 国产成人精品一区二区三区在线 | 精品一区二区三区四区视频 | 欧美最猛性xxxxx亚洲精品 | 国产一区二区三区色淫影院 | 免费在线观看av网站 | 欧美成人激情 | 欧美国产一区二区 | 久草免费在线视频 | 精品一区二区三区在线观看 | 在线免费观看a级片 | 91影院| 99视频网站 | 国产精品一区二区欧美 | 成人日批视频 | 91亚洲视频在线 | 香蕉一区 |