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