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