我使用CH376S模块,用来写TXT文件,只要一行超过50个字符就会出现乱码,49个字符正常,不知道为什么,求解????
检查一下你的buf缓冲区,buf的设置?写入的数据有没有问题?
UINT8 idata buf[64]; 怎样检查,数据没问题,如果让其写49个字符就分行,就不会出现乱码。
你把你的主程序贴出来看下,我们芯片是不会出现这种现象的。
void xieshuju_to_U() { uchar ii,s; for(ii=0;ii { if((UINT16)AscToHex(date[ii+65])<=0x09) { s = sprintf( buf,"%01d\xd", (UINT16)AscToHex(date[ii+65])); /* 将二制制数据格式为一行字符串 */ CH376ByteLocate(0xFFFFFFFF); s = CH376ByteWrite( buf, s, NULL ); /* 以字节为单位向当前位置写入数据块 */ } else if((UINT16)AscToHex(date[ii+65])==0x0a) { strcpy( buf, "A\xd" ); CH376ByteLocate(0xFFFFFFFF); s = CH376ByteWrite( buf, strlen(buf) , NULL);
} else if((UINT16)AscToHex(date[ii+65])==0x0b) { strcpy( buf, "B\xd" ); CH376ByteLocate(0xFFFFFFFF); s = CH376ByteWrite( buf, strlen(buf) , NULL);
} else if((UINT16)AscToHex(date[ii+65])==0x0c) { strcpy( buf, "C\xd" ); CH376ByteLocate(0xFFFFFFFF); s = CH376ByteWrite( buf, strlen(buf) , NULL);
} else if((UINT16)AscToHex(date[ii+65])==0x0d) { strcpy( buf, "D\xd" ); CH376ByteLocate(0xFFFFFFFF); s = CH376ByteWrite( buf, strlen(buf) , NULL);
} else if((UINT16)AscToHex(date[ii+65])==0x0e) { strcpy( buf, "E\xd" ); CH376ByteLocate(0xFFFFFFFF); s = CH376ByteWrite( buf, strlen(buf) , NULL);
} else if((UINT16)AscToHex(date[ii+65])==0x0f) { strcpy( buf, "F\xd" ); CH376ByteLocate(0xFFFFFFFF); s = CH376ByteWrite( buf, strlen(buf) , NULL);
} else { strcpy( buf, "F\xd" ); CH376ByteLocate(0xFFFFFFFF); s = CH376ByteWrite( buf, strlen(buf) , NULL);
} mStopIfError ( s ); } }
void main(void) { UINT8 i,s; xt_init(); //系统初始化 s = mInitCH376Host( ); //初始化CH376S模块 mStopIfError( s ); // 其它电路初始化 while ( 1 ) { while(1) //等待操作台 发来检测U盘 是否插入指令 { if(ser_end==0x01&date[0]==0xbb&date[1]==0x01&date[2]==0x00) { ser_end=0; break; } } while ( CH376DiskConnect( ) != USB_INT_SUCCESS ); //检测U盘或SD卡是否插入 for ( i = 0; i < 100; i ++ ) { mDelaymS( 50 ); //最长等待时间,100*50mS s = CH376DiskMount( ); // 初始化磁盘并测试磁盘是否就绪 if ( s == USB_INT_SUCCESS ) break; //准备好 else if ( s == ERR_DISK_DISCON ) break; //检测到断开,重新检测并计时 if ( CH376GetDiskStatus( ) >= DEF_DISK_MOUNTED && i >= 5 ) break; //有的U盘总是返回未准备好,不过可以忽略,只要其建立连接MOUNTED且尝试5*50mS } if ( s == ERR_DISK_DISCON ) { // 检测到断开,重新检测并计时 // printf( "设备已断开---Device gone\n" ); continue; } clr_date(); send(0x04);send(0x01);send(0x00);send(0x00);send(0x01); //检测U盘或SD卡已插入准备就绪 返回指令
while(1) //等待操作台 发来创建文件名命令 { if(ser_end==1&date[0]==0xbb&date[1]==0x07) { ser_end=0; break; } } wenjianmingzh(); //文件名数据 进行处理 clr_date(); //清空暂存单元 sprintf(TarName,"%02d%02d%02d%02d.TXT",(UINT16)yue,(UINT16)ri,(UINT16)shi,(UINT16)fen); s = CH376FileCreatePath( TarName ); //新建多级目录下的文件,支持多级目录路径,输入缓冲区必须在RAM中 mStopIfError( s ); send(0x0a);send(0x01);send(0x00);send(0x00); //创建文件成功 返回指令
while(1) { jieshoushuju=1; //接受数据标志 while(1) //等待操作台 发来要写的数据 { if(shuju_over==1) //此指令为:一个文件的数据接收完毕 { clr_date(); //清空数据缓存区 goto UnknownUsbDevice; //跳出 } if(date[3]!=0x00) { shujugeshu=(date[3]>>4)*10+(date[3]&0x0f); //取出数据的个数 date[3]=0x00; } if(ser_end==1&date[0]==0xbb&date[1]==0x09) //数据结束完毕 { ser_end=0; jieshoushuju=0; //接收数据标志位清零 break; } } xieshuju_to_U(); //将数据写入U盘 send(0x0c);send(0x01);send(0x00);send(0x00); //一组数据写完 返回指令 } UnknownUsbDevice: s = CH376FileClose( TRUE ); // 关闭文件,对于字节读写建议自动更新文件长度 mStopIfError( s ); send(0x22);send(0x01);send(0x00);send(0x00); //一个文件数据写完 返回指令 while ( CH376DiskConnect( ) == USB_INT_SUCCESS ) { // 检查U盘是否连接,等待U盘拔出 mDelaymS( 100 ); } } }
这个可能跟strcpy这个函数有关。建议你直接往buf里面写数据。比如buf[64]里都写0x30,看看会不会出现乱码?
那怎样直接往buf里面写数据,buf[64]里都写0x30,还是会出现乱码
你用UE软件看下你写进去的数据是什么样的数据?如果全是0X30的话那么出现乱码的话那么使用UE看下写进去的数据是什么样的数据?