ch372b上传512字节,上位机读错或读不到问题

本人的下位机,在上传数据时的程序段如下: //有一个定义好的数组里面全是测试数据,从0到255的。现在分八次上传,共512字节。 unsigned eep_array_1,eep_array_2,u; // Test_array_total[512] CH375_WR_CMD_PORT( CMD_UNLOCK_USB ); /* 释放当前USB缓冲区 */ eep_array_1=0; u=0; for (eep_array_1=0;eep_array_1<8;eep_array_1++) { CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端点2的发送缓冲区写入数据块 CH375_WR_DAT_PORT(64); for ( u = 0; u < 64; u ++ ) CH375_WR_DAT_PORT(Test_array_totaleep_array_1*64+u]); }

上位机程序段如下: 读八次,每次读64个字节,读后的数据放入数组 Eeprom_Array里面。 For i = 0 To 7 If (CH375ReadData(0, mRead_Eeprom_Buf, 64)) Then For k = 0 To 63 Eeprom_Array(i * 64 + k) = mRead_Eeprom_Buf.eeprom_mBuf(k) Next k End If Next i

流程错误. 先传64个字节,等待中断,64字节传完后,等待产生中断,进入中断函数,获取中断状态,中断状态为USB_INT_EP2_IN.然后释放缓冲区,然后才可以继续上传下64个字节,然后等待中断.......,依次传输完毕512个字节.


红桃六:你好,谢谢你的指点。 本人现在只试验上传64个字节包的程序,出现的一个问题: 好像第一次在上位机上点上传数据,读到的数据全是正确的。是从0到63的数值, 但是我再点读取数据,读到的数据前三个总是错的,好像是个随机数一样,没有规律,后面的61个数据是正常的。

本人的下位机,在上传数据时的程序段如下: //有一个定义好的数组里面全是测试数据,从0到63的。现在要上传给上位机VB 程序中 // Test_array_total[512] CH375_WR_CMD_PORT( CMD_WR_USB_DATA7 ); // 向USB端点2的发送缓冲区写入数据块 CH375_WR_DAT_PORT(64); for ( u = 0; u < 64; u ++ ) CH375_WR_DAT_PORT([u]); \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 上位机程序段如下: 读一次,每次读64个字节,读后的数据放入数组 Eeprom_Array里面。 If (CH375ReadData(0, mRead_Eeprom_Buf, 64)) Then For k = 0 To 63 Eeprom_Array(k) = mRead_Eeprom_Buf.eeprom_mBuf(k) Next k End If


CH375ReadData(0, mRead_Eeprom_Buf, 64)要改成 Dim mLen As Long mLen = 64 CH375ReadData(0, mRead_Eeprom_Buf, mLen ) If mLength <> 0 Then ... End If 并且要判断mLen 是否为0,如果为0的话就是没读到数据.


zyw 你好: 我按你上面的方法试了,还是老问题,第一次读到的数全正确。 第二次,再读数据。前三个就好像变成随机数了。


下载CH372DBG.ZIP,可以进行单次读写,调试你的下位机


不知道你第2包数据是怎么传的.按照这个方式你先下传64个字节,然后取反后上传,或者直接上传上去: pBuf=mBuf; //数据未处理 CH375_WR_CMD_PORT(CMD_RD_USB_DATA); //发出读数据命令 length=CH375_RD_DAT_PORT(); //首先读出的是长度 for(len=0;len!=length;len++,pBuf++)*pBuf=CH375_RD_DAT_PORT(); //将数据读入到缓冲区 pBuf=mBuf; // 演示回传 CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); //发出写上传端点命令 CH375_WR_DAT_PORT(length); for(len=0;len!=length;len++,pBuf++)CH375_WR_DAT_PORT(*pBuf); //将数据写入上传端点


CH375ReadData必须要按上面的方式写,不然会造成内存出错的! 你读出来是随即数,那有没有判断mLen呢?如果mLen为零的话,那mRead_Eeprom_Buf里的数据就是无效的!


各位老师,我按照你们上面的方法去试了一下,但还是没有达到我想要的目的,示例程序我也看了它上传是是些无意义的数字,也看不出来是对是错。 能不能帮我写一下,上位机和下位的,上传与下载段的程序。 目的就是,51单片机中有一个512字节的固定数组,里面有事先定义好的512个数据,比如:从0到255再到0。 现在用上位机VB程序,把这512个字节全读到上位机中,定义好的一个数组里。 万分感谢,现在用372就这个数据不能一次传上来卡住了。


我们已经提供了参考程序,你把的测试结果贴出来看看.上次让演示回传实验有没有做?按照我们的建议来做实验,能很快的判断问题所在


红桃六:你好: 刚刚按你那个方法试了,传的数据是正确的,我用的测试代码如下: 这是传64个字节没问题,那要传512个字节怎样在下面的基础上再加代码来实现呢。

///上位机VB代码如下:////////////////// test_data.test_data(0) = 246 '定义了一个首数字,做为下位机的约定命令。其它的单元数值是从1到63 If (CH375WriteData(0, test_data, 64)) Then '发送成功 If (CH375ReadData(0, mRead_Eeprom_Buf, 64)) Then'如果读成功,在列表中显示刚读到的数。 For n = 0 To 63 List2.AddItem (mRead_Eeprom_Buf.eeprom_mBuf(n))'显示的是246,1,2一直到63。是正确值。 Next n End If End If

////下位机如下代码://////////////////////////////////// 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( ); /* 接收数据包 */ switch(buffer[0])//根据第一个字节的内容,做相应的处理。 {case 246: //上位机传的第一个是246的话,就做如下动作。 CH375_WR_CMD_PORT(CMD_WR_USB_DATA7); //发出写上传端点命令 CH375_WR_DAT_PORT(length); for(len=0;len!=length;len++)CH375_WR_DAT_PORT(buffer[len]); //将刚才读到的数据上传给上位机。 break; } } }


怀疑你下位机代码有点问题,发E_mail:lht@wch.cn,把程序发过来看看.


CH375ReadData(0, mRead_Eeprom_Buf, 64)要改成

Dim mLen As Long mLen = 64 //每次调用前都要赋值 CH375ReadData(0, mRead_Eeprom_Buf, mLen )//第3个参数必须是个变量!否则可能会出现内存访问错误! If mLen <> 0 Then For n = 0 To mLen List2.AddItem (mRead_Eeprom_Buf.eeprom_mBuf(n))'显示的是246,1,2一直到63。是正确值。 Next n End If 并且要判断mLen 是否为0,如果为0的话就是没读到数据. CH375WriteData第3个参数也必须是个变量! 必须的!


红桃六 你好: 刚才我又整理了一下,下位机的程序,发现了一个问题,我在第二次发数据包时,没有加上CH375_WR_CMD_PORT(CMD_WR_USB_DATA7);这个命令。是个低级错误。 很感谢你们公司能及时的指点我们这些初级使用者,给我们指点谜经,有针对性的去查找问题。 如有问题再来打扰。

感谢ZYW指点,我会按你的方法,将上位机的那个隐患去掉的。


不知什么原因,现在读的数据又不对了。我已发邮件给你了。谢谢帮忙看一下。


下位机代码有问题.缺少了一个break;修改后上传文件:


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