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