博文

C++ Builder 访问 USB 口的方法(2006-03-29 23:25:00)

摘要: 编译环境: Borland C++ Builder 6.0, Windows Server 2003 DDK
运行环境: Win98/2000/XP/2003

下面是访问 USB 口必备的函数: #include <vcl.h>
#include <dir.h>
#include <setupapi.h>
#include "C:/WINDDK/3790/inc/ddk/w2k/usbdi.h"
#include "C:/WINDDK/3790/inc/ddk/w2k/devioctl.h"
#include <initguid.h>
//---------------------------------------------------------------------------
// 下面必须为驱动程序的 GUID 值, 这里我乱写的数
DEFINE_GUID(USB_DRIVER_GUID, 0x12345678,0xabcd,0x1122,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0x00);
//---------------------------------------------------------------------------
HANDLE OpenOneDevice(HDEVINFO hDvcInfo, PSP_INTERFACE_DEVICE_DATA DvcInfoData, char *sDevNameBuf)
{
  HANDLE hOut = INVALID_HANDLE_VALUE;

  ULONG  iReqLen = 0;
  SetupDiGetInterfaceDeviceDetail(hDvcInfo, DvcInfoData, NULL, 0, &iReqLen, NULL);

  ULONG iDevDataLen = iReqLen; //sizeof(SP_FNCLASS_DEVICE_DATA) +......

阅读全文(2969) | 评论:0

C语言中的位图(2006-03-19 23:18:00)

摘要:可以参见位图的显示

位图文件是分成4部分的。第一部分是位图文件头,它包括位图文件名,位图的大小和位图数据离文件头的偏移量。接下去的是位图信息头,它包括了位图的许多信息,比如位图的宽度,高度和位图使用的颜色数。再后面是颜色表,它可能包含了2个或更多的RGBQUAD结构。最后面是位图图象的数据。

一.位图结构如下:
---- 一、BMP文件结构

---- 1. BMP文件组成
---- BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

---- 2. BMP文件头
---- BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
---- 其结构定义如下:

typedef struct tagBITMAPFILEHEADER
{
WORDbfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORDbfReserved1; // 位图文件保留字,必须为0
WORDbfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图
// 文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;

---- 3. 位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本结构所占用字节数
LONGbiWidth; // 位图的宽度,以像素为单位
LONGbiHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount// 每个像素所需的位数,必须是1(双色),
// 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),
// 1(BI_RLE8压缩类型)或2(BI_R......

阅读全文(4068) | 评论:0

用C语言写的计算机重启和关机(2006-03-19 22:59:00)

摘要:重启 #include <stdlib.h>
main()
{
   system("shutdown /s /t 60");
}
关机 #include <stdlib.h>

int main(void)
{
   system("shutdown /s");
   return 0;
}
用DOS调用系统命令   http://www.programfan.com/blog/article.asp?id=6138......

阅读全文(4023) | 评论:2

单片机抗干扰技术及应用(2006-03-19 00:28:00)

摘要:随着单片微机在各个领域中的应用越来越广泛,对其可靠性要求也越来越高。单片机系统的可靠性由多种因素决定,其中系统抗干扰性能是可靠性的重要指标。工业环境有强烈的电磁干扰,因此必须采取抗干扰措施,否则难以稳定、可靠运行。

工业环境中的干扰一般是以脉冲形式进入微机系统,渠道主要有三条,如图1所示。

空间干扰(场干扰),电磁信号通过空间辐射进入系统。

过程通道干扰,干扰通过与系统相连的前向通道、后向通道及与其它系统的相互通道进入。

供电系统干扰,电磁信号通过供电线路进入系统。

一般情况下空间干扰在强度上远小于其它两种,故微机系统中应重点防止过程通道与供电系统的干扰。

抗干扰措施有硬件措施和软件措施。硬件措施如果得当,可将绝大部分干扰拒之门外,但仍然会有少数干扰进入微机系统,故软件措施作为第二道防线必不可少。由于软件抗干扰措施是以CPU为代价的,如果没有硬件消除绝大多数干扰,CPU将疲于奔命,无暇顾及正常工作,严重影响系统的工作效率和实时性。因此,一个成功的抗干扰系统是由硬件和软件相结合构成的。

笔者设计的激光打标控制系统由于现场使用环境较恶劣,各种干扰因素较多,如交流噪声、电网干扰及其它电磁干扰等,因此必须采取有效的抗干扰措施以确保系统稳定工作,下面介绍我们在该系统硬件、软件和CPU上采取的抗干扰措施。

硬件措施

光电隔离

在输入和输出通道上采用光电隔离器来进行信息传输是很有好处的,它将微机系统与各种传感器、开关、执行机构从电气上隔离开来,很大一部分干扰将被阻挡。本系统中步进电机驱动电路采用了光电隔离器4N33。电路如图2所示。

过压保护电路

在输入输出通道上应采用一过压保护电路,以防引入高电压,伤害微机系统。过压保护电路由限流电阻和稳压管组成,限流电阻选择要适宜,太大会引起信号衰减,太小起不到保护稳压管的作用。稳压管的选择也要适宜,其稳压值以略高于最高传送信号电压为宜,太低将对有效信号起限幅效果,使信号失真。步进电机驱动电路即采用过压保护电路。

抗干扰电源

微机系统供电线路是干扰的主要来源,电源采用隔离变压器接入电网,可以防止电网的干扰侵入微机系统。隔离变压器与普通变压器的不同之处......

阅读全文(3531) | 评论:0

CRC算法原理及C语言实现(2006-03-19 00:26:00)

摘要:本文从理论上推导出CRC算法实现原理,给出三种分别适应不同计算机或微控制器硬件环境的C语言程序。读者更能根据本算法原理,用不同的语言编写出独特风格更加实用的CRC计算程序。
关键词 CRC 算法 C语言
1 引言
循环冗余码CRC检验技术广泛应用于测控及通信领域。CRC计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC检验,关键的问题就是如何通过软件来完成CRC计算,也就是CRC算法的问题。
这里将提供三种算法,它们稍有不同,一种适用于程序空间十分苛刻但CRC计算速度要求不高的微控制器系统,另一种适用于程序空间较大且CRC计算速度要求较高的计算机或微控制器系统,最后一种是适用于程序空间不太大,且CRC计算速度又不可以太慢的微控制器系统。
2 CRC简介
CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以 )后,再除以一个多项式,最后所得到的余数既是CRC码,如式(2-1)式所示,其中B(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。
(2-1)
求CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码。本文不讨论32位的CRC算法,有兴趣的朋友可以根据本文的思路自己去推导计算方法。
CRC-16:(美国二进制同步系统中采用)
CRC-CCITT:(由欧洲CCITT推荐)
CRC-32:

接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,......

阅读全文(4253) | 评论:0

C to C++之一(2006-03-19 00:19:00)

摘要:C++技术固然是很时髦的,许多C用户都想在尽可能短的时间内为自己贴上C++的标签。介绍C++的书很多,但只有那些已经侥幸入门的用户才偶尔去翻翻,仍有不少在C++门口徘徊的流浪汉。 本文只针对C用户,最好是一位很不错的老用户(譬如他在遇到最简单的问题时都尝试着使用指针),通过一些C和更好的C++(本文用的是Borland C++3.1版本)例程介绍有关C++的一些知识,让读者朋友们“浅入深出”,轻轻松松C to C++! 一、标签!标签! 快快为你的程序贴上C++的标签,让你看起来很像个合格的C++用户…… 1.注释(comment)
C++的注释允许采取两种形式。第一种是传统C采用的/*和*/,另一种新采用的则是//,它表示从//至行尾皆为注释部分。读者朋友完全可以通过//使你的代码带上C++的气息,如test0l: //test01.cpp
#include
//I'm a C++user!
//…and C is out of date.
 
void main()
{
       cout<<"Hello world!\n"; //prints a string
}
 
Hello-world! 如果你尝试着在test0l. exe中找到这些高级的注释,很简单,它们不会在那里的。 2. cincout 你可能从test0l中嗅出什么味儿来了,在C++中,其次的贵族是cout,而不是很老土的printf ( )。左移操作符’<<’的含义被重写,称作“输出操作符”或“插入操作符”。你可以使用’<<’将一大堆的数据像糖葫芦一样串起来,然后再用cout输出: cout << "ASCII code of "<< 'a' << " is:" <<97; ASCII code of a is:97
 
如何来输出一个地址的值呢?在C中可以通过格式控制符”%p”来实现,如:
printf ("%p,&i); 类似地,C++也是这样:
cout <......

阅读全文(3885) | 评论:0

keil c 直接嵌入汇编的方法(2006-03-18 23:47:00)

摘要://keil c6.20c 直接嵌入汇编的方法!(C51BBS网友cuiwei)
//<asm.h>
#ifdef ASM
         unsigned long shiftR1(register unsigned long);
#else   
         extern unsigned long shiftR1(register unsigned long);
#endif
//end of asm.h //<asm.c>
#define ASM
#include <asm.h>
#include <reg52.h>
#pragma OT(4,speed)
unsigned long    shiftR1(register unsigned long    x)
{
    #pragma asm
    clr c
    mov a,r4
    rrc a
    mov r4,a     mov a,r5
    rrc a
    mov r5,a     mov a,r6
    rrc a
    mov r6,a     mov a,r7
    rrc a
    mov r7,a
   
    #......

阅读全文(6151) | 评论:1