VC++实现计算机并口的数据采集

合集下载

基于C++的数据采集器的设计与实现

基于C++的数据采集器的设计与实现

基于C++的数据采集器的设计与实现段卫国;赵佳【摘要】数据采集器是普遍用在超市、商场、各大小企业之中的数据采集设备.本文主要介绍如何基于C++语言来设计数据采集器,并根据数据库的基本原理,成功设计并验证了数据采集器,同时还介绍数据采集器的功能以及数据采集器怎样对企业当中的防窜货问题的解决办法.%Data collector is widely used in supermarkets, shopping malls, each size enterprise of data acquisition rnequipment. This paper mainly introduces how to based on the C + + language to design data acquisition unit, and according rnto the basic principle of database, the successful design and verify the data acquisition unit, and also introduces the rnfunction of data acquisition unit and data collection terminal how to enterprise of anti channeling cargo the solution of the rnproblem.【期刊名称】《电子设计工程》【年(卷),期】2013(021)005【总页数】3页(P143-145)【关键词】C++;防伪;防窜货;有效扩充;数据采集;系统数据库【作者】段卫国;赵佳【作者单位】渭南师范学院数学与信息科学学院,陕西渭南714000;渭南师范学院数学与信息科学学院,陕西渭南714000【正文语种】中文【中图分类】TP391.3C++是有C语言发展起来的一门语言,在各个领域都有着广泛的应用,C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言[1]。

用VC++实现USB接口读写数据的程序

用VC++实现USB接口读写数据的程序

用VC++实现USB接口读写数据的程序用VC++实现USB接口读写数据的程序使用一个GUIDguidHID_1查找并打开一个USB设备extern "C" int PASCAL SearchUSBDevice(){HANDLE hUsb;int nCount, i, j;//标记同一设备个数HDEVINFO hDevInfoSet;BOOL bResult;PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL;memset(m_sysversion, 0, 20);GetSysVersion(m_sysversion);// 检索相关GUID的USB设备总设备个数if (!GetUSBList()){return 0;}// 取得一个该GUID相关的设备信息集句柄hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE, // class GUIDNULL, // 无关键字NULL, // 不指定父窗口句柄DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备// 失败...if (hDevInfoSet == INVALID_HANDLE_VALUE){return NULL;}// 申请设备接口数据空间nCount = 0;bResult = TRUE;for (i=0; i< 34; i++){bDeviceOpen = FALSE;memset(m_DeviceDesc, 0, 256);}SP_DEVICE_INTERFACE_DATA ifdata;// 设备序号=0,1,2... 逐一测试设备接口,到失败为止while (bResult){ifdata.cbSize = sizeof(ifdata);// 枚举符合该GUID的设备接口bResult = ::SetupDiEnumDeviceInterfaces(hDevInfoSet, // 设备信息集句柄NULL, // 不需额外的设备描述(LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE, // GUID(ULONG)nCount, // 设备信息集里的设备序号&ifdata); // 设备接口信息if (bResult){ULONG predictedLength = 0;ULONG requiredLength = 0;// 取得该设备接口的细节(设备路径)bResult = SetupDiGetInterfaceDeviceDetail(hDevInfoSet, // 设备信息集句柄&ifdata, // 设备接口信息NULL, // 设备接口细节(设备路径)0, // 输出缓冲区大小&requiredLength, // 不需计算输出缓冲区大小(直接用设定值)NULL); // 不需额外的设备描述// 取得该设备接口的细节(设备路径)predictedLength=requiredLength;// if(pDetail)// {// pDetail =NULL;// }pDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength);pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);bResult = SetupDiGetInterfaceDeviceDetail(hDevInfoSet, // 设备信息集句柄&ifdata, // 设备接口信息pDetail, // 设备接口细节(设备路径)predictedLength, // 输出缓冲区大小&requiredLength, // 不需计算输出缓冲区大小(直接用设定值)NULL); // 不需额外的设备描述if (bResult){// 复制设备路径到输出缓冲区//::strcpy(pszDevicePath[nCount], pDetail->DevicePath);if (strcmp(m_sysversion, "winnt")==0){char ch[18];for(i=0;i<17;i++){ch=*(pDetail->DevicePath+8+i);}ch[17]='\0';if (strcmp(ch,"vid_0471&pid_0666")==0)//比较版本号,防止意外出错{memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ;memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ;READ_OS.hEvent = CreateEvent( NULL, // no securityTRUE, // explicit reset reqFALSE, // initial event resetNULL ) ; // no nameif (READ_OS.hEvent == NULL){break;}WRITE_OS.hEvent = CreateEvent( NULL, // no securityTRUE, // explicit reset reqFALSE, // initial event resetNULL ) ; // no nameif (NULL == WRITE_OS.hEvent){CloseHandle( READ_OS.hEvent );break;}hUsb=CreateFile(pDetail->DevicePath,//&guidHID_1,//GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL/*|FILE_FLAG_OVERLAPPED*/,NULL);if (hUsb != NULL){// 比较定位找到的USB在哪个USB PORT上char id[30];memset(id, 0, 30);i=0;do{id=*(pDetail->DevicePath+26+i);i++;}while(id!='#');id = '\0';for (j=0; j<34; j++){if(strcmp(id, m_USBList[j])==0){sprintf(m_DeviceDesc[j+1], "%s", pDetail->DevicePath); m_USBPositionMap[nCount] = j+1;break;}}CloseHandle(hUsb);nCount++;// break;}}// 比较驱动版本}// 比较操作系统版本else{memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ;memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ;READ_OS.hEvent = CreateEvent( NULL, // no security TRUE, // explicit reset reqFALSE, // initial event resetNULL ) ; // no nameif (READ_OS.hEvent == NULL){break;}WRITE_OS.hEvent = CreateEvent( NULL, // no securityTRUE, // explicit reset reqFALSE, // initial event resetNULL ) ; // no nameif (NULL == WRITE_OS.hEvent){CloseHandle( READ_OS.hEvent );break;}hUsb=CreateFile(pDetail->DevicePath,//&guidHID_1,// GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL/*|FILE_FLAG_OVERLAPPED*/,NULL);if (hUsb != NULL){if(strcmp(pDetail->DevicePath, m_USBList[j])==0){sprintf(m_DeviceDesc[j+1], "%s", pDetail->DevicePath); m_USBPositionMap[nCount] = j+1;break;}CloseHandle(hUsb);nCount++;// break;}}}}}// 释放设备接口数据空间::GlobalFree(pDetail);// 关闭设备信息集句柄::SetupDiDestroyDeviceInfoList(hDevInfoSet); iDeviceCount = nCount;return nCount;}// 写BOOL Writestr(char *buf,int buflen, int index){BOOL fWriteStat;DWORD dwErrorFlags;DWORD dwError;COMSTAT ComStat;char szError[ 10 ] ;DWORD ret;int len, i, j, packet;div_t div_result;BYTE sendpacket[65];BYTE xorcode="0x00";if (m_gphdCom[index] == NULL) // no usb device(jk100c) {return -1;}div_result = div(buflen, 58);if (div_result.rem == 0){packet = div_result.quot;}else{packet = div_result.quot+1;}for (i=0; i<packet; i++){memset(sendpacket, 0, 65);if(i==packet-1){// end packetif (div_result.rem == 0){len = 58;}else{len = div_result.rem;}}else{len = 58;}sendpacket[0] = 0x13;sendpacket[1] = 3+len;sendpacket[2] = 0x01;sendpacket[3] = packet*16+i+1;memcpy(sendpacket+4, buf+(i*58), len);for(j=0;j<len+3;j++){xorcode^=sendpacket[j+1];}sendpacket[len+4] = (char)xorcode;sendpacket[len+5] = 0x23;PurgeComm(m_gphdCom[index],PURGE_RXCLEAR|PURGE_TXCLEAR);// Sleep(10);fWriteStat = WriteFile(m_gphdCom[index], sendpacket, len+6,&ret, NULL); if (!fWriteStat){if(GetLastError() == ERROR_IO_PENDING){dwError = GetLastError();// an error occurred, try to recoverwsprintf( szError, "\n\r <CE-%u>", dwError ) ;OutputDebugString(szError);ClearCommError(m_gphdCom[index], &dwErrorFlags, &ComStat ) ;if (dwErrorFlags >0){wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ; OutputDebugString(szError);}}else{// some other error occurredClearCommError(m_gphdCom[index], &dwErrorFlags, &ComStat ) ;if (dwErrorFlags > 0){wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ; OutputDebugString(szError);}return FALSE;}}if (i != packet-1){// should be receive ackif (ReceivePacketAnswer(index) != 0){return FALSE;}}}return TRUE;}// 读int Readstr(char *buf,int nMaxLength, int index){BOOL fReadStat ;COMSTAT ComStat;DWORD dwErrorFlags;DWORD dwLength;DWORD dwError;char szError[ 10 ];if (fCOMMOpened==0){return FALSE; //串口未打开}// only try to read number of bytes in queueClearCommError(m_gphdCom[index], &dwErrorFlags, &ComStat) ;//dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue ) ;dwLength=nMaxLength;if (dwLength > 0){if (olap==TRUE){fReadStat = ReadFile(m_gphdCom[index],buf, dwLength, &dwLength,&READ_OS) ; if (!fReadStat){if (GetLastError() == ERROR_IO_PENDING){OutputDebugString("\n\rIO Pending");while(!GetOverlappedResult(m_gphdCom[index], &READ_OS,&dwLength, TRUE )){dwError = GetLastError();if(dwError == ERROR_IO_INCOMPLETE) continue;else{// an error occurred, try to recoverClearCommError(m_gphdCom[index],&dwErrorFlags, &ComStat ) ;break;}}}else // end-----if (GetLastError() == ERROR_IO_PENDING){// some other error occurreddwLength = 0 ;ClearCommError(m_gphdCom[index], &dwErrorFlags, &ComStat ) ;if (dwErrorFlags >0){wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;OutputDebugString(szError);}}} // end-----if (!fReadStat)} // end-----if (olap==TRUE)else{fReadStat = ReadFile( m_gphdCom[index],buf, dwLength, &dwLength, NULL ) ; if (!fReadStat){dwError = GetLastError();ClearCommError(m_gphdCom[index],&dwErrorFlags, &ComStat ) ;if (dwErrorFlags >0){wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;OutputDebugString(szError);}}PurgeComm(m_gphdCom[index],PURGE_RXCLEAR|PURGE_TXCLEAR);}}return dwLength;。

基于VC++的数据采集系统的设计

基于VC++的数据采集系统的设计

《中国自动识别技术》基于VisualC++(简称VC++)的数据采集系统能够在计算机控制系统中提高系统的实时性与通用性,操作界面更具备可操作性与扩展性,非常适合于生活和工业现场使用。

设计方案采集芯片采用AD7862,它是AD 公司推出的一个高速,低功耗,双12位的A/D 转换集成块,有四个模拟输入通道,分为两组,由A0选择。

每一组通道有两个输入(VA1&VA2or VB1&VB2),它们能同时被采样和转化,保存相对的信号,对模拟电压输入还具有过压保护功能,适合于生活和工业现场使用。

微处理器采用常用的AT89S52单片机。

AT89S52单片机使用方便,内部有256Bytes 片内RAM 、8K Flash ROM ,支持ISP 下载,易于在线编程调试,故采用这种单片机来做处理器。

本实验采用串口(RS232)将数据发送给PC 机,波特率为9600、无校验;用VC ++6.0编写相应的界面进行控制与显示。

实验电路的结构框图设计如图1:基于VC++的数据采集系统的设计卓朝松陈乐珠/文图1数据采集系统结构框图732017年6月第3期总第66期系统的分析与设计单片机控制AD 进行数据采集,将采集到的4路数据(共8字节)分别存入事先定义的数据缓冲区(共占8个字节),然后通过RS232串口发送到上位机,由PC 进行相关数据处理,最后在界面上显示采集结果。

该设计只采用一路,可以显示电压幅值与相关波形。

硬件设计单片机与PC 机通过串口进行通信,软件程序的设计和硬件电路的连接相对简单。

对于硬件来说,只需要把单片机的串口发送管脚TXD 和接收管脚RXD 经过232芯片的电平转换通过DB9与PC 机的I/O 口直接相连就可以了。

单片机串口为TTL 电平,PC 机串口为232电平,故需要电平转换电路。

实验采用MAX232进行电平转换,转换的电路如图2所示;AD7862硬件设计电路如图3所示。

图2RS232电平与TTL 电平转换电路图3AD7862硬件设计电路软件设计上位机的设计上位机的工作有两个方面,一是控制AD7862采集4个模拟通道,得到8字节数据(一个通道占2个字节),并保存到内部RAM 单元;二是负责与上位机(PC )通信,将保存的数据发送到PC ,让上位机做处理。

用VisualC++实现实时数据采集

用VisualC++实现实时数据采集

n a ea q iio )tm,出 g i d t c ust n s e n i  ̄
w i h出e t i grs lt n e r b rv d缸粕 5 ,st h∞ hc i n ou i al e i o e m e o mp 5n o
Ke y r s: Mu t daTi r I d 1 li i me  ̄ /O ea n t to DaeAcuii o me Op r t g Fme n i i t q st n; Reo t o i s ht n; P le i u s
应 用 , 其是 可 视 化 开 发 软 件 Vs l 尤 i a C+ + 的 出现 . 软 u 为
件 开 发 提 供 了强 大 的图 形 界 面 功 能 . 得 对 数 据 采 集 进 使
行 图 形 化 处理 更 为 方 便 , 发 出 来 的 应用 程 序 具 有 良 好 开 的 人机 交 互 功 能 。 汇 编语 言 的 特 点 是 难 调 试 , 高 级 语 而 言 具 有 良好 的可 读 性 及 方 便 的调 试 手 段 本文 采 用 美 国微 软 登司 推 出 的 Vsa C+ +为 软 件 i / u 开发工具 采样 间隔用多媒 体定时器进 行精确 定时 , 并 采 用 Vsa C+ + 提 供 的 端 口操 作 的操 作 台函 数进 行 硬 i l o 件 I0编程 。 /

要 :介 绍 了在 数 据 采 集 系统软 件 中使 用 Vsa C+ +的 多媒 体 定 时 器 实现 对 车 速 脉 冲 采 集 的 精 确 定 i l u
时 , 时分 辨 率 由 乐统 定 时 器的 5 ms 高到 lr。 定 5 提 r a 美 键 词 :多媒 体定 时器 ;LO操 作 函数 ;数 据 采 集 ;分辨 率 ; 车速 脉 冲 e

VC++实现计算机并口的数据采集

VC++实现计算机并口的数据采集

VC++实现计算机并口的数据采集前言计算机与外围设备的连接,有多种接口方式:串行、USB、SCSI、并行等,每一种接口方式都有其优点和缺点,由于串行和USB接口的抗干扰能力较强,传输距离远,所以在数据通信的时候,多采用以上两种方式。

但有些应用场合,如CCD、视频数据采集卡,其要求的传输距离近,这时候采用并行接口,而且这样的运用随着人们对数据处理速度要求的提高会越来越多。

另外当计算机用于模拟信号检测时,需要配置A/D转换接口电路,商品化的数据采集卡价格比较贵,而自己开发一套传统的数据采集卡需要很多知识的储备,尤其涉及到了低层驱动程序的开发,难度比较大。

并行接口的脚位定义1、物理接口描述计算机并口适配器或数据采集卡基本上都采用多模式方式控制芯片,并口适配器的工作方式可以在CMOS中设置。

并口工作模式有:标准并行接口(SPP)、简单双向接口(PS/2)、增强型并行接口(EPP1.9)、扩展功能接口(ECP)等。

物理接口采用了IEEE1284标准描述的Dsub25针内孔式连接器。

管脚信号随工作模式不同也有所不同,下面就默认工作都是SPP模式说明一下(见表1)。

其中S对应状态寄存器,C对应控制寄存器,它们对应的地址分别为基址(378H)+1、基址(378H)+2。

表1并行端口SPP模式下物理连线及输出方向简介2、相关寄存器描述图1是打印机适配器的控制寄存器,它只用了其中的低5位。

图1 控制寄存器图2是打印机适配器的状态寄存器,它只用了其中的高5位。

图2 状态寄存器其中每位与引脚对应关系如表1所示。

电路原理1、AD7820引脚及功能AD7820是AD公司的一种与微处理器兼容的高速8位模数转换器(ADC)芯片采用单+5V供电,无需外接时钟,内部有取样保持电路,转换时间达到1.36 μs。

引脚如图3所示引脚功能介绍:Vin模拟信号输人;图3 AD7820引脚图DBO-DB7三态数据输出;/RDY写控制/输出准备好;MODE模式选择,内部通过一个50μA电流源拉低,MODE=0时激活读模式,MODE=1时激活写一读模式;读控制,低电平时访问数据;中断输出控制位,低电平时表示AD转换结束;GND电源地;VREF(一)参考电压负端(一),零码输入模拟电压,范围是:GND≤VREF(一) ≤VREF(十);VREF(+)参考电压正端(十),满量程输入模拟电压,范围是:VREF(一) ≤VREF(十) ≤VDD;片选输人,进行读或写操作时,必须为低电平;溢出标志位;NC空管脚;VDD电源+5V.2、电路实现图4 A/D转换接口电路A/D转换接口电路原理如图4所示,AD7820工作在读模式下,只要产生一个负脉冲就开始数据转换。

基于VC++6.0的串口实时数据采集及实时曲线显示

基于VC++6.0的串口实时数据采集及实时曲线显示

豢c++6.。

的串口实时数据采集及实时曲线显示基于dn++9o的串口实时数据采集及实时曲线显一不K世邋BYTEacptH,acptL,acpt;if(m』tdcomm.GetcommEvent()==2)//事件值为2表示接收缓冲区内有字符{if(m』trlComm.GetInBu伍jrCount()==2)//判断压缩双字节BCD码是否全齐{varAcpt.vt=V7I』Il;//给vt成员赋值,指明BYTE数据类型(因该类型最适应二进制数)varAcept=m』trlComm.GetInput();//读取高字节BCD码acptH=vadnput.bVal;//将BYTE类型赋值(高字节BCD码)vadnput.vt=V7r』11;varAcept=ⅡLPtrlComm.GetInput();//读取低字节BCD码acptL=varInput.bVal;//将BYTE类型赋值(低字节BcD码)acptH=acptH一6★(acptH/16);//高字节BcD码转换成十进制数acptL=acptL一6★(acptL/16);//低字节BcD码换成十进制数acpt=acptH★100+acptL;//拼装成一个四位十进制数(以下包括图表处理程序段)}}】3MsChan控件应用和曲线满屏处理首先类似于串口通讯操作方法创建Mschalt控件项目和成员变量,在B00LCHwlDlg::0nInitDialog()中设置所需的MSChart控件属性:://Y轴属性设置VARIANTvari:m』h耐.GetPlot().GetAxis(1,vari).GetValueScale().setAuto(FALSE);//取消自动标注y轴刻度m上han.GetPlot().Ge认xis(1,v撕).GetValuescale().SetMaximum(5000);//设置v轴最大刻度为5000m』han.GetPlot().GetAxis(1,SetMajorDivision(10);//y轴刻度设置为lO等份m_chan.SetColu砌Count(1);//设置1条曲线//X轴属性设置m上han.GetPlot().Ge认xis(0,.SetAuto(FALSE);//取消自动标注x轴刻度m上han.SetRowcount(100);//一屏设置100个刻度m』hart.GetPlot().GetAxi8(O,.SetDivisioIlsPerTick(1):v撕).GetValueScale().vari).GetCate90ryscale()vari).GetCategoryScale()//一个刻度一个刻度线II西han.GetPlot().GetAxis(0,vari).GetCategoryScale().SetDivisionsPerLabel(1);//一个刻度一个标注WORDrow=1:CStringtempuⅪw;//以下清屏、标注一屏数值while((row<=100))lmjhart.SetRow(row);m』haIt.GetD砒aGrid().SetData(row,1,0,1);temp』w.Fo珊at(”%d”,Mr);m_chan.SetRowhbel(temp聊v);,,n)W++:l;随后,在函数0nc鲫m()中进行曲线绘制和满屏处理,其代码如下:::m上hart.SetRow(row);mjhan.GetDataGrid().setData(row,l,acpt,1);//绘制当前时刻的曲线if(mw%loo==0)//判断是否满屏(//满屏处理++Fulscmum;//满屏次数n心han.SetRowCount(100★Fulscmum);//屏幕扩大相应倍数,保持前屏曲线for(rI'mw=row;’rmw<=100★Fulscmum;Tmw++)//对新增加屏幕清屏,标注此屏相应数值信协议是:波特率4800bps,1位起始位,8位数据位,1位停fr心han.SetRow(rI’mw);止位,无奇偶校验位。

VC环境下高速实时数据采集的实现


题的思路有一定的通用性和参考价值。
1 实时数据采集功能的软件设计
在进行数据采集设计时主要有以下三种编程方式: 1 .1 软件方式取得 A/D 数据
利用系统提供 的 在 毫 秒 级 的 精 确 等 级 上,反 复 读取 A/D 数据以实 现 连 续 不 间 断 采 样,其 采 样 速 度 比 较 慢 ,实 时 性 比 较 差 ,因 此 多 用 于 低 速 场 合 。 1 .2 采用半满查询方式取得 A/D 数据
AfxMessageBox(“ 不 明 的 初 始 化 错 误 . . . . . ”,MB ICONERROR);
return FALSE; } whil(e bDeviceADRun)//循环采集 AD 数据 {
— 148 —
每个线程都共享创 建 它 们 进 程 的 内 存 空 间、全 局 变 量和系统 资 源 等。 因 而 在 VC ++ 环 境 下 开 发 实 时 测试系统需要采用 一 些 技 术,特 别 是 多 线 程 技 术 来 实 现 系 统 实 时 功 能 ,满 足 测 试 系 统 的 多 种 功 能 要 求 。 采用多线程技术具有如下优势:
①数据采集与控制线程 ②数据监控线程 ③数据存储线程 ④人机交互线程 数据采集线程与控制线程和数据存储线程属于 工 作 线 程 ,无 窗 口 操 作 ,这 样 数 据 采 集 线 程 不 会 发 生 堵塞。数据监控线程用于实时地将需要动态显示的 数据在监控屏幕上动态显示。数据存储线程最初不 做 任 何 工 作,调 用 Win32 API 函 数 WaitForSingleObject 进 入 等 待 状 态,此 时 它 不 消 耗 CPU 任 何 时 间,即可保证数据 采 集 与 控 制 线 程 有 充 分 的 运 行 机 会。当数据采集与控制线程取得指定长度的数据送 到用户定义 的 存 储 空 间 时,则 调 用 Win32 API 函 数 SetEvent 将指定事件消息发送给数据存储线程,数据 存储线程立即恢复 运 行 状 态,迅 速 对 这 批 数 据 进 行 相关处理,如采集 数 据 计 算 处 理、窗 口 绘 制 波 形、存 盘等操作。VC ++ 开发环境下在中断方式下采用多

vC++ 获取cpu信息,硬盘ID,网卡MAC地址_内部资料

目录摘要 (I)获取系统信息程序的开发1.设计目的 (1)2. 设计基本要求 (1)3. 设计内容 (1)4. 设计步骤 (1)5. 程序代码5.1头文件SysinfoView.h (5)5.2头文件Registry.h (6)5.3源文件SysinfoView.cpp (7)5.4源文件MainFrm.cpp (21)5.5源文件Registry.cpp (23)5.6源文件Sysinfo.cpp (26)6.设计成果 (26)总结 (27)参考文献 (28)摘要计算机系统信息包括硬件系统信息和软件系统信息。

硬件系统直接决定了软件系统运行的可行性,同时软件系统又反过来影响着硬件系统的运行。

因此,及时掌握计算机系统信息对于计算机用户来说尤其重要。

本课程设计介绍了如何利用Visual C++这一编程工具进行程序设计来获取计算机的系统信息。

关键词:Visual C++;计算机系统信息;程序设计获取系统信息程序的开发1.设计目的在学习了“VC++程序设计基础”课程的基础上,通过本编程设计练习,旨在加深对相关知识的理解,初步掌握VC++程序设计的基本设计方法,提高程序设计的基本技能及分析、解决编程问题的能力。

2. 设计基本要求计算机系统信息包括硬件系统信息和软件系统信息。

硬件系统直接决定了软件系统运行的可行性,同时软件系统又反过来影响着硬件系统的运行。

因此,及时掌握计算机系统信息对于计算机用户来说尤其重要。

本程序的主要功能如下:1)获取操作系统信息,显示该操作系统的版本号。

2)获取CPU运行速度3)获取内存大小,计算剩余内存大小和百分率4)获取网卡地址和本机机器的IP地址5)操作系统的操作(关闭系统、重启系统、快速重启系统)6)注册表的操作7)程序界面的鼠标拖动操作8)弹出菜单的应用3. 设计内容1)计算机安装操作系统后,操作系统将版本信息存放于注册表的特定位置:HKEY_LOCAL_MACHINE->”Software\\Microsoft\\Windows\\CurrentVersion\\Run\\”.因此只需要进行注册表的访问操作就可以得到相关的操作。

用C语言给NI数据采集卡编程序实现多路数据的同时采集

⽤C语⾔给NI数据采集卡编程序实现多路数据的同时采集 因为写的上⼀篇NI数据采集卡的程序有⼈留⾔说想要实现多路数据的同时采集,我没有及时回复,深感抱歉,在此写⼀篇关于NI数据采集卡的多路数据同时采集的程序 第⼀个程序实现的功能:六路数据同时采集,采集有限个数据,并且保存到txt⽂档中。

采⽤的是参考单端接地的⽅式,参考单端接地指的是我们测量的每⼀路的值是该路相对AI GND的电压值。

对参考单端接地不了解的话可以看NI-DAQmx C Reference help 不多说,上程序。

1 #include <stdio.h>2 #include "NIDAQmx.h"3#pragma comment(lib,"NIDAQmx.lib")4 #include<iostream>5using namespace std;67#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else89int main(void)10 {11 int32 error=0;12 int32 per_num;13 float64 data[6000];14 TaskHandle taskHandle=0;15char errBuff[2048]={'\0'};16 DAQmxErrChk (DAQmxCreateTask("",&taskHandle));17 DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev2/ai0:5","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));18 DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",20000,DAQmx_Val_Rising,DAQmx_Val_ContSamps,1000));1920 DAQmxErrChk (DAQmxSetAITermCfg(taskHandle,"Dev2/ai0:5",DAQmx_Val_RSE));21//DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(taskHandle,DAQmx_Val_Acquired_Into_Buffer,PER_NUM0,0,EveryNCallback,this)); 22//DAQmxErrChk (DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL));2324/*********************************************/25// DAQmx Start Code26/*********************************************/27 DAQmxErrChk (DAQmxStartTask(taskHandle));28 DAQmxErrChk(DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByScanNumber,data,6000,&per_num,NULL));29 FILE *fp1=fopen("data1.txt","w+");3031for(int l=0;l<6000;l++)32 {33 fprintf(fp1,"%f",data[l]);34 fputc('\n',fp1);35 }36 fclose(fp1);37 Error:38if( DAQmxFailed(error) )39 DAQmxGetExtendedErrorInfo(errBuff,2048);40if( taskHandle!=0 ) {41/*********************************************/42// DAQmx Stop Code43/*********************************************/44 DAQmxStopTask(taskHandle);45 DAQmxClearTask(taskHandle);46 }47if( DAQmxFailed(error) )48 printf("DAQmx Error: %s\n",errBuff);49 printf("End of program, press Enter key to quit\n");50 getchar();51return0;52 }这个程序实测过,可以使⽤,希望能够对⼤家有帮助。

用VisualC_实现实时数据采集

收稿日期:2001205202用Visual C++实现实时数据采集郑存红1,胡荣强1,赵瑞峰2(1.武汉理工大学电信学院,湖北武汉430070; 2.武汉市第七二二研究所,湖北武汉430079)摘 要:介绍了在数据采集系统软件中使用Visual C++的多媒体定时器实现对车速脉冲采集的精确定时,定时分辨率由系统定时器的55ms提高到1ms。

关键词:多媒体定时器;I/O操作函数;数据采集;分辨率;车速脉冲中图法分类号:TP319 文献标识码:A 文章编号:100123695(2002)0420103202Date Acquisition System Programming with Visual C++ZHE NG Cun2hong1,H U R ong2qiang1,ZH AO Rui2feng2(1.Institute o f Electricity&Communication,Wuhan Univer sity o f Science&Technology,Wuhan Hubei430070,China;2.Wuhan Marine Communca2 tions Research Institute,Wuhan Hubei430079,China)Abstract:The usage of multimedia timer in VC is presented in the paper,I t mainly introduces using multimedia timer to realize precise timing in date acquisition system,through which the timing res olution can be im proved from55ms to1ms.K ey w ords:Multimedia T imer;I/O Operating Function;Date Acquisition;Res olution;Pulse1 引言数据采集一般是采用软件或硬件的定时中断并通过A/D来读取外界传感器的数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC++实现计算机并口的数据采集
前言
计算机与外围设备的连接,有多种接口方式:串行、USB、SCSI、并行等,每一种接口方式都有其优点和缺点,由于串行和USB接口的抗干扰能力较强,传输距离远,所以在数据通信的时候,多采用以上两种方式。

但有些应用场合,如CCD、视频数据采集卡,其要求的传输距离近,这时候采用并行接口,而且这样的运用随着人们对数据处理速
度要求的提高会越来越多。

另外当计算机用于模拟信号检测时,需要配置A/D转换接口电路,商品化的数据采集卡价格比较贵,而自己开发一套传统的数据采集卡需要很多知识的储备,尤其涉及到了低层驱动程序的开发,难度比较大。

并行接口的脚位定义
1、物理接口描述
计算机并口适配器或数据采集卡基本上都采用多模式方式控制芯片,并口适配器的工作方式可以在CMOS中设置。

并口工作模式有:标准并行接口(SPP)、简单双向接口(PS/2)、增强型并行接口(EPP1.9)、扩展功能接口(ECP)等。

物理接口采用了IEEE1284标准描述的Dsub25针内孔式连接器。

管脚信号随工作模式不同也有所不同,下面就默
认工作都是SPP模式说明一下(见表1)。

其中S对应状态寄存器,C对应控制寄存器,它们对应的地址分别为基址(378H)+1、基址(378H)+2。

表1并行端口SPP模式下物理连线及输出方向简介
2、相关寄存器描述
图1是打印机适配器的控制寄存器,它只用了其中的低5位。

图1 控制寄存器
图2是打印机适配器的状态寄存器,它只用了其中的高5位。

图2 状态寄存器
其中每位与引脚对应关系如表1所示。

电路原理
1、AD7820引脚及功能
AD7820是AD公司的一种与微处理器兼容的高速8位模数转换器(ADC)芯片采用单+5V供电,无需外接时钟,内部有取样保持电路,转换时间达到1.36 μs。

引脚如图3所示
引脚功能介绍:
Vin模拟信号输人;
图3 AD7820引脚图
DBO-DB7三态数据输出;
/RDY写控制/输出准备好;
MODE模式选择,内部通过一个50μA电流源拉低,MODE=0时激活读模式,MODE=1时激活写一读模式;
读控制,低电平时访问数据;
中断输出控制位,低电平时表示AD转换结束;
GND电源地;
VREF(一)参考电压负端(一),零码输入模拟电压,范围是:GND≤VREF(一) ≤VREF(十);
VREF(+)参考电压正端(十),满量程输入模拟电压,范围是:VREF(一) ≤VREF(十) ≤VDD;
片选输人,进行读或写操作时,必须为低电平;
溢出标志位;
NC空管脚;
VDD电源+5V.
2、电路实现
图4 A/D转换接口电路
A/D转换接口电路原理如图4所示,AD7820工作在读模式下,只要产生一个负脉冲就开始数据转换。

所需的控制信号由打印机控制口的C1位输出线引脚14脚产生,向引脚输出一个负脉冲,A/D转换开始,在1.36 μs之后转换结束,数据锁存在片内三态输出数据锁存器中,引脚输出一个低电平。

引脚与打印机状态口的S7位对应的插座11
脚连接,通过查询状态口的S7位即可知道转换是否结束。

图4中74LS157为四2选1数据选择器,用于将结果分两次传给打印机状态口的S3~S6位,也就是与打印机的引脚15、13、12、10相连。

的控制信号由打印机控制口的C2位16脚控制。

计算机通过二次从打印机状态口获得数据。

软件实现
PC机配置上述A/D转换接口电路之后,就可以对模拟电信号的检测了,模拟电信号的输入范围为0~4.98V。

配上
传感器之后,就可用于非电学模拟量的检测。

下面给出一段小程序采用VC++语言编写的。

VC++中对端口的输入/输出,可以通过端口I/O函数一in p、一ou t
p来实现,函数包含在conio. h库中。

……………..
-outp(0x37a,3) ; //清理端口
-outp(0x37a,0) ; //启动a/d转换
Do{datainput=-inp(0x379)&0x80} ;
While(datainput!=0x80) ; //等待转换结束
Data=-inp(0x379); //输入低四位数据
Data=Data&0x78 ;
Data1=Data>>3;
-outp(0x37a,0x4); //控制16脚为高电平
Data=-inp(0x379) ; //输入高四位
Data=Data&0x78 ;
-outp(0x37a,3) ; //使A/D停止转换
Data=Data<<1;
Data=Data|Data1 //8位2进制合并
………… //进一步数据处理
结束语
本系统可应用在一些实时性要求不是很高的系统中,它抛弃庞大的单片微型计算机系统,也不占用微机扩展槽,体积小,耗费少,且突破了传统微机数据采集的固定模式,使数据采集装置与微机的接口更加灵活、方便。

相关文档
最新文档