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