请问:ch372 单片机端怎样一次上传大于64个字节的数据??

用ch372的内置模式,批量端点2的传输。现在一次传输单片机上传小于64个字节成功了。 但是对于一次传输大于64字节不知怎么办了。下载的例程好像没有大于64字节的。看文档也是概念的东西。那位大侠能够给个例程,要考虑数据传输的稳定性,程序不要死了。或者说说怎么写也可,多谢!!

版主,高人帮帮我阿。工期很紧了!!老板快成催命鬼了。


我们的芯片提供了最大64个字节的缓冲区,也就是一次最多只能上传64个字节。如果数据大于64字节的话,你可以循环分多次进行上传。在上一次上传,产生端点2上传成功中断之后,先解锁缓冲区,再上传下一次要上传的数据(也就是将数据写入缓冲区,等待PC机来取)。


"在上一次上传,产生端点2上传成功中断之后,先解锁缓冲区,再上传下一次要上传的数据(也就是将数据写入缓冲区,等待PC机来取)。"---现在的问题是我的应用是 A、给单片机发送命令 B、单片机给应用返回数据。而调用 CH375ReadData去读数据的时候(CH375SetTimeoutEx设定了1500ms的超时),当数据小于等于64字节的时候,CH375ReadData会在1500ms内等待单片机返回数据。当数据大于64字节的时候,CH375ReadData往往只读取了前面的64字节就返回了,后面的数据丢了。不知道怎样让CH375ReadData在1500ms等单片机发发完??


1.ch375settimeout设置了1500的超时; 2.ch375readdata()读取了大于64字节的数据。 3.单片机上传了小于64的数据,PC机ch375readdata会提前返回,后面的数据需要再次调用函数去读。 4.如果单片机上传了没超过读长度但之前都是收到的整数包数据,PC机会在超时内等待,一旦超时时间到,读函数会退出,放弃后面数据的读操作。 5.如果PC没读到数据,PC机会在超时内等待,一旦超时时间到,读函数会退出,放弃后面数据的读操作。 6.在读函数返回后,一要判断函数返回的结果,如果是false说明操作失败;如果是true,但长度小于你所要求的 长度,那可能是上面3,4,5造成的提前返回。 综上所述,在上传数据时,在数据没传完应避免上传小于64字节的数据,或者是上传的数据没有PC所要求的那么多,可以上传一个小于64字节的或者是0长度的包来提前结束当前的读操作。


谢谢4楼教诲。我想我是看懂了你说的意思。但是现在收到了前64个数据(发送一百个数据),然后感觉是超时退出的。调了半天还是不通,把程序贴出来,请指正。 单片机程序: * CH375中断服务程序 */ void mCh375Interrupt( ) interrupt 6 { unsigned char InterruptStatus; unsigned char length; CH375_CMD_PORT = CMD_GET_STATUS; /* 获取中断状态并取消中断请求 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ InterruptStatus = CH375_DAT_PORT; /* 获取中断状态 */ if ( InterruptStatus == USB_INT_EP2_OUT ) { /* 批量端点下传成功 */ CH375_CMD_PORT = CMD_RD_USB_DATA; /* 从当前USB中断的端点缓冲区读取数据块,并释放缓冲区 */ Delay2us( ); /* 如果时钟频率低于16MHz则无需该指令延时 */ length = CH375_DAT_PORT; /* 首先读取后续数据长度 */ if ( length == 0 ) /* 如果长度为0说明计算机将要开始下传数据 */ { wLength=0; /* 将指针初始化以便接收 */ } else /* 长度不为0则说明是下传文件数据,接收到缓冲区中,再由主程序处理串口发送 */ { if(length != 64)//最后一个数据包 { RecvCommand = 1; } do { m_bpRBuffer[wLength] = CH375_DAT_PORT; wLength++; } while ( --length); if(RecvCommand == 1) { length = 0; for (i = 0; i < (wLength-1); i++) { length ^= m_bpRBuffer[i]; } if(length == m_bpRBuffer[i]) RecsSuccess = 1; else{ wLength = 0; } } } }else if ( InterruptStatus == USB_INT_EP2_IN ) { /* 批量数据发送成功,状态包已发送 */ if(Send_OVER == 0) { CH375_CMD_PORT = CMD_WR_USB_DATA7; LED_RED(); Send_OVER = 1; } else CH375_CMD_PORT = CMD_UNLOCK_USB; /* 释放当前USB缓冲区,收到上传成功中断后,必须解锁USB缓冲区,以便继续收发 */ } else CH375_CMD_PORT = CMD_UNLOCK_USB; /* 释放当前USB缓冲区

BYTE SendResponse(BYTE _bStatus, WORD _wLength) { BYTE bRecvData; BYTE bRet; WORD wSendAddr; WORD i;

wSendAddr = XRamSBuffer; *((BYTE xdata *)wSendAddr) = _bStatus; *((BYTE xdata *)(wSendAddr + 1)) = (BYTE)_wLength; *((BYTE xdata *)(wSendAddr + 2)) = (BYTE)(_wLength >> 8); _wLength += HEADER;

bRecvData = 0; for (i = 0; i < _wLength; i++) { bRecvData ^= *((BYTE xdata *)wSendAddr); wSendAddr++; } *((BYTE xdata *)wSendAddr) = bRecvData; _wLength++; wSendAddr = XRamSBuffer;

i = 0; Send_OVER = 1; CH375_CMD_PORT = CMD_WR_USB_DATA7; /* 向USB端点2的发送缓冲区写入数据块 */ while (_wLength> 0) { if(_wLength >= 64) { Send_OVER = 0; CH375_DAT_PORT = 64 ; /* 首先写入后续数据长度 */ bRet = 64; while(bRet) { CH375_DAT_PORT = *((BYTE xdata *)(wSendAddr + i)); /* 写入数据到CH375 */ i++; bRet--; } _wLength = _wLength-64; } else { if(Send_OVER == 1){//等待中断完成 LED_OFF(); CH375_DAT_PORT = _wLength; while(_wLength>0) { CH375_DAT_PORT = *((BYTE xdata *)(wSendAddr + i)); /* 写入数据到CH375 */ i++; _wLength --; } } } } return MCS_SUCCESS; } void main() { SendResponse(0, 100); } PC端就是收数据。当数据小于64个字节的时候是成功的。

另外罗嗦一句,要是有个全面例程就好了,或者有个详细的文档,我觉得会少走很多弯路的。 现在动态库我只是看。h文件那些注释,连蒙带猜去调用。单片机的也是看那些网上下载的例程。 痛苦的摸索中。。。。。。。


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