看到这样一个usb通讯的帖子,可能对你有用! 主 题: 关于usb通讯方面的问题。请AKing大哥及相关高手来看看,万分感激!!!
! e0 V6 V+ o. u5 q作 者: aiyu33 () # \! |! i6 d4 ~$ J9 z( |, I+ j( O* q
等 级:
; d4 D1 Y! L& n, v# H信 誉 值: 100 4 k) C0 x7 F4 G0 L% o2 K i
所属论坛: C++ Builder Windows SDK/API ) V( ^, m; S+ U8 w6 K e
问题点数: 100 & {" C* y1 b1 K5 ] ?
回复次数: 12 ) Q: ~/ q5 X* s- I3 a. R
发表时间: 2003-12-16 20:43:13 1 G! Q u- F! C/ U; F$ A. B
5 ~0 A0 g5 \4 s7 K0 o' j , k' j# O* W9 E8 ?+ F
最今我接到了开发pc和pocket pc通过usb口通讯的任务。这两个星期我参考了很多方面的资料,特别是AKing大哥写的一些文章。但我始终没有打通这个关口,我贴出我的代码请AKing大哥看看,现在很急,多谢。
4 n' q7 q/ E7 epc的os是windows2000professional4 i" P# r" o& [/ O; Z
pocket pc是hp ipaq 2210,os 是pocket pc2003。* g3 m4 c$ S: M }; G0 |& V
我装了activesync3.7。我查看过了,这个activesync目录下有pocket pc的驱动程序。pc也能识别。
) \' u7 y$ \! p: G4 M下面是我在pc上调用usb的代码。* ~' ]: K, `& v- ]2 {7 c4 t1 e
下面的代码我能打开hidn类型的usb,但是就是不能打开pocket pc的usb。4 W- l( w) }% J1 R. `
//classGuid = {25dbce51-6c8f-4a72-8a6d-b54c2b4fc835}
% Q# H1 w: D! d" f, Q& [5 QDEFINE_GUID(GUID_CLASS_PALM,
; V! B; @ D( ], R" [7 n. R( P; W 0x25dbce51, 0x6c8f, 0x4a72, 0x8a, 0x6d, 0xb5, 0x4c, 0x2b, W: @& T' Z1 V7 ^# \2 q R; Y
0x4f, 0xc8, 0x35);" e8 W# Y c6 g' O
GUID HidGuid = GUID_CLASS_PALM;
9 i- M% k- M, FHANDLE Get_DeviceHandle( GUID* pGuid)* G/ A. F) n4 S+ O4 P4 h1 N9 y6 B
{
7 k+ L; R0 M; d* l% r
9 H# J* J* ?: L0 _: l3 `5 g HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);7 X3 O3 E7 ]- Q$ p
! B1 S9 k9 y# k6 T1 @ if(info==INVALID_HANDLE_VALUE)5 ~1 v# t; U' ?7 m# u
{6 X) Y' h, M. y
printf("No HDEVINFO available for this GUID\n");" m+ z o2 S9 @% k8 n
return NULL;; ?. x3 A' Q" ]$ z
}
, W5 v5 U0 q( {. e SP_INTERFACE_DEVICE_DATA ifdata;
/ K# w: s# r2 J3 U ifdata.cbSize = sizeof(ifdata);: L8 F5 c* o5 L5 p# i8 B# ~+ S+ A! W3 r
//0000是我在注册表中找到的序号
& P4 E' P8 j- h9 F9 V8 r# x if(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, 0000, &ifdata))2 o( e* }/ X! Z9 w
{
# v- J7 s3 b7 n3 u- o2 L6 y printf("No SP_INTERFACE_DEVICE_DATA available for this GUID instance %d \n", instance+1);
0 J* p7 P% z' h; \3 m, m SetupDiDestroyDeviceInfoList(info);. o0 z- j9 A7 {$ a
return NULL;' C; f8 n# Q# N2 J& t+ A; v: Q- [
} // Get size of symbolic link name: o' x H) z; G$ ]
DWORD ReqLen;
( ^! b1 ~' E; t9 |
& \/ J+ r \5 z5 u- C SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &ReqLen, NULL);# s' D% G& s# S H+ \
9 c$ Q" f; L& ~+ I$ n PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]);& I, \3 ?/ O, y. h; P9 ?
" a' f4 V! Q1 B; C( ] if( ifDetail==NULL)8 H' Z* X, O) X7 z
{* C( s/ O; n& m/ l! E5 S
SetupDiDestroyDeviceInfoList(info);
6 T% V4 G) x4 R return NULL;) X' V0 e A' S
} // Get symbolic link name) D$ v6 X+ F* \/ }* H9 f7 ]' o; o
ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);" u& Z/ j+ S) [7 N6 T( k% p
) i# D7 V, I1 u if( !SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, ReqLen, NULL, NULL))9 r( X1 {! y2 l
{
* m6 z* j6 {) U; a Y: [ SetupDiDestroyDeviceInfoList(info);' [6 ~" g/ e$ A3 ~. K% l
delete ifDetail;
+ v0 L3 A, q0 z- [( u return NULL; l; c3 c" ~6 r, x9 \: h# t
} printf("Symbolic link is %s\n",ifDetail->DevicePath);+ y. r0 I" j' g/ p
/*\\?\\usb#vid_03f0&pid_1016#5&1bc41f6c&0&1#{25DBCE51-6C8F-4A72-8A6D-B54C2B4FC835}这是ifDetail->DevicePath的内容*/6 X% p. L" S( ] J
// Open file
) K; |! a3 H# W' J1 v7 u8 u//前面都很正常但就是下面始终得出一个无效的句柄,我也就无法开展下一步的工作.
1 \. J g4 b- P$ h {' r HANDLE pDevice = CreateFile(& y4 S6 u! D1 H; c+ l8 X
ifDetail->DevicePath,
$ @8 g6 c6 v* R& a GENERIC_READ | GENERIC_WRITE,
" D) y/ {6 Z( X" T8 ^' [ FILE_SHARE_READ | FILE_SHARE_WRITE,
8 z2 O0 V/ j5 z" ]; r NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
3 M7 m( s' q: G, ^) {
p6 y/ A$ m; u3 Q% ^ if( pDevice==INVALID_HANDLE_VALUE) pDevice = NULL;
# c/ l$ @- [8 ?. Q- G% ` SetupDiDestroyDeviceInfoList(info);8 ^ U# F# b3 P: _ f
. V6 O* l$ u. y return pDevice;
5 y0 \; W, b# h2 ?}+ M! ]& P9 P- g" Z- o. d" k
再次感谢关注这个问题的人们。 . V5 ?- X2 s4 v: r$ d
/ m6 r J% M2 k8 |. X
$ w4 h8 \% N; X
回复人: constantine(飘遥的安吉儿) ( ) 信誉:101 2003-12-16 21:23:57 得分:0 7 z3 [4 A$ x3 X" z
6 M& ^' U# Z# B0 |
* F" z/ x+ v) _. C2 Y
8 h9 L+ V* }6 R& r
study ' ^' k# |: s$ B K, o5 F- T
( Z ^' u' Z8 L. H; N5 o, n3 n F
Top ; H" W$ W1 g+ J' F8 Y1 M
1 d& M* t( F% o; w( A
回复人: wenyongjie(一个想成为大鸟的小菜鸟) ( ) 信誉:95 2003-12-16 22:28:46 得分:0 # ^, E: Y$ r9 Y
' J/ z: E/ Q0 H4 o0 |: A4 W
4 K; v) x- ?/ w% u' T
0 w2 G) d$ n+ E: N1 a只有学习的份
" Y& {! J) P! r {8 |
: b! c! A% C6 x/ X. o2 P0 dTop + s2 y) V. S1 |$ J
/ Q) ?5 ~( K( i7 S% ]
回复人: HUANG_JH(保卫钓鱼岛) ( ) 信誉:115 2003-12-17 9:50:41 得分:10
5 z( S+ `4 _: X ?, [. V U
4 S: K5 ]* r( [) t; Q 3 m9 L4 V# w: i% Z; i0 i+ S2 C( B
# R* I. _! _! W" s$ ]
不知道有没有用! /////////////////////////////////////////////////////////////// _: l+ C2 t) ]$ z' Q
// HW9911 evaluation board software Rev. 1.0
: I9 G* q3 P- l, W6 Q// program by Liu Ding, Bei Jing HEAD Elec.
% Y; ?' N( S* r% S/ K S// this is the main program for the HW9911 USB device evaluation board1 h, T2 n2 o( P5 O$ K6 A9 y
// it illustrate the basical read/write process of HW9911& V, o1 R0 ~, K$ B& B" |+ N! f
// by three examples:6 U; B5 Q, P5 ]( f
// 1. write datas to ram on the evaluation board
4 L2 j0 l; d" `! \- C% a// 2. read the datas from the ram on the board
. p: n7 d1 L$ v6 S// 3. send datas through RS-232 serial prot on the board
2 a& [/ ^6 X& v//
& i: u, L0 ^ w4 m0 Q7 }6 u9 V// the whole project are build with MSVC 6.08 R8 n6 h0 u1 a$ [
// and tested on windows 98 platform.
! o* S4 u. D4 f- h//$ i* O+ c4 D. q/ c
// notes: you can use hyper terminal to reaceive datas form RS232 port! `3 q; ?. l" M7 R
/// a8 _( ^: k" y; x+ Z
// this software are designed by Liu Ding. X% f- H8 K$ G
// if you meet any problems, pls contact by email:
6 l8 \; ^) Q) q// hugehard@263.net
) V K' j0 V- l" H# L// or contact HEAD Co. by Tel 86-10-87312497- S' ^/ Q2 p8 E' w& _/ z
// or by fax: 86-10-87312495
1 v; @, x0 C* }/ l" k6 M! o/////////////////////////////////////////////////////////////// #include "hwdll.h"
0 v1 Z) h. i% h$ g# x* l" _ R9 g#include "stdafx.h"
) J1 K* r1 } z( P/ \, }#include <stdio.h>
; m, X) Y5 `5 d0 S$ X* Z# G$ H#include <windows.h>; _9 n/ [9 C o4 i7 F
#include <memory.h>/ N6 s$ |& j0 M, M+ i9 }
#include <DEVIOCTL.H>( a" J0 t; C) m3 I
#include <stdlib.h>
+ \ ~: t, n. M( q#include <conio.h>) m. Q- `( f& a4 O D
#include "hw9911.h"9 r# R$ m) k# F% z- j7 @# ^
#include "test9911.h"
+ ~! g% L: a/ A+ N1 c6 Kint main()
' @4 ?. r' ]4 B$ V{
- A& {5 A4 o1 U3 R int hOpen=FALSE;
- W* J! H- ]5 p int hCommandLength=32;! h* g" X8 M5 a: r( u
int hDataLength=64;! _6 ]- r( o" A$ C
int i,VertAddr=0,HorAddr=0;
; j$ P1 R# `1 \0 c; `8 x int addr,TotalLen;/ u7 S& y! P* z' ?! L% i& I
USC StAddrH=0,StAddrL=0;. \6 p5 b9 N7 Z3 n
USC DataLenH,DataLenL;
: t( l( \' E+ z9 }3 [5 M4 J USC *hDataBuffer,*hCommandBuffer;; g {9 o0 a/ `- J4 i+ c- y( P/ e
USC ch1=0x61;
& R0 a9 ^( p# {( h0 A HANDLE hDeviceHandle;
+ U7 ^! ]( N5 V8 T$ S& c+ M . C/ P! { d- P3 ]7 P7 s
printf("************************************************\n");
^3 Y0 y+ D8 R printf("*******HW9911 USB DEVELOPMENT BOARD*************\n");
2 c0 e! h3 R0 `' X7 T# ?; U* O- a printf("************************************************\n\n");
$ N0 H+ J- W4 Y5 T printf("now press any key to open board\n");
6 m" ^ Q8 k) A% h0 e; {4 ] getch(); /********* call hDeviceOpen in hwdll.dll to open the board***/
* `/ r1 T! `3 C! l//hOpenDevice 说明:
$ y0 Y" t1 z( Z# ^% M s2 ]+ L/ s// BOOL hOpenDevice(HANDLE *DeviceHandle)
) q4 i8 W, J) @( ~3 _; r- u// 作用:打开设备$ t _) a4 @; y
// 参数说明:
/ M& ^ B1 }' K// DeviceHandle:设备句柄5 |& H$ Z, ^6 K- L1 v
// 返回值:* G6 h$ I7 r8 O7 t" r
// 设备打开成功返回 TRUE,失败则返回FALSE
* i8 D" h6 F" \ K% e if( (hOpen = hOpenDevice( &hDeviceHandle ))==FALSE)
1 Z* W5 ?8 |0 B4 ~3 }2 J {( H5 F0 B8 q2 |6 `7 ?
printf("can't open device\n");4 z8 H/ R) p/ f$ }2 t
printf("press any key to exit\n");2 J0 R. z# u1 H+ j
getch();
! r* V/ m5 ~* P! J return 0;
% {# t/ d* N Z2 | } |1 k" g c3 E, R
else + b; B w, r; [5 u
printf("\nCongratulations! device opened!\n\n"); /****** build and send command **********/
& q L# F) `" [( S' E5 I0 ] printf("how many bytes do you want to access?");' l* m8 R2 F6 m& v
scanf("%x",&TotalLen);4 ~. N% P/ P" [" i6 h- l
while(TotalLen > 0x7fff)
4 n& j8 ?* \3 U' O0 X5 N+ Y {0 L0 v$ w! E1 W4 u2 f- O, l: X
printf("pls input a hex data less than 08000\n");6 Y0 h: V) C( o+ ~
scanf("%x",&TotalLen);3 @. V& x2 t1 t2 s) w4 t8 c; A
}
1 F- V& o# r1 r& m5 n) l+ ] DataLenH=(USC)(TotalLen/0x100); //data length high bytes
2 |$ p I) v% ^% @0 C ] DataLenL=(USC)(TotalLen%0x100); //data length low bytes printf("************************************************\n");
7 H/ h% s7 s, {8 z+ E$ x printf("now program will write datas to ram on board\n");* N3 I# Z" l r: S; }
printf("total bytes of datas is %x\n",TotalLen);
0 v# K4 I% Z, v u7 [ printf("press any key to continue\n\n");0 j* X# p! ]7 \. n% O
getch();
) m/ a* ?$ T# Y% _ K# n7 i: o/*****************************************************************
% W: ]: I1 }! o, d3 }3 @ now will build a write command packet
6 q- K" [" v& b5 i with the first byte is 'w'.
1 ^' \- E0 E6 ~' e+ z and the following bytes are:
, g9 V! D: q1 D0 c' F# k# `( m start ram address byte high, start ram address byte low," y2 l8 u( D9 C& P' e0 ]3 ~. H
datalength byte high, data length byte low.
7 L9 I+ o3 |; ~6 b, c this packet will send to device through WritePipe1,
! L' a! ?) J- d1 b; u' k6 z which is endpoint 2 of HW9911.) C& C( u' O% \
when the device receive this command packet,
3 }. f0 k: h1 Q: X! Q4 I it will write TotalLen bytes data to Ram on the board
. G3 n) `0 ^/ J& Q******************************************************************/ & @, S* q- I1 x3 e5 R8 a
hCommandBuffer=(USC *)malloc(hCommandLength);
- s0 n4 U9 c% m8 W hDataBuffer=(USC *)malloc(hDataLength);
) _% h$ m3 |$ L- J, F9 ~ hCommandBuffer[0] = 'w'; //read command3 L5 }( m3 n8 X. ?
hCommandBuffer[1] = StAddrH;
6 D. n8 @: r7 u, y" t hCommandBuffer[2] = StAddrL;
3 R9 o9 G6 L9 U hCommandBuffer[3] = DataLenH;
, d7 O( v: p4 Q- R) L V- s) K* M+ ~/ n hCommandBuffer[4] = DataLenL; /* call hUSBIO() in hwdll.dll to send command packet to device*/
. }$ G' `- E3 E& n3 F- n/ g4 ?+ s// hUSBIO 说明:7 G x. ~ ?1 S r4 j' [, F
// BOOL hOpenDevice(HANDLE *DeviceHandle,2 {& W. Q& ^! n/ E
// unsigned char *IOBuffer, O' ^% r" E" w2 E$ }% Z
// int BufferLength,
+ A% H% Y% @+ S8 @. w% k4 T& q// int PipeNumber,( _7 B( v' t r# }; H5 {" _
// int Action)
: m- X( \; w6 a' h+ {# y// 作用:设备读写- S) W# X; O* g; t% m7 G
// 参数说明:
6 z: O$ S6 j& w H( h& T d6 f// DeviceHandle:设备句柄
6 W- V8 @5 @$ N* b// IOBuffer: 指向要传送的数据指针
- Z% i) [& v( Q& i# _( v1 y// BufferLength: 数据包长度& ^5 r$ A) m7 S& a6 i
// 对于发送缓存1、2和接收缓存1、2,BufferLength必须小于或等于32! A7 u4 x7 F. U6 Y
// 对于发送缓存3和接收缓存3,BufferLength必须小于或等于64. K9 ]& J$ i. o# f" _" F7 v
// PipeNumber: 通道号" i g5 W! F5 D7 {: O, l
// 发送缓存1:PipeNumber=0;, k* Y" }* M+ [9 q! S( ]% e
// 接收缓存1:PipeNumber=1;; s; E' y- r" q6 r1 x7 v
// 发送缓存3:PipeNumber=2;
$ f5 I! F7 V6 _2 Z/ x// 接收缓存3:PipeNumber=3;
* `% B2 k$ W( B" R$ n9 n// Action: 读写标志。TRUE代表从设备读数据到主机, ~; m6 O! P: {
// FALSE代表从主机发送数据到设备 7 D+ b* @. C$ \. `3 J3 T2 @0 x
// 操作接收缓存,Action必须为FALSE
$ K0 b8 |1 d( [' ~// 操作发送缓存,Action必须为TRUE
6 l4 x, q4 H8 Z* B |3 @( f3 `2 ]" N// 返回值:: g4 {: h: F3 L( M
// 操作成功返回TRUE,失败返回FALSE if ( hUSBIO( &hDeviceHandle,
5 J! c: b% Z$ s+ O! h/ n4 |- D2 u hCommandBuffer,# a( j4 q# G! f/ w' F
hCommandLength,
+ ?4 Y! U8 K8 j3 r" O hWritePipe1,
5 ~( n, f3 ] k8 K) ]( G FALSE) == TRUE)3 S4 z. f. z! | x
{7 ?- x8 w. e" Y8 L; b
printf("command 'w' writed to board\n"); @5 o B( J! Z% d+ h; j
printf("now press any key to write datas to ram\n");) \, E6 q2 y9 w( e
getch();
|# a0 C6 ~$ b$ B* Z }
+ a+ L( c) T0 B7 `" c& v else. \2 V @( x# {' C
printf("data can't write to device\n"); /******** write ram data to board **********/ printf(" "); m$ p9 J4 n* s
for(VertAddr=0;VertAddr<=0xf;VertAddr++)
k% k+ x( y! F printf("%02x ",VertAddr);7 i* |) p$ f$ ?% o! y
printf("\n");
) ]2 v) j: @. u7 [& B addr=0;3 p) D: P# Z: L, h, H
while (addr<TotalLen)4 C9 n2 }3 j3 K- R( P9 d- V
{
. X8 c, z, T2 Y% Z1 @$ h; z4 H if (addr+hDataLength > TotalLen)
( h* s j- ~$ e% u hDataLength = TotalLen-addr;( d6 P* _; e! u% s4 i; M
for(i=0;i<hDataLength;i++)1 T5 W3 [6 W% D3 n, K- G
{
" L6 m" \# e* B0 G; r% O hDataBuffer=ch1++;/ O2 {3 P v* k3 D7 x8 a9 k
if (ch1 > 0x80) ( F+ E: ?3 b- P# N4 c1 e3 a* r
ch1 = 0x61;
. u {6 I# e0 F$ i7 G0 H! E! P; _; j }
# z! @; M, h# ?7 J7 S/* call hUSBIO to write datas to write pipe3, which* u7 V3 \8 l# w6 Z, \0 ~
is endoint 6 of HW9911*/ if ( hUSBIO( &hDeviceHandle,
+ H% B+ l+ v5 } hDataBuffer,4 z: i9 g+ `, e1 T/ F7 V
hDataLength,
?. j2 h0 Z+ R/ Q) r, U- n+ G: O hWritePipe3,
0 C) H' Y* ~; [9 v FALSE) == TRUE) //FALSE means Write operate
5 z* P. _* s5 `7 w8 O {
; N6 G* q0 x0 G* X8 t1 _% q/ ^ for(i=0;i<hDataLength;i++)
h5 \ @; k* k1 [0 [. X- q {
- V0 s! X8 ?+ A- C$ c( ]/* print format control */ 8 ]3 n9 U" U7 J5 q. L$ z! H
if(i % 16 == 0) 6 r3 C5 p1 ` @& U5 P
{
* X+ a* l7 Y @* l r' u# J7 k3 A! _: d printf("\n%04x ",HorAddr);# W; }2 t* p" O7 x! x
HorAddr=HorAddr+16;8 Q) @& E9 O# K G
}& C# K% Q6 o6 s! h& I, ?2 _
printf("%02x ",(USC)hDataBuffer);
5 E/ v' B! r _* C7 [' t" c }
# `, U+ }- o" b0 @ addr=addr+hDataLength;( r) O* s1 e" s: G- f1 ?
}, x" f% u, x+ n' Z4 m& v4 a
else4 |7 G( o2 I' m/ c3 W) ?# H* k
{
3 Q* }1 G3 Z! @: A+ W2 x, a2 h' q! V printf("can't write to board\n");5 L- _7 g- B' V' V# b- x0 v* ?* j0 F
exit(0);6 c- _* U3 J+ Y7 B2 P# @$ @: z* x
}' d: {2 s- k, U+ C% ~ `8 O
}5 S( P; z' j) U8 [+ ?& c. C
printf("\n\nTotal%x bytes write to ram OK\n\n",TotalLen);
) F' H7 X s( B$ ~6 Z
7 e- w4 M+ \! C* j' }, l! ITop
' g' m; e) x3 J9 B) S# }& K% P 9 k- \) o! t$ e7 N6 O; k2 T% y, a$ ]
回复人: HUANG_JH(保卫钓鱼岛) ( ) 信誉:115 2003-12-17 9:50:51 得分:0 & W, U9 h/ \0 ]7 ~ }* {: ?
# t0 m+ h% f% e
3 z4 R. M r$ s2 v /*****************************************************************
3 W; b; U1 a& S0 \9 t$ Y. a* ^; g now will build a read command packet
' B- O. ~) F1 _4 h' @7 g9 z' \% s with the first byte is 'R'.! \& L0 J# W/ f
and the following bytes are:
" K) j& T3 J6 v& K+ Y6 H1 n# A start ram address byte high, start ram address byte low,
. D2 H+ a/ n' z: s datalength byte high, data length byte low.5 k& v' D" i9 S- n
this packet will send to device through WritePipe1,3 }9 |/ y: }( O
which is endpoint 2 of HW9911.3 f Y' M/ Z2 \! E) I! U
when the device receive this command packet,/ o* N. s/ r" Q
it will read TotalLen bytes data from Ram on the board
; U- W& n: I. [) w) S******************************************************************/ printf("************************************************\n");
V+ A, L3 w) G& @ _ printf("now program will read datas from ram on board\n");
/ j( B1 n( b. y% P6 c printf("total bytes of datas is %x\n",TotalLen);3 \$ r8 I; C& U7 u
printf("press any key to continue\n\n");
' i) X; c; c) j5 v7 s6 A6 Y getch();6 \5 Z I! l: ~ v0 I
hDataLength=64;. z, J6 ~, d3 ^! v0 C
hCommandBuffer[0] = 'r'; //read command3 m6 x6 G5 G8 T+ _5 s* w( f1 v5 J \
hCommandBuffer[1] = StAddrH; , @$ t9 Y( l2 R8 E6 K) v
hCommandBuffer[2] = StAddrL;
9 L. p' P+ @6 \# C: u: m7 q# g. @: q4 ` hCommandBuffer[3] = DataLenH;: K( [- X' b9 k9 x( z0 A$ X0 Y
hCommandBuffer[4] = DataLenL;
O+ E' z/ Z; B/* call hUSBIO to send packet */, e( z# W c0 D5 p |8 {3 Z
if ( hUSBIO( &hDeviceHandle,
2 p: }+ |$ J9 o& @& X hCommandBuffer,
! r/ W- e' s3 M' T. H2 q hCommandLength,
& L( z3 ?, ~8 }; D/ y) b% V; m hWritePipe1,
: G+ B; X, C- i+ ]0 \$ r" K- \ FALSE) == TRUE)2 U+ C" G% u6 a# n c
{0 t" g N A* L( s: W9 I" ?' y
printf("command 'r' writed to board\n");) G0 M' ~$ h# U4 S( l7 ~# X/ H ]- y
printf("now press any key to read datas from ram\n\n");
3 r. T8 E: Z+ w getch();& E" T& D, N( c! v Z5 _, ~
}! {8 @/ O$ u4 G% O' @; D
else
, B" J& O0 w8 D: H( n/ `/ V9 h4 y printf("data can't write to device\n"); /******** read ram data form board **********/2 `! Q4 n: B7 \# z. l" [
printf(" ");
" K0 N R' @1 T& B4 Q for(VertAddr=0;VertAddr<=0xf;VertAddr++)' h0 O' H0 r; ~& U. n( C
printf("%02x ",VertAddr);# E/ A, j6 d6 Q3 h- S$ D1 a( `
printf("\n");9 X! |9 B" l- K4 {& t* e. O9 z
addr=0;
0 u: v/ l: @% ~4 l ]3 ?" t HorAddr=0;
% l1 ~* ~4 W$ q9 Z) S) ~ while (addr<TotalLen)
; f1 w9 v+ f0 G1 a0 o- @9 k q {" P0 v1 g+ ~ w9 H7 x
if (addr+hDataLength > TotalLen); A( l1 B# O9 Z" E0 @+ l' I
hDataLength = TotalLen-addr;
2 {2 Q) j5 o: P7 A/* call hUSBIO to read datas from board */
9 }: W9 ~8 u! f2 b8 |1 F. _ if ( hUSBIO( &hDeviceHandle,, H; X$ q6 u3 ]5 p; l; M
hDataBuffer,
8 {% }9 M7 d. c( B" U$ T$ }0 H1 z0 n/ k6 i hDataLength,/ c! A" [, @! f3 L9 @
hReadPipe3,
/ b; O4 b7 _( H8 G TRUE) == TRUE) //TRUE means Read Operate& t$ C0 S' E; E$ N I- T2 h% H; p
{
3 u' d+ H# C: h for(i=0;i<hDataLength;i++)
1 R4 @4 W2 v/ T' |' U {: Y3 d8 Q) v! W$ ~4 u z* |
/* print format control */! j& V' W( M" @* d- S, \
if(i % 16 == 0) + _! m( J2 e. ^( D
{/ Q) d: e1 w; v
printf("\n%04x ",HorAddr);
8 [+ G4 w/ [9 v8 @9 s HorAddr=HorAddr+16;$ @+ x7 O! z) @% b( m* T& f& c
}' f0 _# N) o& g8 r$ ]8 d- y
printf("%02x ",(USC)hDataBuffer);& \ i T0 N; F
}
8 w# n+ G4 D0 t- S addr=addr+hDataLength;
! ~2 C( y) P" d6 J5 Q& D1 W }1 i% f: D# r" c. I' }
else: b: X1 i9 L! `# ~) Y
{: h& j0 x- e$ X0 P* g
printf("can't read from board\n");
( d1 P K( r$ d3 U; M& J. W exit(0);
1 {8 t/ \6 ?! d2 P }
% Y7 N, P& T) x9 m7 S1 l6 n }
$ h m4 }7 j# v) v9 `/ Z printf("\n\n");
1 c% i. F% b# s printf("%x bytes read from ram OK\n\n",TotalLen); /*****************************************************/
/ p' W' A0 B2 T7 v/* process rs232 test */
: i# k2 ^: N5 e4 W/ K/* the first byte in this packet is command 's' */
) |4 g& ~# b0 ?/ i8 @* m3 X/* and the following 2 bytes are used to set */+ z) w& ]; V! {8 M( S
/* the baud rate of 8051 */
3 ~# H, u% T2 n5 c7 w/* they will be write to TH1 and TL1 respectively*/( R' C3 I% L- e1 t# }% X3 {
/* the following bytes are datas will be */" G6 s/ X: d% ]5 H# F
/* send through RS232 serial poart */
+ ?8 I# g8 B2 `/*****************************************************/
4 N) o, X7 a. u0 e+ c" b printf("\npress any key to process RS232 Test\n");
' i2 b7 X6 k. R* ~% \ getch();
* {$ b I4 A3 y: z1 n
3 h7 r8 r. l# ~; k w) `" J USC TH1,TL1;9 T* q k0 Z0 m+ {, w
char hStr[30];
7 r6 C: l$ {4 p" S$ u: _ TH1=(USC)(BD9600/0x100);: ]: {) S' h% @# ?
TL1=(USC)(BD9600%0x100);5 D" n- x8 g% }- r" _0 f& v
hCommandBuffer[0] = 's'; //read command
, Z4 {( V6 _2 y hCommandBuffer[1] = TH1; & n, x* L1 \) K2 [9 W% `1 ~) B
hCommandBuffer[2] = TL1; //start address is 0x0000 strcpy(hStr, "Hi, dear HW9911 consumers! ");. e2 g+ ^' d, M3 W8 r3 Q1 x4 t
printf("Hi, dear HW9911 consumers! ");+ R; p' W. R2 U v/ u! i, x
memcpy(&(hCommandBuffer[3]),hStr,27); if ( hUSBIO( &hDeviceHandle,% O+ @3 n* ]! P R$ F' R0 z: f
hCommandBuffer,
& |5 `2 w% `7 j 30,
: P, k6 D/ H1 c1 n3 ?- } hWritePipe1,
4 d( `* N# k Z$ F, r FALSE) == FALSE)
3 W* u- u+ |+ g5 O/ D {
9 x, D7 D' p5 b% H1 u P$ t h printf("can't write datas to RS232\n");
! @% k( T( n# K. v J exit(0);2 t9 }5 g: h1 C, E+ T% ]
} strcpy(hStr, "I'm HW9911 Evaluation Board, ");& w" ~* U8 f0 Q" `
printf("I'm HW9911 Evaluation Board, ");; H. ?! f; O( @( s9 ]
memcpy(&(hCommandBuffer[3]),hStr,29);
7 u% N6 ^+ e0 L" E' k
- l8 I- q, a6 x: U4 `" }. S if ( hUSBIO( &hDeviceHandle,
3 c6 Q& q& E4 x) E* T4 A6 O. [) f hCommandBuffer,. B$ N1 s; v$ [( _* p& C* V
32,
; @) f5 p" G+ W$ q hWritePipe1,$ B% [6 U. ]( u8 [
FALSE) == FALSE)
8 J t+ N8 n; d8 D* i4 n {8 Y+ d# s: _4 L9 c9 j7 g( U
printf("can't write datas to RS232\n");
. x G8 B% z: y7 A exit(0);
& \1 z- O0 f5 A) {7 l- L0 Z- ~& y } strcpy(hStr, "thanks for purchasing me, ");
( B3 g* W( j! F4 N printf("thanks for purchasing me, ");
* w+ ]+ v; A: n memcpy(&(hCommandBuffer[3]),hStr,26);8 W0 } |; H. ~% ~( K o2 ~
) j- _+ e" S/ l+ Q7 n' K if ( hUSBIO( &hDeviceHandle,, Q7 Z) d4 r9 A/ w+ r: B' {
hCommandBuffer,6 _( o- j) N4 \% _
29,1 N- f V# @0 A- N* z, D# `
hWritePipe1,
- z0 E# z. c, q FALSE) == FALSE)
' d4 n8 n9 }/ d" Y- H {( P" j7 B8 s5 l: j/ l4 H! P) n
printf("can't write datas to RS232\n");
9 v4 P# O: j6 j" n exit(0);
$ O8 p9 ] }7 |; R" H, m2 C }$ M# W5 j, n" [+ e/ Q; m
& P4 C6 b/ F7 q- ]8 C0 F. x
strcpy(hStr, "If you meet some problems, ");
- }7 @: }( G( g: J4 I printf(hStr, "If you meet some problems, ");, ]; J8 h1 R0 j4 i6 Z0 I5 t1 d
memcpy(&(hCommandBuffer[3]),hStr,27);
: R P; V+ C& r+ G3 Y6 X
9 b) t7 A+ [7 X3 V0 n; E& Q7 J4 z5 U if ( hUSBIO( &hDeviceHandle,
( z+ f0 J" a# f/ E" s4 _" [ hCommandBuffer,- R( Q) ?; a; U( C2 H
30,( d, d! @9 K& d5 s$ Q
hWritePipe1,
3 l2 i) I6 g; C' ~- U. A1 n FALSE) == FALSE)
% E) `$ e" C: I9 w {+ c& ~+ J3 \6 I9 u
printf("can't write datas to RS232\n");1 S0 w! m( ]6 l* G" A
exit(0);# U' `& x% e" Z/ V
} strcpy(hStr, "pls contact my designer ");9 T3 ^- q2 f: `, H& W& Y/ x8 N
printf("pls contact my designer ");
4 X3 b7 V4 V( x" R% ] memcpy(&(hCommandBuffer[3]),hStr,24);
" V$ [3 Q9 o9 X) t- ?
4 r4 b; Q8 {- k5 V9 s if ( hUSBIO( &hDeviceHandle,
( K* Y9 M. R' B- c. R hCommandBuffer,8 a) I9 v2 _6 P# Y# H) R; H0 E
27,5 D# E% E1 T4 I Y* j) Q I/ `/ p
hWritePipe1,( q4 U( J1 A# k8 K# G/ G
FALSE) == FALSE)' R+ u7 ~/ P, {& b9 t
{
1 j6 E f& R6 U: u+ i% @7 n printf("can't write datas to RS232\n");
0 q1 B, i- C4 o1 b/ M8 U" b9 D. Z exit(0);
8 c7 G; G, o, m1 k, j; j } strcpy(hStr, "by email: hugehard@263.net.");
B8 s3 b; P' @% M$ E printf("by email: hugehard@263.net.\n");
; P0 w2 ]3 i! v! r- q, t memcpy(&(hCommandBuffer[3]),hStr,27);
- S4 {2 L8 H' l% b, W- ^ " ], t* t. W! r! h) E9 z4 p" W* ]' k
if ( hUSBIO( &hDeviceHandle,
# c* }6 H3 n, d4 _. D hCommandBuffer,# s* [) ]5 B3 Q# S* v" u, t
30,9 e& P' W' t/ B \) c4 x5 t. ]
hWritePipe1,
4 O! k+ ~* X8 o# D; f FALSE) == FALSE) p3 X3 ]" i7 I/ P& s, l. e. h
{! \% L: u. s5 g: h
printf("can't write datas to RS232\n");* A! E% v- j! o% m$ Q" o
exit(0); s9 ?3 B' _8 u l1 T
}
# L V( m0 Y. I! p; O* \/********* call hDeviceOpen in hwdll.dll to open the board***/; N, C0 ?, T3 @. A" u/ n! _; y
// hCloseDevice 说明:. G, ^7 |: p' d2 i: f: S' Q
// BOOL hCloseDevice(HANDLE *DeviceHandle)
4 k" a. }" z0 P9 k3 ~5 L// 作用:关闭设备+ `. o: F0 Y6 y: J2 ]2 P! n
// 参数说明:
8 f5 } y% R- F( P- ~+ e$ @; x// DeviceHandle:设备句柄
" H& D2 }/ E4 @4 x1 g) c' S// 返回值:) Y% i8 O8 V2 t# u
// 设备关闭成功返回 TRUE,失败则返回FALSE0 c) p5 N, [7 y9 D5 B: i, S' C
if( (hOpen = hCloseDevice( &hDeviceHandle ))==FALSE)/ w$ S8 L9 U* a" Q3 d
{8 u7 s2 k7 c4 o7 M1 U
printf("can't open device\n");. O% E5 g, P% a$ h* ^/ h
printf("press any key to exit\n");( v5 D$ r2 R; H- j4 E% l
getch();
% q- s# ^* l0 U ` return 0;$ {: y$ G: |9 G/ \- k Z
}
% Z, N) k1 t0 G else # O+ w) w- e5 b; }( O) _6 V! K
printf("device closed\n"); printf("press any key to exit the program\n");
, S) S# I+ c2 G* h$ ~4 w g$ ] free(hDataBuffer);
* |/ L p8 ]. J3 i) o) | free(hCommandBuffer);# |) \6 c: T5 w. L l u- ?4 F
getch();4 S$ O- S" y4 M7 P C! T% ^
return 0;- u0 H% L7 u. _ B
}
' ?% b8 l6 B7 T. q3 A, a6 Q7 L
, M7 w8 [8 t# [9 i
- ]& O7 L# K Z/ u; a. ?Top
2 Q: M- L. Q+ A8 x6 { / W- z! u; J* n
回复人: aiyu33() ( ) 信誉:100 2003-12-17 11:41:24 得分:0
. v8 z& o' X; u, f8 }- j5 p
) T7 l5 t, D/ y3 P( ?2 I6 \5 { " D. _' e8 x+ M+ }5 S0 U- }
6 H. ?7 l' U" U# Eupupupupupupup
7 e* `3 G5 X6 ~6 x / J# v) D; V9 e6 V% {
Top
! P3 h* c3 e; u1 m0 | 6 c' |2 Z& ?" w# d
回复人: kingcaiyao(AKing) ( ) 信誉:110 2003-12-17 12:53:39 得分:0 8 s4 C/ d0 v) o
; N9 ]# r" r& L' _
9 K# ^ d$ s5 w. r
1 ?6 D! d. w) V你开发的这种软件类似于Palm Desktop Software,负责Pocket与PC之间通讯,我建议你最好先写一个驱动,将USB口虚拟成一个串口,然后直接对串口操作会很方便的。我现在做的程序可能和你相似是一个CDMA模块,通过USB口与PC机连接,然后由驱动程序将它虚拟成一个串口,我的工作就是和这个虚拟的串口通讯。 : d! g8 e$ r! N" Z+ D( ^2 a9 _9 X
1 h' ^, E, F3 ]6 nTop
8 G! B# O' t U9 k6 |) b4 |6 h 9 W$ i' E) h9 v" x
回复人: kingcaiyao(AKing) ( ) 信誉:110 2003-12-17 12:56:27 得分:0
4 G% u+ Q$ K# S% {; G( M7 h+ K " I# T* L$ I) ~5 I# t
" r- k( Q, J- H' O$ `
! ?' K% T' U5 W9 e# N$ k5 v8 f7 bPocket与PC连接肯定有驱动的,如果驱动程序没有将Pocket虚拟成一个串口,你也可以直接通过设备GUID和设备序列号进行访问,详情你参见我专栏上的一篇文章。当然了,通过虚拟串口来访问设备肯定要方便,简单些。 " o3 Y: l0 k6 G$ s
! s# I) g' D1 c& @3 B# U
Top
5 S M5 |# W- {6 U* [" ] 9 I" ^0 l* ?* N/ b
回复人: aiyu33() ( ) 信誉:100 2003-12-17 13:31:08 得分:0 ' i/ h5 V& b* t6 c7 B
! }( K; }$ S6 Y9 ]2 v- j0 v
0 h' _) T+ c7 L7 Z" [/ T' _ S: k4 k
- Y4 D. s: t- Q+ O5 F+ o6 p我得这款pocketpc默认只支持使用usb与pc相连的,而且activesync3.7就是使用usb传输数据的。如果我自己写驱动的话,不仅不熟悉而且很可能activesync3.7这个软件就使用不了。我只需要利用它的驱动。你的专栏上的那篇文章我也看了,我就是模仿你的写的代码,但就是到createfile这步就不行了,我的同事是用palm开发类似的程序,也是到这步就行不通了,是不是有其他的原因?
) D1 q6 x1 w/ w我还想问问如果驱动程序将pocket虚拟成串口,如何查看它的符号名呢?
0 T& s& M. N" l! T9 X. \ z 6 }0 A& f* T1 ~& X; i
# Y) E/ ?/ [$ j1 g- s0 @& Z% F1 yTop
: T; u) d8 ^9 F2 [3 R3 S ) T. m2 q/ F3 U4 ^% u8 q$ d% y
回复人: kingcaiyao(AKing) ( ) 信誉:110 2003-12-17 16:53:17 得分:0
0 b4 p9 J2 t$ I( P4 ^! l 4 \1 Q( T0 S+ X9 |
/ \ ?# Z2 \3 S, y. V" w * J( M% ~" T1 I( P; j+ f+ P H3 E
假如将一个USB设备虚拟成串口的话,那么它的符号名可能是COM3,COM4,或COMn,这根据你当前PC机的配置而定 。它的符号名位于注册表中HKEY_LOCAL_MACHINE\CurrentControlSet中,你可以搜索注册表,另外在2000或以上的操作系统中,你可以到HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SerialComm中看到。 1 C2 t& }" I5 p0 V' Z7 @
; U8 V: K3 j" o; \
Top ( A0 y" V+ N- f: m/ L
% n! F5 B* \3 k+ M
回复人: kingcaiyao(AKing) ( ) 信誉:110 2003-12-17 16:55:33 得分:0 8 R4 a( d6 w/ v3 J
/ [3 V$ ?: t$ m- Z. E
" j* C$ c3 g: U- k
$ x) j( L$ {+ P7 {% |; ~! l; J2 K
我以前在一张贴子中详细回答了如何利用设备序列号和设备GUID来访问该设备,你可以搜索一下CSDN。你所说的CreateFile不能打通设备,你要查一下,你的符号名是否正确,包括设备序列号和设备GUID是否正确,设备GUID你可以从驱动程序的安装向导文件.inf中找到,设备序列号则需要你到注册表中去找。 ; V7 L3 |' r7 ~9 i
( R+ K( s& M3 K+ l$ H" J7 |Top : g* O7 G$ p0 G* n
. r% g5 L/ f* E5 ]; u4 G3 ?7 l
回复人: gyj_china(透明) ( ) 信誉:98 2003-12-17 18:15:30 得分:90
$ J! a- x6 M- `2 Z3 w/ D. V$ \; I 7 m9 g( r8 C: A; k
8 {7 r4 Z' g- C; A7 v
) m) E( R# v& J- V3 S% ~
没有星星不敢发言:( : k$ H# N1 B$ b, X; v. x: W
' F+ ]1 |( l. ?% q" k% X
Top
# g/ L) Y) k3 W2 p1 o/ S * B- K# m& }6 p; W7 R1 A0 r; A' J
回复人: aiyu33() ( ) 信誉:100 2003-12-19 18:27:28 得分:0
, O |7 M5 ? A5 b
8 `9 I, H j2 g- j2 D 2 j. l" a& F' M \0 m4 B# K
) _. {/ B5 a( a! f: ?
不好意思,是因为ActiveSync3.7一直在系统服务程序中运行,占用了驱动程序,所以不能打开设备。我删除了ActiveSync3.7后就可以了。 |