Google

星期二, 一月 06, 2009

Windows XP读写并口

第一:并口、串口、和驱动这些东西与普通文件还真不太一样、
第二:写操作只要成功一般不拥塞
你的代码我改了一下
以下win2000+ vc6编译通过,执行成功,所有函数详见MSDN
CString strPrint;
HANDLE hPrint = CreateFile("LPT1",GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,//这里可不是普通的文件 NULL);

if( !hPrint)
return ;
//设置传输率等参数,想要通讯稳定以下的东西最好加上,参数视情况而定
SetupComm(hPrint,1024,1024);//设置缓冲区大小
DCB my_dcb;
my_dcb.BaudRate=CBR_300;//波特率300
my_dcb.ByteSize=8; //字节尺寸8
my_dcb.Parity=NOPARITY;//无奇偶校验
my_dcb.StopBits =ONESTOPBIT;//无停止位
SetCommState(hPrint,&my_dcb);

DWORD dwWritted = 0;
//控件写入
UpdateData(true);
strPrint =m_bb;
UpdateData(false);

strPrint += "\r\n";
int nLength = 0 ;
DWORD r =1;
nLength = strPrint.GetLength();

WriteFile(hPrint,strPrint.GetBuffer(nLength),nLength,&dwWritted,NULL);
CloseHandle(hPrint);
MessageBox("WRITE TO LPT1!") ;

http://topic.csdn.net/t/20031205/15/2531549.html

标签:

PortTalk - A Windows NT I/O Port Device Driver

A problem that plagues Windows NT/2000 and Windows XP, is it's strict control over I/O ports. Unlike Windows 95 & 98, Windows NT/2000/XP will cause an exception (Privileged Instruction) if an attempt is made to access a port that you are not privileged to talk too. Actually it's not Windows NT that does this, but any 386 or higher processor running in protected mode.

Accessing I/O Ports in protected mode is governed by two events, The I/O privilege level (IOPL) in the EFLAGS register and the I/O permission bit map of a Task State Segment (TSS).


Under Windows NT, there are only two I/O privilege levels used, level 0 & level 3. Usermode programs will run in privilege level 3, while device drivers and the kernel will run in privilege level 0, commonly referred to as ring 0. This allows the trusted operating system and drivers running in kernel mode to access the ports, while preventing less trusted usermode processes from touching the I/O ports and causing conflicts. All usermode programs should talk to a device driver which arbitrates access.

The I/O permission bitmap can be used to allow programs not privileged enough (I.e. usermode programs) the ability to access the I/O ports. When an I/O instruction is executed, the processor will first check if the task is privileged enough to access the ports. Should this be the case, the I/O instruction will be executed. However if the task is not allowed to do I/O, the processor will then check the I/O permission bitmap.

The I/O permission bitmap, as the name suggests uses a single bit to represent each I/O address. If the bit corresponding to a port is set, then the instruction will generate an exception however if the bit is clear then the I/O operation will proceed. This gives a means to allow certain processes to access certain ports. There is one I/O permission bitmap per task.

http://www.beyondlogic.org/porttalk/

标签: , , ,

用wxWidgets做界面

C++下做跨平台的GUI,MS用的广泛的有QT和wxWidgets。QT有开源版,但限制较多;wxWidgets各种小组件确实很多,但看了它的auidemo例子,才增强了使用的信心。

wxWidgets与MFC有太多的相似之处,看起来没有多大的使用难度。官方网站上也有一份介绍的文档。
一个wxWidgets版的“Hello world”程序也得费上几分钟才能编译成功,主要是在setting上卡壳。
* mswu/d依赖目录
* Not Using Precompiled Headers
* WIN32;_DEBUG;__WXMSW__;__WXDEBUG__;_WINDOWS;NOPCH
* wxmsw28ud_aui.lib wxmsw28ud_html.lib wxmsw28ud_adv.lib wxmsw28ud_core.lib wxbase28ud_xml.lib wxbase28ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib

此文为引用,原始出处不详

标签:

[学习]Delphi控制并行端口位操作

并行端口简称并口,它有3个端口:数据端口、状态端口、控制端口,常用的并口为LPT1,它的3个端口的地址分别为:378H、379H和37AH。

  一、并口读写

  在汇编语言中,可以用 in、out 指令操作并口,而在Delphi中并没有相对应的函数、方法可对并口进行读写,幸运的是Delphi可以嵌入汇编程序,通过直接嵌入汇编指令 in、out 可方便地对并口进行读写。我们还可以通过调用 Windows API 函数或第三方提供的DLL、VXD来访问并口,但通过使用嵌入汇编的方法对并口进行读写更方便、快捷。

  使用下面的 ReadPort 函数和 WritePort 过程可以读写并口,参数 Port 为要操作的端口地址。

function ReadPort(Port:WORD):BYTE;

var

B:BYTE;

begin

ASM

MOV DX, Port;

IN AL, DX;

MOV B, AL;

END;

Result:=B;

end;

procedure WritePort(Port:WORD;ConByte:BYTE);

begin

ASM

MOV DX, Port;

MOV AL, ConByte;

OUT DX, AL;

END;

end;

二、位操作

  要按位来控制并口,可以先读取并口的数据,再进行位操作,最后再重新写入并口,就可以实现对并口的位的控制。

  逻辑运算符and对两个要操作的数执行按位的逻辑与运算:即中有1“与”1的结果为1,其它的0“与”1、1“与”0、0“与”0的结果都为0。

  逻辑运算符or对两个要操作的数执行按位的逻辑或运算:即只要相“或”的两位有一位是1,结果就为1;否则“或”的结果为0。


  使用and运算符可以对指定的位置0,例如:十六进制84H的二进制为:10000100,它的第三位为1,若要将第三位置为0,且其它位不变,可以使用:$84 and $FB = $80,80H的二进制值为10000000。

  使用or运算符可以对指定的位置1,例如:十六进制84H的第二位为0,若要将第二位置为1,且其它位不变,可以使用:$84 or $02 = $86,86H的二进制值为10000110。

  例子:

  1、将数据端口378H的D2位的电位设置为低,即置0:

B:=ReadPort($378);

B:=B and $FB;

WritePort($378,B);

  2、将数据端口378H的D2位的电位设置为高,即置1:

B:=ReadPort($378);

B:=B or $04;

WritePort($378,B);

  3、判断数据端口378H的D2位的电位高低:

B:=ReadPort($378);

if ((B and $04)=$04) then

//电位为高时的代码

else

//电位为低时的代码

或:

B:=ReadPort($378);

if ((B or $FB)=$FF) then

//电位为高时的代码

else

//电位为低时的代码

  三、具体实现

  下面的例子是控制并口的数据端口378H的各个位的电位高低。数据端口的8个位:D0~D7分别对应并行接口的2~9脚,关于并行接口其它的引脚的说明就查看相关资料,这里就不多说了。

  首先运行 Delphi,新建一个工程,按一下F12在Form1的单元文件Unit1中加入读写端口的代码:

function ReadPort(Port:WORD):BYTE;

procedure WritePort(Port:WORD;ConByte:BYTE);

function ReadPort(Port:WORD):BYTE;

var

B:BYTE;

begin

ASM

MOV DX, Port;

IN AL, DX;

MOV B, AL;

END;

Result:=B;

end;

procedure WritePort(Port:WORD;ConByte:BYTE);

begin

ASM

MOV DX, Port;

MOV AL, ConByte;

OUT DX, AL;

END;

end;


  添加8个 CheckBox 组件,修改它们的 Caption(标题)属性分别为 D0 到 D7 ,将它们按右到左进行排列好。

  双击 CheckBox1,在CheckBox1组件的OnClick(单击)事件中加入以下的程序代码:

procedure TForm1.CheckBox1Click(Sender: TObject);

var

b:BYTE;

begin

b:=0;

if CheckBox1.Checked then

b:=b or $01;

if CheckBox2.Checked then

b:=b or $02;

if CheckBox3.Checked then

b:=b or $04;

if CheckBox4.Checked then

b:=b or $08;

if CheckBox5.Checked then

b:=b or $10;

if CheckBox6.Checked then

b:=b or $20;

if CheckBox7.Checked then

b:=b or $40;

if CheckBox8.Checked then

b:=b or $80;

WritePort($378,b); //写数据端口

end;


  输入完成后,把CheckBox2到CheckBox8这7个CheckBox组件的OnClick事件设置为CheckBox1的OnClick事件:CheckBox1Click。

  此时编译运行程序,已经可以通过点击这8个CheckBox来控制LPT1的数据端口的各个位的电位高低了。

  下面再加入监控并口的数据端口状态的功能。

  在Form1中加入一个Timer组件:Timer1,修改它的Enabled属性为False,Interval属性为1。

  在Timer1的OnTimer事件中加入:

procedure TForm1.Timer1Timer(Sender: TObject);

var

B:BYTE;

begin

B:=ReadPort($378); //读数据端口

CheckBox1.Checked:=((B or $FE)=$FF);

CheckBox2.Checked:=((B or $FD)=$FF);

CheckBox3.Checked:=((B or $FB)=$FF);

CheckBox4.Checked:=((B or $F7)=$FF);

CheckBox5.Checked:=((B or $EF)=$FF);

CheckBox6.Checked:=((B or $DF)=$FF);

CheckBox7.Checked:=((B or $BF)=$FF);

CheckBox8.Checked:=((B or $7F)=$FF);

end;


  再加入一个CheckBox组件,修改的Caption属性为“监控并口”,并在它的OnClick事件中加入:

procedure TForm1.CheckBox9Click(Sender: TObject);

begin

Timer1.Enabled:=CheckBox9.Checked;

end;


  编译运行程序,点击“监控并口”,就可以监控并口LPT1数据端口378H的状态,并可以实时地修改它的状态。

  为了方便查看、验证数据端口378H的状态,我做了一个小小的并口测试电路,该电路使用了一个打印接口、8个LED(发光二极管)和8个1K的电阻,连接线路如图所示:




  按照电路图制作完成后,安装到电脑的并口上,运行编写好的程序就可以方便地查看数据端口378H的各个位的电位高低了。

  最后,我们再来做一个走马灯实验。

  先声明一个全局变量 tb:在“Form1:TForm1”的下面加上“tb:BYTE”:

var

Form1: TForm1;

tb:BYTE;

  再在Form1中加入一个Timer和一个CheckBox,修改Timer2的Enabled属性为False,修改Interval属性为300,双击Timer2,在它的OnTimer事件中加入:

procedure TForm1.Timer2Timer(Sender: TObject);

var

B:BYTE;

begin

if tb=0 then

tb:=1

else

tb:=tb * 2;

WritePort($378,tb);

B:=ReadPort($378);

CheckBox1.Checked:=((B or $FE)=$FF);

CheckBox2.Checked:=((B or $FD)=$FF);

CheckBox3.Checked:=((B or $FB)=$FF);

CheckBox4.Checked:=((B or $F7)=$FF);

CheckBox5.Checked:=((B or $EF)=$FF);

CheckBox6.Checked:=((B or $DF)=$FF);

CheckBox7.Checked:=((B or $BF)=$FF);

CheckBox8.Checked:=((B or $7F)=$FF);

end;

  修改CheckBox10的Caption属性为“走马灯演示”,再双击CheckBox10,在它OnClick事件中加入:

procedure TForm1.CheckBox10Click(Sender: TObject);

begin

Timer2.Enabled:=CheckBox10.Checked;

end;


  编译运行程序。




  点击“走马灯演示”,有没有看到“走马灯”的效果?通过修改Timer2的Interval可以调节速度,更多、更Cool的效果就看你的创意了。

  注意:以上嵌入汇编访问并口的方法只能在Win9X下使用,若要在WinNT/2K下访问并口应该使用 Windows API 函数或专门读写并口的DLL、VXD。

  以上程序在Win98+Delphi6.0下测试通过

http://www.yesky.com/20020801/1623061_1.shtml

标签: , ,

星期一, 一月 05, 2009

汉字编码标准

GB2312
范围: 0xA1A1 - 0xFEFE
汉字范围: 0xB0A1 - 0xF7FE

GBK
范围: 0x8140 - 0xFEFE

BIG5
范围: 0xA140 - 0xF9FE, 0xA1A1 - 0xF9FE

编码 第一个字节 第二个字节 第三个字节 第四个字节 GB2312 0xB0 - 0xF7 0xA0 - 0xFE GBK 0x81 - 0xFE 0x40 - 0xFE GB18030 的双字节 0x81 - 0xFE 0x40 - 0x7E, 0x80 - 0xFE GB18030 的四字节 0x81 - 0xFE 0x30 - 0x39 0x81 - 0xFE 0x30 - 0x39

GB2312:
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。

GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312-80包含了大部分常用的一、二级汉字,和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe;汉字从0xb0a1开始,结束于0xf7fe。

GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。故而GB2312最多能表示6763个汉字。

GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。

BIG5:
每个字由两个字节组成,其第一字节编码范围为0xA1~0xF9,第二字节编码范围为0x40~0x7E与0xA1~0xFE,总计收入13868个字(包括5401个常用字、7652 个次常用字、7个扩充字、以及808个各式符号),其中可以大致划分为以下几个字区:

第一字节 第二字节 字区 制定 A1..A2 40..7E, A1..FE 各种符号区 1984 A3 40..7E, A1..BF 各种符号区 (包括标点符号、ASCII 全角符号、注音符号等) 1984 A3 E1 欧元符号 CP950 A4..C5 40..7E, A1..FE 常用字区 1984 C6 40..7E 常用字区 1984 C6 A1..FE 罕用符号区 倚天 C7 40..7E, A1..FE 罕用符号区 (包括日文、俄文等) 倚天 C8 40..7E, A1..D3 罕用符号区 (包括俄文、输入法特殊符号等) 倚天 C9..F8 40..7E, A1..FE 次常用字区 1984 F9 40..7E, A1..D5 次常用字区 1984 F9 D6..DC 七个扩充字 倚天 F9 DD..FE 格符号区 倚天

扩充字 BIG5 码 Unicode 码 BIG5_1984 的同义字 碁 0xF9D6 0x88CF 棋 0xF9D7 0x92B9 0xF9D8 0x7CA7 墙 0xF9D9 0x58BB 墙 恒 0xF9DA 0x6052 恒 妆 0xF9DB 0x7881 妆 娴 0xF9DC 0x5AFA 娴
GBK:

起源

GB2312-80 仅收汉字 6763 个,这大大少于现有汉字,随着时间推移及汉字文化的不断延伸推广,有些原来很少用的字,现在变成了常用字,例如:朱鎔基的“鎔”字,未收入 GB2312-80,现在大陆的报业出刊只得使用(金+容)、(金容)、(左金右容)等来表示,形式不一而同,这使得表示、存储、输入、处理都非常不方便,对于搜索引擎等软件的构造来说也不是好消息,而且这种表示没有统一标准。从我们对人民日报 98 年数据的处理过程中,得出这样的经验:回填外字最困难的就是如何得到这种表示方法的集合。

为了解决这些问题,以及配合 UNICODE 的实施,全国信息技术化技术委员会于 1995 年 12 月 1 日《汉字内码扩展规范》。GBK 向下与 GB2312 完全兼容,向上支持 ISO-10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。

GBK是GB2312-80的扩展,是向上兼容的。它包含了20902个汉字,其编码范围是0x8140-0xfefe,剔除高位0x80的字位。其所有字符都可以一对一映射到Unicode2.0。

字集

GBK 共收入21886个汉字和图形符号,包括:


* GB2312 中的全部汉字、非汉字符号。
* BIG5 中的全部汉字。
* 与 ISO-10646 相应的国家标准 GB13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
* 其它汉字、部首、符号,共计 984 个。


GBK 编码区分三部分:


* 汉字区 包括

o GBK/2:OXBOA1-F7FE, 收录 GB2312 汉字 6763 个,按原序排列;
o GBK/3:OX8140-AOFE,收录 CJK 汉字 6080 个;
o GBK/4:OXAA40-FEAO,收录 CJK 汉字和增补的汉字 8160 个。

* 图形符号区 包括

o GBK/1:OXA1A1-A9FE,除 GB2312 的符号外,还增补了其它符号
o GBK/5:OXA840-A9AO,扩除非汉字区。

* 用户自定义区
o 即 GBK 区域中的空白区,用户可以自己定义字符。

編碼 GBK 亦采用双字节表示,总体编码范围为 8140-FEFE 之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线。

微软公司自 Windows 95 简体中文版开始支持 GBK 代码,標準叫法是 Windows codepage 936,也叫做 GBK(國標擴展),它也是 8-bit 的變長編碼。據我所知 GBK 從來沒成爲過正式的國家標準,只不過因爲 Windows 的普及,它已經成爲事實上的標準了。但目前的多数搜索引擎都不能很好地支持 GBK 汉字。
from: http://www.unihan.com.cn/cjk/ana17.htm

由前电子部科技质量司和国家技术监督局标准化司于1995年12月颁布的指导性规范。(GBK的 K是“扩展”的汉语拼音第一个字母)
GBK作为非 UCS ( ISO/IEC 10646 ) 体系的代码页,适用于中文信息的处理、交换、存储、传输、显现、输入和输出。
GBK与国家标准 GB 2312-80 信息处理交换码所对应的、事实上的内码标准兼容;同时,在字汇一级支持 ISO/IEC 10646-1 和GB 13000-1 的全部中日韩 (CJK) 汉字(20902字)。GBK除了包含GB2312-80 和GB12345-90中包括的全部非汉字符号外,还涵盖我国台湾地区中文标准交换码TCA-CNS 11643 -92 ( 与其对应的内码为Big5;以下用Big5泛指二者。) 中的绝大多数符号。
从Windows95中文版起,Windows NT 3.51, 4.0, Windows2000, Windows CE, Linux已经全面支持GBK,起到了从GB 2312向Unicode过渡的承上启下的重要作用。
GBK尽管在字汇一级支持CJK,是目前最大的Code Page ;它在体系结构、代码空间上,仍然是完全不同于ISO/IEC 10646 和Unicode的。
GB18030:

GB18030-2000(GBK2K)在GBK的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的字形。GBK2K从根本上解决了字位不够,字形不足的问题。它有几个特点:
它并没有确定所有的字形,只是规定了编码范围,留待以后扩充。

编码是变长的,其二字节部分与GBK兼容;四字节部分是扩充的字形、字位,其编码范围是首字节0x81-0xfe、二字节0x30-0x39、三字节0x81-0xfe、四字节0x30-0x39。
它的推广是分阶段的,首先要求实现的是能够完全映射到Unicode3.0标准的所有字形。

它是国家标准,是强制性的。

http://www.yuanma.org/data/2006/0802/article_1289.htm

标签:

关于GB18030汉字编码标准集

清华大学经济管理硕士,信息产业部电子工业标准化研究所副所长,全国信息技术标准化技术委员会副秘书长,承担多项国家级项目的标准化工作,并曾出版多本著述。

  国家标准GB18030-2000《信息交换用汉字编码字符集基本集的扩充》是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,是未来我国计算机系统必须遵循的基础性标准之一。为保证该标准顺利贯彻执行,国家质监总局将在9月1日起首先对影响广泛的计算机操作系统进行执法检查,凡不符合该标准的产品,视为不合格产品。为此,全国信息技术标准化技术委员会将根据有关标准和规范,组织对市场上主要的操作系统产品进行标准符合性检测。

http://tech.sina.com.cn/s/2001-07-26/1850.html

标签:

Javascript实现的取中文拼音首字母,提供了多音字的选择。

作者:梅雪香

http://www.iwms.net/n2066c17.aspx


Javascript实现的取中文拼音首字母,提供了多音字的选择。

标签:

辽ICP备05003652号
流风洄雪听天籁,轻云蔽日看落花

Powered by Blogger