[求助]这个问题百思不得其解

高手们帮我看看这个中断程序 不知道为什么BUFFER里的值老是赋不到DATA里(中断已验证能进去) /* CH375中断服务程序,使用寄存器组1 */ void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; unsigned char data buffer[ 64 ]; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */ switch ( InterruptStatus ) { /* 分析中断状态处理 */ case USB_INT_EP2_OUT: { /* 批量端点下传成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ length = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收数据包 */

DATAl[0]=buffer[0]; DATAl[1]=buffer[1]; DATA=(DATAl[0]<<8)+DATAl[1];

/* 测试数据正确性,将接收到的命令包数据取反后返回给PC机 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( length ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ for ( i = 0; i < length; i ++ ) CH375_WR_DAT_PORT( buffer[ i ]^0xff ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ EA=0; dac(); EA=1;

break; } case USB_INT_EP2_IN: { /* 批量数据发送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } } }

参数的申明如下 unsigned int DATAl[2]; unsigned int DATA;


你程序是不是调试的时候有问题啊,你试我的程序试下,没问题的: void mCh375Interrupt( ) interrupt 0 using 1 { unsigned char InterruptStatus; unsigned char i, length; unsigned char data buffer[ 64 ]; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */ InterruptStatus = CH375_RD_DAT_PORT( ); /* 获取中断状态 */ switch ( InterruptStatus ) { /* 分析中断状态处理 */ case USB_INT_EP2_OUT: { /* 批量端点下传成功 */ CH375_WR_CMD_PORT( CMD_RD_USB_DATA ); /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ length = CH375_RD_DAT_PORT( ); /* 首先读取后续数据长度 */ for ( i = 0; i < length; i ++ ) buffer[ i ] = CH375_RD_DAT_PORT( ); /* 接收数据包 */ data1[0]=buffer[0]; data1[1]=buffer[1]; data2=(data1[1]<<8)|data1[0]; /* 测试数据正确性,将接收到的命令包数据取反后返回给PC机 */ CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); /* 向USB端点2的发送缓冲区写入数据块 */ CH375_WR_DAT_PORT( 2 ); /* 首先写入后续数据长度,回传刚接收到的数据长度 */ CH375_WR_DAT_PORT( data2>>8 ); /* 数据取反后返回,由计算机应用程序测试数据是否正确 */ CH375_WR_DAT_PORT( data2&0xff); break; } case USB_INT_EP2_IN: { /* 批量数据发送成功 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } default: { /* 其它中断,未用到,解锁后退出即可 */ CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ break; } } } 参数申明: unsigned char data1[2]; unsigned short data2; 用CH372DEBUG调试


能用了,谢谢哦,我先仔细看看你的程序


遇到很奇怪的问题, 当我把data2=(data1[1]<<8)|data1[0];改为data2=(data1[0]<<8)|data1[1];那么无论我从PC发的数是什么, data2的后8位为0,高手继续帮着解决吧,谢谢!


想问TEST_DATA发出的数在单片机收到后在buffer里怎样放的?buffer[0]里是高八位还是低八位 上位机的程序是这样的: // 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 #include #include #include #include

#include "CH375DLL.H" // CH375的动态链接库

// 我们在计算机和单片机的应用程序之间约定下传数据的首字节是命令码 unsigned int TEST_DATA=0x6660; //所要发的数据

#pragma comment(lib,"CH375DLL")

//程序入口 void main ( ) { unsigned char mBuffer[100]; unsigned char mReadBuf[100]; unsigned long i, mLength, mErrCnt, 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; /* 使用之前必须打开设备 */ mErrCnt=0; //CH375SetTimeout( 0, 5000, 5000 ); // 设置USB数据读写的超时,超过5000mS未完成读写将强制返回,避免一直等待下去

mBuffer[0]=TEST_DATA>>8; mBuffer[1]=TEST_DATA&0xff; mTotal=2; // 随机数长度 if ( mTotal == 0 || mTotal > 2 ) mTotal=2; printf( "Len=%2ld, Data: %02XH,%02XH\xd", mTotal, mBuffer[0], mBuffer[1]); Sleep( 500 ); CH375WriteData( 0, mBuffer, &mTotal ); if ( CH375WriteData( 0, mBuffer, &mTotal ) ) // 发送成功 { mLength =2; Sleep( 600 ); // 考虑到之前单片机准备上传的数据可能未被计算机取走,导致首次回传有可能直接读到之前的数据而不是本次数据的取反,所以首次回传先等待单片机准备好取反数据 if ( CH375ReadData( 0, mReadBuf, &mLength ) ) // 接收成功 { if ( mLength != mTotal || mLength==0 ) { // 长度错误 mErrCnt++; printf( "\nS1- return length error: %ld (%ld)\n",mLength, mTotal ); } else { for ( i=0; i if ( mReadBuf[ i ]!=mBuffer[i] ) { // 取反值比较错误 mErrCnt++; printf( "\nS1- return data error at %ld: %02XH (%02XH)\n",i, mReadBuf[i], mBuffer[i] ); } else printf( "\nDATA at %ld: %02XH (%02XH)\n",i, mReadBuf[i], mBuffer[i] ); } } } else { // 读操作失败 mErrCnt++; printf( "\nS1- CH375ReadData return error, length=%ld\n", mTotal ); } } else { // 写操作失败 mErrCnt++; printf( "\nS1- CH375WriteData return error, length=%ld\n", mTotal ); }

if ( mErrCnt==0 ) printf( "\n*** passed \n" );

// 关闭CH375设备,如果不继续使用则必须关闭设备,就象读写完硬盘中的数据文件后要关闭一样 printf( "\n*** Total error = %ld \n", mErrCnt ); printf( "*** CH375CloseDevice: 0 \n" ); CH375CloseDevice( 0 );

printf( "\nExit.\n" ); getch(); }

想问TEST_DATA发出的数在单片机收到后在buffer里怎样放的?buffer[0]里是高八位还是低八位


刚刚测试过,你上面的那个改法是可以工作的,是不是你调试有问题啊。


是可以工作,但是测出来的数据不对,我再好好研究研究,谢谢


只有登录才能回复,可以选择微信账号登录