?? test.c
字號:
// 2003.09.08, 2003.12.28
//****************************************
//** Copyright (C) W.ch 1999-2005 **
//** Web: http://www.winchiphead.com **
//****************************************
//** DLL for USB interface chip CH375 **
//** C, VC5.0 **
//****************************************
//
// USB總線接口芯片CH375的數據塊測試程序 V1.0
// 南京沁恒電子有限公司 作者: W.ch 2003.12
// CH375-BLK V1.0
// 運行環境: Windows 98/ME, Windows 2000/XP
// support USB chip: CH372/CH375
//
// 本程序測試數據傳輸的正確性,可以用于長時間連續測試,對應的單片機端的測試程序為TEST.C
// 方法: 下傳隨機長度的隨機數據包,被單片機接收并將數據按位取反后返回,最終由計算機程序接收后比較數據是否正確
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <winioctl.h>
#include "CH375DLL.H" // CH375的動態鏈接庫
// 我們在計算機和單片機的應用程序之間約定下傳數據的首字節是命令碼
#define TEST_DATA 0x21 // 測試數據正確性
//程序入口
void main ( )
{
int key;
unsigned char mBuffer[100];
unsigned char mReadBuf[100];
unsigned long i, mLength, mTestCount, mErrCnt, mStep, mTotal;
printf( "\nCH372/CH375 Bulk Data Test Program V1.1 , Copyright (C) W.ch 2004.12\n" );
printf( "test data correctness \n" );
// 需要使用DLL則需要先加載,沒有此句則會自動加載
printf( "*** Load DLL: CH375DLL.DLL \n" );
if ( LoadLibrary( "CH375DLL.DLL" ) == NULL ) return; // 加載DLL失敗,可能未安裝到系統中
printf( "*** CH375OpenDevice: 0# \n" );
if ( CH375OpenDevice( 0 ) == INVALID_HANDLE_VALUE ) return; /* 使用之前必須打開設備 */
CH375SetTimeout( 0, 5000, 5000 ); // 設置USB數據讀寫的超時,超過5000mS未完成讀寫將強制返回,避免一直等待下去
mErrCnt=0;
printf( "*** Step-1: test data correctness: 10000000 times, random length and data\n" );
for ( mTestCount=0; mTestCount<10000000; ++mTestCount ) // 循環測試
{
mStep=mTestCount&0x03;
switch( mStep )
{
case 0: memset( mBuffer, 0x00, 64 ); // 發送全00H/返回全FFH
break;
case 1: memset( mBuffer, 0xff, 64 ); // 發送全FFH/返回全00H
break;
default: for ( i=0; i<64; i++ ) mBuffer[i]=(unsigned char)( rand() ); // 發送隨機數/返回位反碼
break;
}
mBuffer[0]=TEST_DATA;
mTotal=rand(); // 隨機數長度
mTotal=mTotal%100;
if ( mTotal == 0 || mTotal > 64 ) mTotal=64;
printf( "Cnt=%4ld, Len=%2ld, Data: %02XH,%02XH,%02XH,%02XH,%02XH,%02XH...\xd", mTestCount, mTotal, mBuffer[0], mBuffer[1], mBuffer[2], mBuffer[3], mBuffer[4], mBuffer[5] );
if ( kbhit() )
{
key = getch( );
if ( key == 0x1b || key == 0x20 ) { // ESC鍵或者空格鍵終止循環
printf( "*** CH375CloseDevice by break: 0 \n" );
CH375CloseDevice( 0 );
exit(2);
break;
}
}
if ( CH375WriteData( 0, mBuffer, &mTotal ) ) // 發送成功
{
mLength = 64;
if ( mTestCount == 0 ) Sleep( 200 ); // 考慮到之前單片機準備上傳的數據可能未被計算機取走,導致首次回傳有可能直接讀到之前的數據而不是本次數據的取反,所以首次回傳先等待單片機準備好取反數據
if ( CH375ReadData( 0, mReadBuf, &mLength ) ) // 接收成功
{
if ( mLength != mTotal || mLength==0 ) { // 長度錯誤
mErrCnt++;
printf( "S1-T%0ld-C%ld return length error: %ld (%ld)\n", mStep, mTestCount, mLength, mTotal );
}
else {
for ( i=0; i<mLength; ++i ) {
if ( (mReadBuf[i]^0xff)!=mBuffer[i] ) { // 取反值比較錯誤
mErrCnt++;
printf( "S1-T%0ld-C%ld return data error at %ld: %02XH (%02XH)\n", mStep, mTestCount, i, mReadBuf[i], mBuffer[i] );
}
}
}
}
else { // 讀操作失敗
mErrCnt++;
printf( "S1-T%0ld-C%ld CH375ReadData return error, length=%ld\n", mStep, mTestCount, mTotal );
}
}
else { // 寫操作失敗
mErrCnt++;
printf( "S1-T%0ld-C%ld CH375WriteData return error, length=%ld\n", mStep, mTestCount, mTotal );
}
}
if ( mErrCnt==0 ) printf( "*** passed \n" );
// 關閉CH375設備,如果不繼續使用則必須關閉設備,就象讀寫完硬盤中的數據文件后要關閉一樣
printf( "*** Total error = %ld \n", mErrCnt );
printf( "*** CH375CloseDevice: 0 \n" );
CH375CloseDevice( 0 );
printf( "\nExit.\n" );
getch();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -