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