CH376写函数为何一次写不成功?

s = CH376FileCreate( "/ME_ADC.TXT" ); /* 新建文件并打开,如果文件已经存在则先删除后再新建,不必再提供文件名,刚才已经提供给CH376FileOpen */

mStopIfError( s );

for ( ahour = 0; ahour < 180; ahour ++ ) { /* 用循环方式添加12行数据 */

month = 5; date = 6;adc = 45;

s = sprintf( buf, "%02d.%02d.%02d ADC=%u\xd\xa", (UINT16)month, date, (UINT16)date, adc ); /* 将二制制数据格式为一行字符串 */

s = CH376ByteWrite( buf, s, NULL ); /* 以字节为单位向文件写入数据 */

mStopIfError( s );

}

s = CH376FileClose( TRUE ); /* 关闭文件,自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */

这里ADC=%u\xd\xa的=%u,xd,xa什么意思呢?谢谢!

这段程序: for ( ahour = 0; ahour < 180; ahour ++ ) { /* 用循环方式添加12行数据 */

ahour < 180

减小为:ahour < 1或ahour < 2是没有输出的

直到ahour < 3才有输出:

05.06.06 ADC=45 05.06.06 ADC=45 05.06.06 ADC=45

如果ahour < 4或ahour < 5

也还是只有3行结果输出,直到

ahour < 6

才有输出:

05.06.06 ADC=45 05.06.06 ADC=45 05.06.06 ADC=45 05.06.06 ADC=45 05.06.06 ADC=45 05.06.06 ADC=45 。

很奇怪,为啥呢?


楼主位的问题解决了,1楼的问题没有解决,谢谢版主做个解答。


%u表示打印数据的格式,\xd\xa表示换行,这些C语言书中都有解释


3楼,非常感谢你!数据格式分配那个知道了。

1楼那个问题估计是什么问题呢?

还有s = CH376ByteWrite( buf, s, NULL ); /* 以字节为单位向文件写入数据 */

中的buf原程序中定义了64个,是不是这个最少得定义64个字节?

是不是必须要等送完64个数据函数才能执行写操作?

那我要是写一个字节数据呢?


1楼的问题需要检查你的应用程序,CH376ByteWrite( buf, s, NULL ); 该函数是提供了一个接口,一次可以写入1-65535个字节。一次写64这是对CH376内部处理的,如果使用我们提供的函数,那么就不需要考虑那么多。


楼上,我是采用你们提供的函数呀,函数CH376ByteWrite( buf, s, NULL )调用的子程序都是用你们提供的,这个我也不可能去写呀,我也看了子程序,应该是我要写多少就写多少。郁闷哦。

不过我是在AVR上应用,应该跟这个单片机没有关系的。


没有写成功的时候,程序有没有停在什么地方,或者返回什么错误? 简单的测试一下。 s = CH376FileCreate( "/ME_ADC.TXT" ); mStopIfError( s ); for ( ahour = 0; ahour < 100; ahour ++ ) buf[ahour] = 0x35;

for ( ahour = 0; ahour < 180; ahour ++ ) {

s = CH376ByteWrite( buf, 100, NULL ); /* 以字节为单位向文件写入数据 */

mStopIfError( s ); } s = CH376FileClose( TRUE ); /* 关闭文件,自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */


谢谢楼上!现在卡好像不行了,我用的是SD卡但转成USB那种,

刚才在调试程序,东西好像写进去了,打开文件时出错了。

你说的那个我等一会儿测试一下。

不过昨天按照你们提供那个范例,我测试过关闭文件时的返回值是1E

#define USB_INT_DISK_WRITE 0x1E /* USB存储器请求数据写入 */

等会儿我在测试一下你给要求的那个返回是什么。


程序执行到关闭文件都没有问题的。我调试时有状态指示的。


回_study_ { M }:

我用下面的程序,

for ( ahour = 0; ahour < 100; ahour ++ ) { buf[ahour] = 0x35; } for( ahour = 0; ahour < 20; ahour++) { /* 用循环方式添加12行数据 */

month = 5; date = 6;adc = 45;

s = CH376ByteWrite( buf, 64, NULL );//strlen(buf), NULL ); /* 以字节为单位向文件写入数据 */

jianli[ahour]=s;

UDR1=0x99; while(!(UCSR1A&0x40)); UCSR1A|=0x40;

UDR1=0x99; while(!(UCSR1A&0x40)); UCSR1A|=0x40;

UDR1=ahour; while(!(UCSR1A&0x40)); UCSR1A|=0x40;

UDR1=s; while(!(UCSR1A&0x40)); UCSR1A|=0x40; mStopIfError( s );

}

s = CH376FileClose( TRUE );

通过串口返回的数据可以看到:在循环里的写程序执行了三次,第一次和第二次返回的是0x14,第三次返回的是0xFA,然后程序就停下来了。没有第四次返回,而且第三次返回很慢,大概等了几秒钟。

返回的十六进制数据:

57 AB 06 65 57 AB 15 06 57 AB 22 57 AB 30 57 AB 22 57 AB 30 57 AB 22 57 AB 31 57 AB 22 57 AB 2F 2F 4D 59 5F 41 44 43 2E 54 58 54 00 57 AB 34 57 AB 22 57 AB 3C 40 00 57 AB 22 99 99 00 14 57 AB 3C 40 00 57 AB 22 99 99 01 14 57 AB 3C 40 00 57 AB 22 57 AB 2D 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 57 AB 3D 99 99 02 FA


串口方式下有没有使用CH376的中断引脚?Wait376Interrupt( ),Query376Interrupt( )这两个函数贴出来看看


使用了的,函数Wait376Interrupt( ),改过: /* 查询CH376中断(INT#低电平) */ UINT8 Query376Interrupt( void ) { ///#ifdef CH376_INT_WIRE /// return( CH376_INT_WIRE ? FALSE : TRUE ); /* 如果连接了CH376的中断引脚则直接查询中断引脚 */ ///#else /// if ( RI ) { /* 如果未连接CH376的中断引脚则查询串口中断状态码 */ /// RI = 0; /// return( TRUE ); /// } /// else return( FALSE ); ///#endif

DDRG&=~(1< if((PING&0x01)==0x01) { //UDR1=0x33; //while(!(UCSR1A&0x40)); //UCSR1A|=0x40; return( FALSE ); } else { //UDR1=0x44; //while(!(UCSR1A&0x40)); //UCSR1A|=0x40; return( TRUE ); } }

第一个函数我应该没有动过: #ifndef NO_DEFAULT_CH376_INT UINT8 Wait376Interrupt( void ) /* 等待CH376中断(INT#低电平),返回中断状态码, 超时则返回ERR_USB_UNKNOWN */ { #ifdef DEF_INT_TIMEOUT #if DEF_INT_TIMEOUT < 1 while ( Query376Interrupt( ) == FALSE ); /* 一直等中断 */ return( CH376GetIntStatus( ) ); /* 检测到中断 */ #else UINT32 i; for ( i = 0; i < DEF_INT_TIMEOUT; i ++ ) { /* 计数防止超时 */ if ( Query376Interrupt( ) ) return( CH376GetIntStatus( ) ); /* 检测到中断 */ /* 在等待CH376中断的过程中,可以做些需要及时处理的其它事情 */ } return( ERR_USB_UNKNOWN ); /* 不应该发生的情况 */ #endif #else UINT32 i; for ( i = 0; i < 5000000; i ++ ) { /* 计数防止超时,默认的超时时间,与单片机主频有关 */ if ( Query376Interrupt( ) ) return( CH376GetIntStatus( ) ); /* 检测到中断 */ /* 在等待CH376中断的过程中,可以做些需要及时处理的其它事情 */ } return( ERR_USB_UNKNOWN ); /* 不应该发生的情况 */ #endif } #endif


看一下这个帖子,修改Query376Interrupt( ),在该函数中多读取一下串口,并清除串口接收标志 /bbs/View.asp?T=1&S=101&I=41356


这下返回是正确的了,程序写了20次,每次返回14,再测试测试。谢谢楼上!

改的程序:

UINT8 Query376Interrupt( void ) { ///#ifdef CH376_INT_WIRE /// return( CH376_INT_WIRE ? FALSE : TRUE ); /* 如果连接了CH376的中断引脚则直接查询中断引脚 */ ///#else /// if ( RI ) { /* 如果未连接CH376的中断引脚则查询串口中断状态码 */ /// RI = 0; /// return( TRUE ); /// } /// else return( FALSE ); ///#endif #ifdef CH376_INT_WIRE

xReadCH376Data();

DDRG&=~(1< if((PING&0x01)==0x01) { //UDR1=0x33; //while(!(UCSR1A&0x40)); //UCSR1A|=0x40; return( FALSE ); } else { //UDR1=0x44; //while(!(UCSR1A&0x40)); //UCSR1A|=0x40; return( TRUE ); } #endif }


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