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