C++builder 访问USB接口的方法

合集下载

CBuilder文件操作大全

CBuilder文件操作大全

在编程的过‎程中,文件‎的操作是一‎个经常用到‎的问题,在‎C++Bu‎i lder‎中,可以使‎用多种方法‎对文件操作‎,下面我就‎按以下几个‎部分对此作‎详细介绍,‎就是:‎1、‎基于C的文‎件操作;‎2、基于‎C++的文‎件操作;‎3、基于‎W INAP‎I的文件操‎作;4‎、基于BC‎B库的文件‎操作;‎5、特殊文‎件的操作。

‎‎壹、基于C‎的文件操作‎在‎A NSI ‎C中,对文‎件的操作分‎为两种方式‎,即流式文‎件操作和I‎/O文件操‎作,下面就‎分别介绍之‎。

一、‎流式文件操‎作这‎种方式的文‎件操作有一‎个重要的结‎构FILE‎,FILE‎在stdi‎o.h中定‎义如下:‎type‎d ef s‎t ruct‎{in‎t lev‎e l; /‎* fil‎l/emp‎t y le‎v el o‎f buf‎f er *‎/uns‎i gned‎flag‎s; /*‎File‎stat‎u s fl‎a gs *‎/cha‎r fd;‎/* F‎i le d‎e scri‎p tor ‎*/un‎s igne‎d cha‎r hol‎d; /*‎Unge‎t c ch‎a r if‎no b‎u ffer‎*/i‎n t bs‎i ze; ‎/* Bu‎f fer ‎s ize ‎*/un‎s igne‎d cha‎r _FA‎R *bu‎f fer;‎/* D‎a ta t‎r ansf‎e r bu‎f fer ‎*/un‎s igne‎d cha‎r _FA‎R *cu‎r p; /‎* Cur‎r ent ‎a ctiv‎e poi‎n ter ‎*/un‎s igne‎d ist‎e mp; ‎/* Te‎m pora‎r y fi‎l e in‎d icat‎o r */‎shor‎t tok‎e n; /‎* Use‎d for‎vali‎d ity ‎c heck‎i ng *‎/} F‎I LE; ‎/* Th‎i s is‎the ‎F ILE ‎o bjec‎t */‎FI‎L E这个结‎构包含了文‎件操作的基‎本属性,对‎文件的操作‎都要通过这‎个结构的指‎针来进行,‎此种文件操‎作常用的函‎数见下表‎函数功能‎fop‎e n() ‎打开流‎f clos‎e() 关‎闭流f‎p utc(‎)写一个‎字符到流中‎fge‎t c() ‎从流中读一‎个字符‎f seek‎() 在流‎中定位到指‎定的字符‎fput‎s() 写‎字符串到流‎fge‎t s() ‎从流中读一‎行或指定个‎字符f‎p rint‎f() 按‎格式输出到‎流fs‎c anf(‎)从流中‎按格式读取‎feo‎f() 到‎达文件尾时‎返回真值‎ferr‎o r() ‎发生错误时‎返回其值‎rewi‎n d() ‎复位文件定‎位器到文件‎开始处‎r emov‎e() 删‎除文件‎f read‎() 从流‎中读指定个‎数的字符‎fwri‎t e() ‎向流中写指‎定个数的字‎符tm‎p file‎() 生成‎一个临时文‎件流t‎m pnam‎() 生成‎一个唯一的‎文件名‎下‎面就介绍一‎下这些函数‎1.f‎o pen(‎)f‎o pen的‎原型是:F‎I LE *‎f open‎(cons‎t cha‎r *fi‎l enam‎e,con‎s t ch‎a r *m‎o de),‎f open‎实现三个功‎能为使‎用而打开一‎个流把‎一个文件和‎此流相连接‎给此流‎返回一个F‎I LR指针‎参数fi‎l enam‎e指向要打‎开的文件名‎,mode‎表示打开状‎态的字符串‎,其取值如‎下表字‎符串含义‎"r"‎以只读方‎式打开文件‎"w"‎以只写方‎式打开文件‎"a"‎以追加方‎式打开文件‎"r+‎"以读/‎写方式打开‎文件,如无‎文件出错‎"w+"‎以读/写‎方式打开文‎件,如无文‎件生成新文‎件‎一个文件‎可以以文本‎模式或二进‎制模式打开‎,这两种的‎区别是:在‎文本模式中‎回车被当成‎一个字符'‎\n',而‎二进制模式‎认为它是两‎个字符0x‎0D, 0‎x0A;如‎果在文件中‎读到0x1‎B,文本模‎式会认为这‎是文件结束‎符,也就是‎二进制模型‎不会对文件‎进行处理,‎而文本方式‎会按一定的‎方式对数据‎作相应的转‎换。

用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;。

CBuilder简易实例教程

CBuilder简易实例教程

Borland C++Builder 6.0教程Borland C++Bilder 6.0是Interprise(Borland)公司推出的基于C++ 语言的快速应用程序开发(Rapid Application Development,RAD)工具,它是最先进的开发应用程序的组件思想和面向对象的高效语言C++融合的产物。

C++Builder 充分利用了已经发展成熟的Delphi 的可视化组件库(Visual Component Library,VCL),吸收了Borland C++ 6.0 这个优秀编译器的诸多优点。

C++Builder 结合了先进的基于组件的程序设计技术,成熟的可视化组件库和优秀编译器,调试器。

发展到6.0版本,C++Builder 已经成为一个非常成熟的可视化应用程序开发工具,功能强大而且效率高。

C++Builder的特色:1.C++Builder 是高性能的C++开发工具C++Builder是基于C++的,它具有高速的编译,连接和执行速度。

同时,C++Builder具有双编译器引擎,不仅可以编译C/C++程序,还能编译Object Pascal语言程序。

2.C++Builder是优秀的可视化应用程序开发工具C++Builder是一完善的可视化应用程序开发工具,使程序员从繁重的代码编写中解放出来,使他们能将注意力重点放在程序的设计上,而不是简单的重复的劳动中。

同时,它提供的完全可视的程序界面开发工具,从而使程序员对开发工具的学习周期大大缩短。

3.C++Builder具有强大的数据库应用程序开发功能C++Builder 提供了强大的数据库处理功能,它使的程序员不用写一行代码就能开发出功能强大的数据库应用程序,这些主要依赖于C++Builder众多的数据库感知控件和底层的BDE数据库引擎。

C++Builder除了支持MicroSoft的ADO (Active Data Object)数据库连接技术,还提供了一种自己开发的成熟的数据库连接技术——BDE(Borland Database Engine)数据库引擎。

VC环境下 USB HID类说明

VC环境下 USB HID类说明

VC环境下 USB HID类说明1、头文件包含,库文件链接在VC中开发HID应用程序时,需要包含setupapi.h和hidsdi.h,包含方式必须为extern "C",如下所示:extern "C" {// Declare the C libraries used#include "setupapi.h" // Must link in setupapi.lib#include "hidsdi.h" // Must link in hid.lib};然后在setting—>Link—>object/libary modules 中添加setupapi.lib hid.lib 两个库文件。

void __stdcall HidD_GetHidGuid(__out LPGUID HidGuid //指针指向调用者分配的GUID的内存区域,通常返回HID设备的GUID );2.2 SetupDiGetClassDevsHDEVINFO SetupDiGetClassDevs(__in_opt const GUID *ClassGuid,// 一个特定类别GUID的指针__in_opt PCTSTR Enumerator, //过滤梅举的内容__in_opt HWND hwndParent, //用于关联到集合成员中的用户接口的顶层窗口句柄__in DWORD Flags //建立设备信息表的控制选项,DIGCF_PRESENT(当前存在的设备)DIGCF_ALLCLASSES(所有设备)DIGCF_PROFILE(当前硬件概况);) 如成功,返回包含所有与指定参数匹配的已经安装设备信息句柄,否则返回INV ALID_HANDLE_V ALUE 2.3 SetupDiEnumDeviceInterfacesBOOL SetupDiEnumDeviceInterfaces(__in HDEVINFO DeviceInfoSet, //一个指向设备信息集合的句柄,包含设备接口返回信息,通常是SetupDiGetClassDevs的返回值__in_opt PSP_DEVINFO_DATA DeviceInfoData, //指向特定设备的SP_DEVINFO_DATA类型的指针,__in const GUID *InterfaceClassGuid, //指向制定设备接口类的GUID指针__in DWORD MemberIndex, //设备信息中接口列表的索引值(初始值为0)__out PSP_DEVICE_INTERFACE_DA TA DeviceInterfaceData //指向调用者分配的SP_DEVICE_INTERFACE_DATA类型的内存区域的指针,调用前必须先配置DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DA TA)); 如成功,返回TRUE,否则返回FALSE,并可以调用GetLastError(void)获取错误信息2.4 SetupDiGetDeviceInterfaceDetailBOOL SetupDiGetDeviceInterfaceDetail(__in HDEVINFO DeviceInfoSet, //一个指向设备信息集合的句柄,包含设备接口返回信息,通常是SetupDiGetClassDevs的返回__in PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, //指向SP_DEVICE_INTERFACE_DA TA类型的内存区域的指针,SetupDiEnumDeviceInterfaces的返回 __out_opt PSP_DEVICE_INTERFACE_DETAIL_DATADeviceInterfaceDetailData,//SP_DEVICE_INTERFACE_DETAIL_DATA类型指针,用于获取路径,调用前必须先配置DeviceInterfaceDetailData.cbSize =sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA)__in DWORD DeviceInterfaceDetailDataSize, //DeviceInterfaceDetailData 的长度,__out_opt PDWORD RequiredSize, //DeviceInterfaceDetailData 的实际长度__out_opt PSP_DEVINFO_DA TA DeviceInfoData //PSP_DEVINFO_DATA 类型的指针,存放支持的设备接口信息,DeviceInfoData.cbSize =sizeof(SP_DEVINFO_DATA) ); 如成功,返回TRUE,否则返回FALSE,并可以调用GetLastError(void)获取错误信息2.5 HidD_GetAttributesBOOLEAN __stdcall HidD_GetAttributes(__in HANDLE HidDeviceObject, //HID设备句柄__out PHIDD_ATTRIBUTES Attributes //HIDD_A TTRIBUTES类型指针);2.6 CreateFileHANDLE WINAPI CreateFile(__in LPCTSTR lpFileName, //已打开的设备名称__in DWORD dwDesiredAccess, //操作权限,GENERIC_READ, GENERIC_WRITE(写模式), 或者both__in DWORD dwShareMode, //共享模式,0(禁止访问),FILE_SHARE_DELETE(删除),FILE_SHARE_READ(读),FILE_SHARE_WRITE(写)__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, //SECURITY_A TTRIBUTES类型指针__in DWORD dwCreationDisposition, //打开方式,对于设备来说经常设为OPEN_EXISTING__in DWORD dwFlagsAndAttributes, //设备属性和标识,经常设为FILE_ATTRIBUTE_NORMAL__in_opt HANDLE hTemplateFile //模板文件句柄); 如成功,则返回一个文件或设备的句柄2.7 ReadFileBOOL WINAPI ReadFile(__in HANDLE hFile, //文件或设备的句柄__out LPVOID lpBuffer, //存放读取数据的指针__in DWORD nNumberOfBytesToRead, //读取数据长度的最大值__out_opt LPDWORD lpNumberOfBytesRead, //读取数据的实际长度__inout_opt LPOVERLAPPED lpOverlapped //OVERLAPPED类型指针,若设备或文件被重复打开,需此参数); 如成功,返回TRUE,否则返回FALSE,并可以调用GetLastError(void)获取错误信息2.8 WriteFileBOOL WINAPI WriteFile(__in HANDLE hFile, //文件或设备的句柄__in LPCVOID lpBuffer, //存放写入数据的指针__in DWORD nNumberOfBytesToWrite, //写入数据长度的最大值__out_opt LPDWORD lpNumberOfBytesWritten, //写入数据的实际长度__inout_opt LPOVERLAPPED lpOverlapped //OVERLAPPED类型指针,若设备/文件被重复打开,需此参数); 如成功,返回TRUE,否则返回FALSE,并可以调用GetLastError(void)获取错误信息2.9 SetupDiDestroyDeviceInfoListBOOL SetupDiDestroyDeviceInfoList( __in HDEVINFO DeviceInfoSet); //释放SetupDiGetClassDevs使用的资源3、代码示例3.1 打开一个指定V endorID和ProductID的HID设备PSP_DEVICE_INTERFACE_DETAIL_DATA HID_FindDevices(USHORT V_ID, USHORT P_ID, unsigned short *FIFO_Length){GUID HidGuid;HDEVINFO DevInfo;HIDD_A TTRIBUTES DevAttributes;SP_DEVICE_INTERFACE_DATA DevData;PSP_DEVICE_INTERFACE_DETAIL_DATA DevDetail;PHIDP_PREPARSED_DA TA PreparsedData;HIDP_CAPS Capabilities;ULONG Length;int Index;BOOL ok;HANDLE DevHandle;int DevCount = 0;/* Get GUID for all System HIDs */HidD_GetHidGuid(&HidGuid);/* Get Device Information for all present devices */DevInfo=SetupDiGetClassDevs(&HidGuid,NULL,NULL,(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE) );DevData.cbSize = sizeof(DevData);DevDetail = NULL;Index = -1;*FIFO_Length = 0;/* Scan all Devices */do {Index++;/* Device Interface Element of a Device Information set */ok = SetupDiEnumDeviceInterfaces(DevInfo, 0, &HidGuid, Index, &DevData);if (!ok) break;/* Get Device Interface Details - Get Length */ok = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, NULL, 0, &Length, NULL);/* Allocate memory for Device Detailed Data */DevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA) malloc(Length);/* Set cbSize in the DevDetail structure */DevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);/* Get Device Interface Details */ok = SetupDiGetDeviceInterfaceDetail(DevInfo, &DevData, DevDetail, Length, NULL, NULL);if (!ok){free(DevDetail);DevDetail = NULL;continue;}/* Create File for Device Read/Write */DevHandle = CreateFile(DevDetail->DevicePath, GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,(LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING, 0, NULL);if (DevHandle == INV ALID_HANDLE_V ALUE){free(DevDetail);DevDetail = NULL;continue;}DevAttributes.Size = sizeof(DevAttributes);ok = HidD_GetAttributes(DevHandle,&DevAttributes);if(!ok){free(DevDetail);CloseHandle(DevHandle);DevDetail = NULL;continue;}if(DevAttributes.VendorID!=V_ID||DevAttributes.ProductID != P_ID){free(DevDetail);CloseHandle(DevHandle);DevDetail = NULL;continue;}/* Get Preparsed Data */ok = HidD_GetPreparsedData(DevHandle, &PreparsedData);if (!ok){free(DevDetail);CloseHandle(DevHandle);DevDetail = NULL;continue;}/* Get Device's Capabilities */HidP_GetCaps(PreparsedData, &Capabilities);*FIFO_Length = Capabilities.InputReportByteLength;CloseHandle (DevHandle);break;} while (DevCount < 20);SetupDiDestroyDeviceInfoList (DevInfo);return DevDetail;}3.2 发送过程(PC->Device)BOOL WINAPI WriteFile(__in HANDLE hFile, //文件或设备的句柄__in LPCVOID lpBuffer, //存放写入数据的指针__in DWORD nNumberOfBytesToWrite, //写入数据长度的最大值__out_opt LPDWORD lpNumberOfBytesWritten, //写入数据的实际长度__inout_opt LPOVERLAPPED lpOverlapped //OVERLAPPED类型指针,若设备/文件被重复打开,需此参数); 如成功,返回TRUE,否则返回FALSE,并可以调用GetLastError(void)获取错误信息此函数需要注意:(1)hFile是CreateFile创建的句柄;注意:CreateFile中的参数:GENERIC_READ | GENERIC_WRITE(2)lpBuffer是个全局型数值变量,且此数值一般要大于unsigned char [65],而且lpBuffer[0]需要赋予特定的值,用来存储REPORT ID(底层定义的特定值)。

c++ builder串口通信

c++ builder串口通信

m_CommTimeouts.WriteTotalTimeoutConstant = 1000;
if (SetCommTimeouts(m_hComm, &m_CommTimeouts))
// 串口超时参数设置
if (SetCommMask(m_hComm, dwCommEvents))
SetCommTimeouts 设置通信超时参数
SetCommMask 设定被监控事件
WaitCommEvent 等待被监控事件发生
WaitForMultipleObjects 等待多个被监测对象的结果
WriteFile 发送数据
ReadFile 接收数据
GetOverlappedResult 返回最后重叠(异步)操作结果
PurgeComm 清空串口缓冲区,退出所有相关操作
ClearCommError 更新串口状态结构体,并清除所有串口硬件错误
CloseHandle 关闭串行口
2、打开串口
函数CreateFile原本用于打开文件,但它同样可用于打开一个通信端口。与系统中其他对象一样,通信端口也是用句柄来标识的。CreateFile函数返回被操作的通信端口句柄,其调用方法如下:
// 设置串口事件掩码
if (GetCommState(m_hComm, &m_dcb))
// 获取串口当前状态
if (BuildCommDCB(“1200,N,8,1”, &m_dcb))
// 建立串口设备控制块
if (SetCommState(m_hComm, &m_dcb));
表5-1 常用串行通讯API函数及其作用
函数名 作用

基于C++ Builder的串口通信程序实现方法

基于C++ Builder的串口通信程序实现方法
ห้องสมุดไป่ตู้
以这里只做简单的介绍。利用汇编发送和接收一个
字 节 函数代 码如 下 :
vi o t r ( s ndsot drs u s ndc a d — o u ot u i e r A des, i e hr a d p bn g h n g t) a
使用cbuilder的vcl组件可以快速开发出优秀的windows应用程序但遗憾的是cbuilder自身没有提供串口通信的命令或组件不过利用activex控件或者第三方控件来实现串口通信程序设计就完全可以弥补这一遗憾
维普资讯
第 2 卷第 2 6 期
2O 07年 2月
关键词 : C++B i e;串口通信 ;Wi osA I udr l n w P d
中图分类号 :P9 T 3
文献标识码 : A
文章编号 :08—82 (0r 0 ( 2 2 10 752。 )2一I 4—0 7 )
Re l a in o e i lCo m u ia i n Pr g a s d o a i to fS ra m z n c to o r m Ba e n
现串 口通信程序设计就完全可以弥补这一遗憾 。在
c+ +B ie 境 下 串 口通 信 的 3种实 现 方法 : udr l 6环 一 是 采用 在 c++程 序 中嵌 入行 间汇 编 , 接 对 U R 直 AT
串 口通信硬件进行操作 , 实时 I最高 , 生 但编程需要了 解硬 件。二是 利 用 V B下 高性 能 的 A te cvX控件 i
1 嵌入 汇编 的 串口通信程序 实现方法
因为汇编语言的执行效率比高级语言高 , 适用
于串 口通信 实时 性要 求 高 的 场 合 。在 c+ +B ie ul r d

C++ Builder 访问 USB 口的方法

C++ Builder 访问 USB 口的方法

C++Builder访问USB口的方法(浏览41700次)Victor Chen,(C++爱好者)编译环境:Borland C++Builder 6.0,Windows Server2003DDK 运行环境:Win98/2000/XP/2003下面是访问USB口必备的函数:有了上面的函数就可以访问USB口了:USB设备、USB驱动、USB应用程序B设备硬件部分a.这个硬件的标识是用的Vender ID和Product ID,即“厂家标识”和“产品标识”b.这个硬件规定了各个End Point(端点)的性质,读/写及类型(Control/Interrupt/Bulk/Isochronous)c.这个硬件的固件里面有DeviceIoControl的实现部分,规定了这个函数的具体参数和动作B设备驱动①硬件接口a.需要识别Vender ID和Product IDb.对每个EndPoint的每个I/O分配一个Pipe,并且起一个名字作为软件接口c.做DeviceIoControl的接口②软件接口a.GUID,驱动程序的标识,每个驱动程序使用不同的GUID,GUID是识别驱动的,与硬件无关(驱动程序升级版本GUID不能修改)b.硬件接口里面的b:Pipe名字是软件接口,这个Pipe名字纯粹由驱动定义的,和硬件无关,升级驱动不能改Pipe的名字c.硬件接口里面的c的各个参数也是软件的接口,这些参数是由硬件带来的,不是驱动规定的,当然也可以在驱动里面转义,隐藏设备的真实情况③这个驱动程序是用WinDDK编译的,可以用文本编辑器或其他开发工具的编辑器编程序代码,然后调用WinDDK编译3.读写USB口的程序①与驱动的接口a.利用驱动程序里面的GUID找出设备的文件名,用CreateFile函数打开设备。

我前面的程序里面的OpenUsbDevice就是这个作用b.通过a.得到的设备文件名和驱动程序里面的Pipe名打开Pipe,访问这个Pipe对应的USB 端点(读写数据)c.使用a.的CreateFile得到的句柄,通过DeviceIoControl实现设备规定的动作②有关需要的资料a.Vender ID,Product ID和GUID一般在驱动程序的.inf文件里面能看到,如果找不到就需要和厂家联系b.Pipe的名字是驱动程序规定的,需要有驱动程序的资料才能知道c.DeviceIoControl的参数需要有驱动程序的资料或者硬件资料才能知道③这个程序一般用C/C++直接编写,如果使用其他语言(VB/PB等)需要调用C/C++编的DLL其他相关内容:USB驱动程序可以到注册表里面找到:"HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Enum\\USB\\Vid_厂家标识&Pid_产品标识\\驱动程序"里面的ClassGUID就是驱动程序的GUID标识,例如{36FC9E60-C465-11CF-8056-444553540000}相当于程序的:DEFINE_GUID(USB_DRIVER_GUID,0x36FC9E60,0xC465,0x11CF,0x80,0x56,0x44,0x45,0x53,0x54,0x00,0x00);另外在这个注册表键里面还可找到有关设备的其他描述,例如DeviceDesc="USB Mass Storage Device"等。

C++ Builder中访问远程数据库的另一种途径word资料6页

C++ Builder中访问远程数据库的另一种途径word资料6页

C++ Builder中访问远程数据库的另一种途径引言:BCB有强大的数据库控制能力。

它的控件面板上的“Data Access”、“ADO” 、“Data Controls” 、“QReport”四组控件都是关于数据库操作以及报表的,它们利用BDE包装了Windows的ODBC,可方便地连接到本地数据库文件或一个远程的数据库服务器。

本文使用ZEOSDBO编制程序,它不使用BDE和ODBC,同时安装程序制作较为简单,是Borland C++ Builder访问远程数据库的一种好的途径。

本文结构如下,第一部分给出了数据库的Client/Server(客户机/服务器)结构以及BCB下的数据库控件;第二部分给出了ZEOSDBO的安装过程;第三部分描述了一个ZEOSDBO的使用简例;第四部分由介绍了使用ZEOSDBO的数据库软件的安装;最后,我们对本文进行了总结。

一关于数据库的Client/Server(客户机/服务器)结构以及BCB下的数据库控件当数据的管理进入数据库时代以后,数据库应用系统的结构就是一个独立的数据库服务器,它为其它多台计算机上的应用软件提供数据服务。

微机的出现,使计算机普及到了社会的各个角落,也造就了大量的微机数据库软件的出现。

对于数据库领域而言它却使数据与程序的一对多关系回到了一对一的状态中,这与数据传统的文件管理方式并没有大的差别。

在现代,网络的广泛使用使我们建立一个网络上的数据库Client/Server结构成为可能。

以下的例子可以说明它的好处。

在一个PowerBuilder写的库存管理系统中,它使用了一个本地的一个Sybase SQL Anywhere ODBC数据源,其中的一个汇总需要大约两小时。

当给它使用一个网络上的ODBC数据源时,它只用大约20分钟就可完成这个汇总。

两台机器的配置是:客户机,赛扬366,32M内存;服务器,奔腾200MMX,32M内存;100M网络。

可见,使用网络上的C/S结构的效果是显尔易见的:管理方便、性能提高。

vc下usb接口的实现

vc下usb接口的实现

vc下usb接口的实现#include <setupApi.h>#pragma comment(lib, "setupApi.lib")//加载lib文件//-----------------Initilize USB port---------unsigned int VendorID,ProductID;char temp_buffer[100];unsigned char DataBuffer[1],BufferLength; //接收unsigned char SendDataBuffer[1],SendBufferLength; //发送int HIDCounter=0;GUID hidGuid;HDEVINFO AllHIDDeviceInfo=NULL;HANDLE HIDDevice=NULL,ReadHIDDevice= NULL;HIDD_ATTRIBUTES Attributes;PSP_DEVICE_INTERFACE_DETAIL_DATA ClassDeviceData ;SP_INTERFACE_DEVICE_DATA deviceInfoData;ULONG neededLength,requiredLength;DWORD bytesRead;bool InitUSB(){VendorID = 0x0000;ProductID = 0x0000;// 查找设备// 本例程使用HID设备的API,它查找HID设备列表,找出与Vendor ID 和 Product ID匹配的设备ClassDeviceData =NULL;HIDDevice =NULL;deviceInfoData.cbSize =sizeof(deviceInfoData);// 从操作系统获取HIDs 的GUIDHidD_GetHidGuid(&hidGuid);// 获取所有HIDs的设备信息AllHIDDeviceInfo=SetupDiGetClassDevs(&hidGuid,NULL,NU LL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);HIDCounter=0;while (TRUE){// 这个API将发现的设备信息写入 deviceInfoData// HIDCounter 允许这个API重复调用所有HID设备// 如果API调用返回0,没有更多的HID设备发现if (!SetupDiEnumDeviceInterfaces(AllHIDDeviceInfo,0,&hid Guid,HIDCounter,&deviceInfoData)){// 没有发现与Vendor ID 和 Product ID匹配的HID设备SetupDiDestroyDeviceInfoList(AllHIDDeviceInfo);return FALSE;}else{// 发现一个HID设备,获取设备的详细信息// 第一次调用SetupDiGetDeviceInterfaceDetail得到ClassDeviceData// 的大小,但返回错误SetupDiGetDeviceInterfaceDetail(AllHIDDeviceInfo,&deviceI nfoData,NULL,0,&requiredLength,NULL);neededLength =requiredLength;ClassDeviceData =(PSP_DEVICE_INTERFACE_ DETAIL_DATA)malloc(neededLength);ClassDeviceData->cbSize =sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);//第二次调用SetupDiGetDeviceInterfaceDetail// 使用合适的neededLength.if (!SetupDiGetDeviceInterfaceDetail(AllHIDDeviceInfo,&de viceInfoData,ClassDeviceData,neededLength,&requiredLength,NULL)){free(ClassDeviceData);SetupDiDestroyDeviceInfoList(AllHIDDeviceInfo);return FALSE;}// 建立HID设备的句柄HIDDevice=CreateFile(ClassDeviceData-> DevicePath, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);// 获取 attributes 以便得到Vendor ID 和 Product IDHidD_GetAttributes(HIDDevice,&Attributes);if ((Attributes.VendorID == VendorID) && (Attributes.ProductID == ProductID)){// 找到了匹配的Vendor ID 和 Product ID的HID设备// 建立ReadHIDDevice设备的句柄以便读取信息ReadHIDDevice=CreateFile(ClassDeviceData-> DevicePath, GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);free(ClassDeviceData); SetupDiDestroyDeviceInfoList(AllHIDDeviceInfo);//初始化成功return TRUE;}else{CloseHandle(HIDDevice);}free(ClassDeviceData);HIDCounter = HIDCounter+1;}}}//Read from usb prot,that is listen to usb port ,if it has character,system would display it on user interf acebool ReadUSB(){BufferLength=1;memset(DataBuffer,0,1);if(!ReadFile(ReadHIDDevice,DataBuffer,BufferLength,&bytes Read,NULL)) //失败return false; //读数失败立即返回elsereturn true;}//Wirte a character or a string to usb portbool WriteUSB(){CString str;SendBufferLength=1;SendDataBuffer[0]=65;str=SendDataBuffer;if (!WriteFile(ReadHIDDevice,SendDataBuffer,SendBufferLe ngth,&bytesRead,NULL)){return false;//失败}else{AfxMessageBox( "Success! ");return true;//成功}}//Thread callback functionvoid CUsblistenDlg::OnSend(){// TODO: Add your control notification handler cod e hereSendDataBuffer[0]= 'C ';WriteUSB();}void CUsblistenDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here an d/or call default//CString str;//ReadUSB();//str=DataBuffer;//if(DataBuffer[0]!=0)//{// CListBox *listbox=(CListBox*)GetDlgItem(IDC_ LIST1);// listbox-> AddString(str);//}//else//{// CListBox *listbox=(CListBox*)GetDlgItem(IDC_LIST1 );// listbox-> AddString( "No Charcters is sent to usb port ");//}WriteUSB();CDialog::OnTimer(nIDEvent);}。

Control Builder Plus V2_2使用说明

Control Builder Plus V2_2使用说明

技术资料AC500文档编号:AD220030可升级的控制器灵活的自动化控制系统Control Builder Plus V2.2的使用(1) 在实际的系统构建时,请先确认系统组成设备、装置,如使用过程中对额定值、性能留有余量,以及万一发生故障时将危险降到最低的安全电路等。

(2) 为了安全使用系统,请获取组成系统的各个设备、装置的指南及安装说明书,在确认好包括“安全注意事项”、“安全要点”等内容后再使用。

(3) 本文件所属的产品/系统只允许由具备相关工作经验要求的合格人员进行操作,确认适合系统的规格、法规及规定。

(4) 未经ABB公司许可,严禁擅自对本资料的一部分或全部内容进行篡改及散发。

(5) 本资料的记录内容为测试指导,在应用过程,请根据现场实际情况适当调整,或者咨询ABB技术支持人员。

(6) 我们已对文档中所述内容与硬件和软件的一致性作过检查。

然而不排除存在偏差的可能性,因此我们不保证文档中所述内容与硬件和软件完全一致。

文档中的数据都按规定经过检测,必要的修正值包含在下一版本中。

(7) 本资料的记录内容若有改版,恕不另行通知。

1.序言 (4)1.1.参考文档 (4)1.2.硬件和软件需求 (4)1.3.连接电源 (4)1.4.PLC与电脑连接 (4)2.安装PS501 Control Builder V2.2 (5)3.Control Builder Plus软件的使用 (6)3.1.Control Builder Plus概述 (6)3.2.创建一个新工程 (7)3.3.PLC硬件组态 (8)3.3.1 CPU属性参数配置 (9)3.3.2本地I/O配置 (9)3.3.3 CPU底板集成端口配置 (12)3.3.4 FBP从站接口配置 (14)3.3.5 CS31主站工作模式 (15)3.3.6 通讯模块配置 (16)3.4.安装设备描述文件 (21)4.编程平台CoDeSys概述 (22)4.1.程序组织单元POU (22)4.2.变量 (23)4.3.标准数据类型 (24)4.4.任务管理 (24)4.5.库文件 (26)4.6.编制程序 (28)4.7.离线仿真 (31)5.计算机与PLC联机 (33)5.1.通过串口COM1/COM2与PLC联机 (33)5.2.用以太网与PLC联机 (35)5.3.在Control Builder Plus中与PLC联机 (39)6.强制新值与写入新值 (41)1. 序言本文档面向的读者是那些负责调试和使用AC500的用户。

mfc的libusb用法例程

mfc的libusb用法例程

MFC(Microsoft Foundation Classes)是一个在 Windows 平台上开发图形用户界面(GUI)应用程序的框架。

而 libusb 是一个用于与 USB 设备进行通信的开源库。

下面是一个简单的 MFC 例程,演示如何使用 libusb 与 USB 设备进行通信:1. 首先,确保你已经在项目中包含了 libusb 的头文件和库文件。

你可以从 libusb 的官方网站下载并安装 libusb。

2. 创建一个 MFC 对话框应用程序,并打开对话框的类文件(例如 CMyDialog.cpp)。

3. 在类文件中添加以下代码:```cpp#include "libusb.h"void CMyDialog::OnBnClickedButton1(){libusb_context *ctx;libusb_device_handle *dev_handle;int r;// 初始化 libusbr = libusb_init(&ctx);if (r < 0) {// 初始化失败return;}// 打开设备dev_handle = libusb_open_device_with_vid_pid(ctx, vendor_id, product_id);if (dev_handle == NULL) {// 打开设备失败libusb_exit(ctx);return;}// 进行 USB 通信操作...// 关闭设备libusb_close(dev_handle);// 释放 libusb 资源libusb_exit(ctx);}```在上述代码中,我们使用 libusb 的 API 实现了一个点击按钮后与 USB 设备进行通信的函数 `OnBnClickedButton1`。

首先,我们调用 `libusb_init` 函数初始化 libusb,并检查返回值以确保初始化成功。

C++Builder中串口通讯的经验之谈

C++Builder中串口通讯的经验之谈

C++Builder中串⼝通讯的经验之谈 经验。

(串⼝部分),相信不少的⼈都知道在VB中有⼀个控件MSComm(图标是⼀个⼩黄电话),它可以帮你完成普通的串⼝传输功能(⽐如字符串什么的,但有的却实现起来⽐较烦琐), 在BCB中要⽤VB的控件,我想很多⼈都知道怎么办,在菜单中点Component——>Import ActiveX Control在打开的框中找到你想要的Microsoft Comm Control6.0然后直接安装就可以了,注意,前提是你必须要装了VB或者有它的库,否则你可找不到的然后你就可以在组件板的Activex中看到⼀个⼩黄电话的图标了。

它是不可见的控件,它有不少属性,不过我认为最关键的⼏个属性就是 CommPort---设置或返回通讯端⼝号。

Settings---以字符串形式设置或返回波特率、奇偶校验、数据位和停⽌位。

PortOpen---设置或返回通讯端⼝的状态,以及打开和关闭端⼝(BOOL型)。

Input---从接收缓冲区返回和删除字符。

Output---向缓冲区写⼀个字符串。

这五个属性就可以帮你完成简单的串⼝传送接收(当然,你要保证你的传、收的可靠性,你还需要借助其他的属性,这些属性可以在VB中得到)下边我将介绍⼀下怎么来⽤这个控件,以及在程序中怎么组织程序。

⾸先,你要建⽴⼀个新的⼯程,然后把MSComm控件放到窗体上,别忘了再放⼀个Button控件(Name属性就是Button1)。

好了,双击Button1,得到如下:(请注意:本例的⼯程⽂件为Project1.bpr窗体⽂件为Unit.cpp头⽂件为Unit.h)#include <vcl.h>#pragma hdrstop#include "Unit1.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TForm1 *Form1;AnsiString buff[10]; //****************************声明了⼀个缓冲,请注意,⼀定要设置为全局变量//---------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){}//---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender) 在此加⼊程序代码{ MSComm1->CommPort=1; MSComm1->Settings="9600,N,8,1"; MSComm1->PortOpen=true; for(int i=0;i<=9;i++) { buff[i]=i; MSComm1->Output=buff[i]; } MSComm1->PortOpen=false;}//---------------------------------------------------------------------------运⾏此程序,当你点击按钮后,会发送数据(你可以在⽹上下载⼀个测试串⼝通讯的软件)下⾯,我来解释⼀下上边的程序: MSComm1->CommPort=1;这句程序是⽤来确定你将⽤哪⼀个串⼝实⾏你的通讯传输,我在这⾥选择是串⼝1(你也可以选择串⼝2,不过如果串⼝2不能⽤的话,系统会给你提⽰) MSComm1->Settings="9600,N,8,1";这句程序是⽤来设置污七杂⼋的东东的,我在程序中设置的波特率为9600,N为⽆奇偶校验,数据位为8,停⽌位为1。

C++ Builder 访问 USB 口的方法

C++ Builder 访问 USB 口的方法

C++ Builder 访问USB 口的方法(浏览 41700 次)Victor Chen, (C++ 爱好者)编译环境: Borland C++ Builder 6.0, Windows Server 2003 DDK 运行环境: Win98/2000/XP/2003下面是访问 USB 口必备的函数:有了上面的函数就可以访问 USB 口了:USB 设备、USB 驱动、USB 应用程序B 设备硬件部分a.这个硬件的标识是用的 Vender ID 和 Product ID, 即“厂家标识”和“产品标识”b.这个硬件规定了各个 End Point (端点) 的性质, 读/写及类型(Control/Interrupt/Bulk/Isochronous)c.这个硬件的固件里面有 DeviceIoControl 的实现部分, 规定了这个函数的具体参数和动作B 设备驱动①硬件接口a.需要识别 Vender ID 和 Product IDb.对每个 EndPoint 的每个 I/O 分配一个 Pipe, 并且起一个名字作为软件接口c.做 DeviceIoControl 的接口②软件接口a.GUID, 驱动程序的标识, 每个驱动程序使用不同的 GUID, GUID 是识别驱动的, 与硬件无关 (驱动程序升级版本 GUID 不能修改)b.硬件接口里面的 b: Pipe 名字是软件接口, 这个 Pipe 名字纯粹由驱动定义的, 和硬件无关, 升级驱动不能改 Pipe 的名字c.硬件接口里面的 c 的各个参数也是软件的接口, 这些参数是由硬件带来的, 不是驱动规定的, 当然也可以在驱动里面转义, 隐藏设备的真实情况③这个驱动程序是用 WinDDK 编译的, 可以用文本编辑器或其他开发工具的编辑器编程序代码, 然后调用 WinDDK 编译3.读写 USB 口的程序①与驱动的接口a.利用驱动程序里面的 GUID 找出设备的文件名, 用 CreateFile 函数打开设备。

C++Builder中数据库连接方法

C++Builder中数据库连接方法
并使用数据感知控件(如 89DU14F )来 实 现 对 数 据 库 中 的 数 据 显示和操纵, 达到与用户交互目的。
I()01F;(* 和 E0GG:-F 。 E0--()*40- 对象用于建立与数据库服务
器 或 其 它 数 据 库 的 连 接 , 在 EOOD<4BF(1N 中 对 应 于 修 8=9%E0--()*40- 控件; I()01F;(* 对象主要用于获取、保存、 改 从 数 据 库 得 到 的 查 询 结 果 , 在 EOOD<4BF(1N 中 对 应 于
R"QL(" 、 DMM<;;、 S<Q& 、 9:&<(5+;<、 TUG+;< 、 E(+MB< 和 VAM(";"P&, TW?,
同时也支持微软的 E=52(E$<:, =+&+G+;<, M"::<M&AXA&U , T<(X<(, 开放的数据库互连)数据源。系统只要提供数据库的驱动程序, 不需要了解数据库的具体细 5=C 就能访问这种类型的数据库, 它 节。 5=C 的核心数据库驱动文件由一系列动态连接库组成, 们是 5=C 访问本地数据库和远程数据库的驱动程序库。 对于单 机使用数据库, 2445%AB8<( 直 接 通 过 5=C 来 控 制 数 据 库 的 存 取, 如图 Y 所示。
I()01F;(*、 J4(FBF 和 310/(1*K ; 7 种集合为: J4(BF. 、 310/(1*4(.、 3:1:G(*(1. 和 51101. 。=9% 对象模型如图 7 所示。
8=9%E0--()*40- 控 件 ;实 现 复 杂 的 表 操 作 或 查 询 ,可 以 使 用 8=9%E0GG:-F 、 8=9%I()01F;(* 控件。

c#usb外设说明

c#usb外设说明

c#usb外设说明USB,是英文Universal Serial Bus(通用串行总线)的缩写,而其中文简称为“通串线”,下面是店铺带来的关于c# usb 外设说明的内容,欢迎阅读!c# usb 外设说明:这需要手机上安装一个服务程序,比如手机上某个端口有一个服务程序就是通过外部网络控制手机的,控制其他设备的前提是这个设备应该提供这种服务才行,一般应该有现成的程序供使用,你可以下载到移动设备上上,然后研究一下的控制协议,按照协议从PC机发数据就能实现控制。

所有的远程控制都是这个原理,被操作的一方提供服务程序,另一方通过协议发送数据,只是手机起始我不是很懂,应该有相关的软件和协议。

从1994年11月11日发表了USB V0.7版本以后,USB版本经历了多年的发展,已经发展为3.1版本,成为二十一世纪电脑中的标准扩展接口。

当前主板中主要是采用USB1.1和USB2.0,各USB版本间能很好的兼容。

USB用一个4针(USB3.0标准为9针)插头作为标准插头,采用菊花链形式可以把所有的外设连接起来,最多可以连接127个外部设备,并且不会损失带宽。

USB需要主机硬件、操作系统和外设三个方面的支持才能工作。

二十一世纪的主板一般都采用支持USB功能的控制芯片组,主板上也安装有USB接口插座,而且除了背板的插座之外,主板上还预留有USB插针,可以通过连线接到机箱前面作为前置USB接口以方便使用(注意,在接线时要仔细阅读主板说明书并按图连接,千万不可接错而使设备损坏)。

而且USB接口还可以通过专门的USB连机线实现双机互连,并可以通过Hub扩展出更多的接口。

USB具有传输速度快,使用方便,支持热插拔,连接灵活,独立供电等优点,可以连接鼠标、键盘、打印机、扫描仪、摄像头、充电器、闪存盘、MP3机、手机、数码相机、移动硬盘、外置光驱/软驱、USB网卡、ADSL Modem、Cable Modem等,几乎所有的外部设备。

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

KWWSZZZFSSIDQVFRPDUWLFOHVV\VWHPEFEBXVEBDDVS

%&% ၡ
86%


ᗥᗥᗥᗥᗥ ^ ᗥᗥᗥᗥᗥᗥᗥ EUHDN ᗥᗥᗥᗥᗥ ` ᗥᗥᗥ` ᗥ 6HWXS'L'HVWUR\'HYLFH,QIR/LVW K'HY,QIR ᗥ UHWXUQ K2XW ` ERRO *HW8VE'HYLFH)LOH1DPH FRQVW *8,' S*XLG FKDU V'HY1DPH%XI ^ ᗥ +$1'/( K'HY 2SHQ8VE'HYLFH S*XLG V'HY1DPH%XI ᗥ LI K'HY ,19$/,'B+$1'/(B9$/8( ᗥᗥᗥ^ ᗥᗥᗥᗥᗥ&ORVH+DQGOH K'HY ᗥᗥᗥᗥᗥUHWXUQ WUXH ᗥᗥᗥ` ᗥ UHWXUQ IDOVH ` +$1'/( 2SHQ0\'HYLFH ^ ᗥ FKDU 'HYLFH1DPH>0$;3$7+@ ᗥ UHWXUQ 2SHQ8VE'HYLFH 86%B'5,9(5B*8,' 'HYLFH1DPH ` +$1'/( 2SHQ0\'HY3LSH FRQVW FKDU 3LSH1DPH ^ ᗥ FKDU 'HYLFH1DPH>0$;3$7+@ ᗥ LI *HW8VE'HYLFH)LOH1DPH 86%B'5,9(5B*8,' 'HYLFH1DPH ᗥᗥᗥ^ ᗥᗥᗥᗥᗥVWUFDW 'HYLFH1DPH ?? ᗥᗥᗥᗥᗥVWUFDW 'HYLFH1DPH 3LSH1DPH ᗥᗥᗥᗥᗥUHWXUQ &UHDWH)LOH 'HYLFH1DPH *(1(5,&B:5,7(_*(1(5,&B5($' ),/(B6+$5(B:5,7(_),/(B6+$5(B5($' 18// 23(1B(;,67,1* 18// ᗥᗥᗥ` ᗥ UHWXUQ ,19$/,'B+$1'/(B9$/8( ` ‫ ܣ‬86% ҵ )L ၡ 86% ַ - 3LSH t
+$1'/( K'HYLFH 2SHQ0\'HYLFH LI K'HYLFH ,19$/,'B+$1'/(B9$/8( ‫ܣ‬ၠ ͩ ᗥ^ ᗥᗥᗥ-. 'HYLFH,R&RQWURO ͩ$. ၠ t) Jȏ ၠ <ᎵW პ LI 'HYLFH,R&RQWURO K'HYLFH ,2&7/B5($'B[[[[ ,2%ORFN VL]HRI ,2%/2&. ᗥᗥᗥᗥ^ ᗥᗥᗥᗥᗥᗥͩ ᗥᗥᗥᗥ` &ORVH+DQGOH K'HYLFH `
%&% ၡ
86%


ַঠ
9&/Å

'26

ළc
-ၡ
&
૵3#ළ ළ-
´)ȩ
KWWSFSSIDQVFRP
&
%XLOGHU ၡ
ओ 9LFWRU &KHQ
&
86%
૵3#

")஧9 %RUODQG & %XLOGHU :LQGRZV 6HUYHU ''. - ஧9 :LQ;3 ၡ 86% ‫ؿ‬
ᎵW
+$1'/( K3LSH 2SHQ0\'HY3LSH 0\3LSH ᎵW ַ/ 3LSH ּၡ Č ,2 -/ƽL LI K3LSH ,19$/,'B+$1'/(B9$/8( ‫ ܣ‬3LSH ͩ ᗥ^ 5HDG)LOH K3LSH %XIIHU %XI6L]H Q%\WHV5HDG 18// K3LSH /) ‫ ̤ޖ‬%XIIHU / ᗥᗥᗥ:ULWH)LOH K3LSH %XIIHU %\WHV7R:ULWH Q%\WHV:ULWWHQ 18// ¹ %XIIHU / %\WHV7R:ULWH p༐Lˣ &ORVH+DQGOH K3LSH ᗥ` ȩ 'HYLFH,R&RQWURO ၡ 86% ၠ
ᗥ 63B,17(5)$&(B'(9,&(B'$7$ GHYLFH,QIR'DWD ᗥ GHYLFH,QIR'DWDFE6L]H VL]HRI 63B,17(5)$&(B'(9,&(B'$7$ ᗥ 8/21* Q*XHVV&RXQW 0$;/21* ᗥ IRU 8/21* L'HY,QGH[ L'HY,QGH[Q*XHVV&RXQW L'HY,QGH[ ᗥᗥᗥ^ ᗥᗥᗥᗥᗥLI 6HWXS'L(QXP'HYLFH,QWHUIDFHV K'HY,QIR S*XLG L'HY,QGH[ GHYLFH,QIR'DWD ᗥᗥᗥᗥᗥ ^ ᗥᗥᗥᗥᗥᗥᗥ LI K2XW 2SHQ2QH'HYLFH K'HY,QIR GHYLFH,QIR'DWD V'HY1DPH%XI ,19$/,'B+$1'/(B9$/8( ᗥᗥᗥᗥᗥᗥᗥᗥᗥ EUHDN ᗥᗥᗥᗥᗥ ` ᗥᗥᗥᗥᗥHOVH LI *HW/DVW(UURU (5525B12B025(B,7(06 1R PRUH LWHPV
F
Q%\WHV 18//
பைடு நூலகம்
86% ၠ 86% ၠ D-
86% ᎵW . ƣ
86% ּ
ַ ƣe
9HQGHU ,' < 3URGXFW ,' γdμv ƣe<d/_
KWWSZZZFSSIDQVFRPDUWLFOHVV\VWHPEFEBXVEBDDVS

%&% ၡ
ᗥ 8/21* L'HY'DWD/HQ L5HT/HQ VL]HRI 63B)1&/$66B'(9,&(B'$7$ ᗥ 363B,17(5)$&(B'(9,&(B'(7$,/B'$7$ S'HY'DWD 363B,17(5)$&(B'(9,&(B'(7$,/B'$7$ PDOORF L'HY'DWD/HQ ᗥ S'HY'DWD!FE6L]H VL]HRI 63B,17(5)$&(B'(9,&(B'(7$,/B'$7$ ᗥ LI 6HWXS'L*HW,QWHUIDFH'HYLFH'HWDLO K'YF,QIR 'YF,QIR'DWD S'HY'DWD L'HY'DWD/HQ L5HT/HQ 18// ᗥᗥᗥ^ ᗥᗥᗥᗥᗥVWUFS\ V'HY1DPH%XI S'HY'DWD!'HYLFH3DWK ᗥᗥᗥᗥᗥK2XW &UHDWH)LOH S'HY'DWD!'HYLFH3DWK *(1(5,&B5($'_*(1(5,&B:5,7( ),/(B6+$5(B5($'_),/(B6+$5(B:5,7( 18// 23(1B(;,67,1* 18// ᗥᗥᗥ` ᗥ IUHH S'HY'DWD ᗥ UHWXUQ K2XW ` +$1'/( 2SHQ8VE'HYLFH FRQVW *8,' S*XLG FKDU V'HY1DPH%XI ^ ᗥ +$1'/( K2XW ,19$/,'B+$1'/(B9$/8( ᗥ +'(9,1)2 K'HY,QIR 6HWXS'L*HW&ODVV'HYV S*XLG 18// 18// ',*&)B35(6(17_',*&)B,17(5)$&('(9,&(
LQFOXGH YFOK! LQFOXGH GLUK! LQFOXGH VHWXSDSLK! LQFOXGH &:,1''.LQFGGNZNXVEGLK LQFOXGH &:,1''.LQFGGNZNGHYLRFWOK LQFOXGH LQLWJXLGK! ‫( ؿ‬ᎵW ַ *8,' ɢ -/ƽL '(),1(B*8,' 86%B'5,9(5B*8,' [ [DEFG [ [ [ [ [ [ [ [ [ +$1'/( 2SHQ2QH'HYLFH +'(9,1)2 K'YF,QIR 363B,17(5)$&(B'(9,&(B'$7$ 'YF,QIR'DWD FKDU V'HY1DPH%XI ^ ᗥ +$1'/( K2XW ,19$/,'B+$1'/(B9$/8( ᗥ 8/21*ᗥᗥL5HT/HQ ᗥ 6HWXS'L*HW,QWHUIDFH'HYLFH'HWDLO K'YF,QIR 'YF,QIR'DWD 18// L5HT/HQ 18//
86%

相关文档
最新文档