📄 9928.txt
字号:
----Windows的API函数虽然使用面很广,但由于比较复杂而有一定的难度,
故简单述之,其编程过程分为初始化串口、配置串口、超时控制、数据传输、
关闭串口等。
----VC++串口通讯
----一、初始化串行通讯口
----通过计算机串口进行通讯之前,必须根据监控设备的有关通讯参数,约
定双方的通讯方式,包括波特率的设置、奇偶位校验及停止位的设立。确定
数据传输帧格式,确定ART操作方式。逐个对线路控制寄存器、波特率因子
寄存器和M0DEM寄存器写入操作。
----先确定计算机的通讯口地址是3F8还是2F8(根据用户的不同要求,可加
插卡而有3E8、2E8,甚至使用多用户卡而有3220、3228、4220、4228、5220、
5228),例中以2F8做为端口地址。利_outp(PORT,0x0c)将波特率设置为9600,
(_outp(PORT,0x30)将波特率设置为2400,_outp(PORT,0x18)将波特率设置
为4800)。
----数据传输格式则由地址PORT+3确定,如选用七位一停止位偶校验,则采
用outp(PORT+3,0x3a)及outp(PORT+3,0x1a)两个语句;如选用八位一停止位
无奇偶校验,则采用outp(PORT+3,0x3a)及outp(PORT+3,0x03)两个语句;至
于为什么,可参考有关异步通讯数据格式方面的书。
----二、查询发送流程
----只需CPU检测到UART发送器保持寄存器为空,即向UART输出一个字符。发
送方首先输出RTS和DTR有效,检测MODEM寄存器,只有收到DEC输入的CTS、DSR
有效,CPU才向UART输出一发送字符。
----三、查询接收流程
----只需CPU检测到UART接收器数据准备就绪,即可从接收器数据寄存器中读
取一字符。接收方首先输出数据终端就绪有效(DTR=1),然后检测MODEM状
态寄存器,只有DSR=1,CPU才接收一字符。
----程序例
----为了编程的方便,我把实时监控过程中的串口初始化、串口接收、串口
发送等以子程序的形式呈现。
确定通讯口地址:int PORT=0x2F8;
接收字符子程序:
char near readbyte(void)
{
int time_limit;
char sta;
time_limit=5000;
while ((sta=inp(PORT+5) & 0x01) !=1)
{ time_limit--;
if (time_limit==0) {
/*printf("s=%4xm ",sta);*/return 0;}
}
return inp(PORT);
printf("%s",inp(PORT));
}
发送字符子程序:
void sendbyte(unsigned char sdata)
{
long int time_limit;
time_limit=50000;
while ((inp(PORT+5) & 0xf0) != 0x60)
{ time_limit--;
if (time_limit==0) break;
}
outp(PORT,sdata);
}
串口初始化子程序:
void init_com(PORT)
{
char i;
outp(PORT+3,0x80);
outp(PORT ,0x0C); /* baud rate 9600 */
outp(PORT+1,0);
/*8bit 1stop no even */
outp(PORT+3 ,0x3a);
outp(PORT+3 ,0x03);
i=inp(PORT+5) & 0xfe;
outp(PORT+5,i);
}
字符串发送子程序:
void sendstrn(char *mess)
{
for (; *mess; mess++)
sendbyte(*mess);
sendbyte(0X0D);
/*sendbyte(0X0A); */
}
简单的主程序:
init_com(ox2f8);
sendstrn(PORT,"FUNC");
j=0;
line=0;
do {
for(i=0;i< 25;i++) ttemp[i]='\0';
if(readbyte(PORT)=='M') {
i=0;
do {
ttemp[i]=readbyte(PORT);
i++;
}while((ttemp[i-2]!=13)&&(ttemp[i-1]!=10));
line++;
dcqd.TextOut(450,line*20+180,ttemp);}
j++;}
while((j< 1000)&&(line< 5));
****************************************************************
****************************************************************
◆下载专区◆
Pass32 Assembler 2.4 (288K)
是一个x86汇编程序,轻松制作保护模式与DOS应用程序。
此Pass32汇编程序直接连接dos延伸物至应用程序而无需任何其他连接。
此汇编程序带有Pro32 Dos Extender,但也与其他Dos Extenders兼容诸
如WDOSX等。Pass32汇编程序提供了一个大型的运行时间资料库,包括
std. I/O、大量操作、文件处理及VESA图像功能。此汇编程序与Dos Extender
兼容DOS格式、Win31、Win9X、WinNT平台。
下载地址1: http://www.geocities.com/SiliconValley/Bay/3437/pass32v2.zip
下载地址2: ftp://ftp.simtel.net/pub/simtelnet/msdos/asmutl/pass32v2.zip
相关站点: http://www.geocities.com/SiliconValley/Bay/3437/
Bar Code ActiveX Control 1.0 (539K)
一个条码工具,可以为Windows应用程序生成专业水的高质量条码。可以
应用于数据库、产品包装、文件跟踪、邮政条码和特殊目的的标签。
Bar Code ActiveX Control支持各种通用条码。允许全面控制条码的各项
指标:精确控制条码分辨率、前景背景和文本颜色、全方位旋转、字体选
择、文字位置等等。
Bar Code ActiveX Control还是一个数据绑定控件,可以容易的集成度数
据库报告或标签应用程序中去。除了支持一维的条码,如Code 39, UPC,
EAN, Code 128, PostNET, CodaBar, BookLand, HIBC和Interleaved 2 of 5
以外,Bar Code ActiveX Control还支持最新的两维条码,如PDF417,
Aztec Code, Data Matrix和MaxiCode
下载地址: http://www.taltech.com/downloads/ocxdemo.exe
相关站点: http://www.taltech.com/p_ocx.htm
FreePOP 2.0.8 (1496K)
这是一个ActiveX控件,可以让使用者有使用一个POP3邮箱的权限,并阅
读邮箱里的信息。利用FreePOP,你可以了解到一个POP3邮箱中未读信息
的数量,浏览某个信息不同的标题(包括主题,日期,以及邮件的来源),
检索信息内容,有选择的删除一个邮件,还可以直接在一个文件中阅读信
息。FreePop可以处理的文件尺寸达64K,如果文件尺寸更大,可以直接在
一个文件中检索。
下载地址1: http://www.geocities.com/SiliconValley/Lab/7135/FreePOP_Full.zip
下载地址2: http://www.angelfire.com/co/FreePOP/images/FreePOPFull.zip
相关站点: http://www.geocities.com/SiliconValley/Lab/7135/
ActiveX CD Control 1.0 (253K)
这是一个32位的控件,可以用来开发实时的CDROM访问。
它可以用来测试文件和卷标并且返回驱动器信息。如果出现错误的搜索,
开发者何以选择显示一个定制的内在表格提示需要CD的插入,或者显示
一个生成的错误代码。ActiveX CD控件甚至可以在需要的时候打开CD驱
动器门。共享版本只能使用程序内在的错误提示,不能自己定制。
下载地址: http://home.cwix.com/~pleslein@cwix.com/ActvxCD1.zip
相关地址: http://home.cwix.com/~pleslein@cwix.com/ActiveXCD.html
请访问我的主页,有大量的编程工具和控件供您下载。
主页地址: http://person.zj.cninfo.net/~yao
****************************************************************
****************************************************************
◆有问必答◆
★本期回答★
●083. 回答请mailto: yaozheng@kali.com.cn?subject=083
1、BCB3.0中能用VB5.0编译出的OCX控件吗?如何使用?
2、BCB3.0中,在Form上绘图,当此Form被其他窗口覆盖后,再激活,发现
所画的图形没有了,怎样恢复?(最好能象VB5.0中Form的AutoRedraw那样)
刘楷 liukai1111@263.net
答:
对于第一个问题,只要是OCX,就应该可以直接使用的。和普通的ActiveX没
有区别呀!
对于第二个问题,你要在WM_PAINT事件(在CBuilder中是OnShow事件)中,
用Canvas自己绘图。这样当出口重新获得焦点后或被覆盖掉的部分重新移
到视点后,就会自动触发WM_PAINT事件。阿蒙
●087. 回答请mailto: yaozheng@kali.com.cn?subject=087
能否详细讲述一下什么是回调函数以及如何使用回调函数.
谢谢 cuitao1999@btamail.net.cn
答:
回调函数一般用在API中Enum***类型的函数或者钩子函数中。
这是一个回调函数的简单例子,用来取的系统所有可用的显示字体。
int PASCAL GetSysFontNum(void)
{
if(FontList==NULL)FontList = new TStringList();
FontList->Clear();
::EnumFontFamilies(::GetDC(NULL),NULL,(FONTENUMPROC)EnumFontFamProc,NULL);
return FontList->Count;
}
int CALLBACK EnumFontFamProc(ENUMLOGFONT FAR *lpelf,NEWTEXTMETRIC FAR
*lpntm,int FontType,LPARAM lParam)
{
if(lpelf->elfFullName[0]!='\0'){
FontList->Add(AnsiString((char*)lpelf->elfLogFont.lfFaceName));
}
return 1;
}
阿蒙
__________________________________________________________________
★本期提问★
091. 回答请mailto: yaozheng@kali.com.cn?subject=091
请问:如何把一个多线程程序改编成wondows NT的service?我的程序改变后,
出现“没有服务响应机制”的提示错误。请详细说明步骤。能有例子最好!
请email: yym825@eastcom.com
092. 回答请mailto: yaozheng@kali.com.cn?subject=092
请问如何编程实现地震或爆炸时窗口的抖动效果? snahj@sbell.com.cn
093. 回答请mailto: yaozheng@kali.com.cn?subject=093
BCB的生手在Coding的过程中发现一些函数不知如何使用?
函数列表如下:
CEILING()
FLOOR()
INT()
MOD()
ROUNDDOWN()
ROUNDUP()
TRUNC()
除INT()能够在程序中正常工作外,其余几个都编译通不过。请高手指点!
E_mail: Amily_HJQ@gf.com.cn
提问信箱: yaozheng@kali.com.cn?subject=question
如果您有什么疑难问题,请发到上面的信箱里,我会及时把您的问题放在
杂志上的,希望编程高手们能不吝赐教,也希望这个栏目能成为大家交流
的场所。
****************************************************************
****************************************************************
◆编者的话◆
本刊已加入【CHINA-EZL】中国电子杂志联盟
联盟主页地址 http://china-ezl.yeah.net
◆欢迎光临我的个人主页
●《编程技术》 http://person.zj.cninfo.net/~yao
本刊的同名主页,主要以收集各类编程工具控件和程序源代码为主。
●《C++ Builder世界》 http://cppbuilder.myrice.com
本人最新制作的个人主页,是一个探讨C++ Builder编程的专题
网站,为广大的C++ Builder爱好者搜集关于C++ Builder的一切。
◆《编程技术》订、退方法:
请到本刊主页进行订退工作 http://person.zj.cninfo.net/~yao
如果您觉得这份刊物还不错的话,欢迎把它介绍给您的朋友.
不知道您看了这期刊物有什么想法或者是意见,欢迎向我提出来.
本人感激不尽,我的联系方法如下:
E-mail:yaozheng@kali.com.cn
ICQ#: 43260473
**************************THE END**************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -