[求助]CH376写入资料请教

各位前辈们好,小弟在使用CH376的时候遇到了一个问题就是使用单芯片发指令建立一个TEST.TXT的文本文件,然后针对这个文本文件进行写入的动作写入动作都不成功,可是如果是在计算机上建立一个TEST.TXT档案在使用单芯片执行OPEN File然后针对这个TEST.TXT的文本文件做写入的话写入数据就会成功,目前看到的差异是使用单芯片建立TEST.TXT的时候文本文件里面会多出一个"1"的字符,请问建立档案的时候怎样才不会产生字符或者是说怎么使用覆盖的方式来处理这个问题呢?还是说还有其他解决方法呢?请前辈们指教,感谢!

以下昰我的程式碼 while(1) { PORTB = 0X00; Delay5ms(20);

//Test communication interface and work status while(CHECK_EXIST() != 0x00) Delay5ms(1); PORTBbits.RB0 = 1; UART1_RX_Value_Buffer = 0; //Setting the USB mode while(SET_USB_MODE()!= 0x51) Delay5ms(1); PORTBbits.RB1 = 1; UART1_RX_Value_Buffer = 0; //Initialize the disk and test disk ready while(DISK_MOUNT()!=0x14) Delay5ms(1); PORTBbits.RB2 = 1; UART1_RX_Value_Buffer = 0; //Set to operate on the file name Delay5ms(1); SET_FILE_NAME(); PORTBbits.RB3 = 1; UART1_RX_Value_Buffer = 0; //Open the file or directory, enumerate files and directories while(FILE_OPEN()!=0x14) Delay5ms(1); PORTBbits.RB4 = 1; UART1_RX_Value_Buffer = 0; //while(BYTE_LOCATE()!=0x14)

BYTE_LOCATE(); Delay5ms(100); UART1_RX_Value_Buffer = 0; //Create documents // while(FILE_CREATE()!=0x14) // Delay5ms(1); // PORTBbits.RB4 = 1; // UART1_RX_Value_Buffer = 0; //===============================================================

//In bytes of the write data block to the current location //while(BYTE_WRITE()!=0x1E) BYTE_WRITE(); Delay5ms(1); PORTBbits.RB5 = 1; UART1_RX_Value_Buffer = 0; //Specified buffer to the internal write request data blocks Delay5ms(1); WR_REQ_DATA(); PORTBbits.RB6 = 1; UART1_RX_Value_Buffer = 0; //Continue byte write while(BYTE_WR_GO()!=0x14) //BYTE_WR_GO(); Delay5ms(1); BYTE_WR_GO(); PORTBbits.RB7 = 1; UART1_RX_Value_Buffer = 0; //Closes the currently open file or directory while(FILE_CLOSE()!=0x14) Delay5ms(1); PORTBbits.RB8 = 1; UART1_RX_Value_Buffer = 0;

Delay5ms(200);

//================================================================== //Test communication interface and work status unsigned char CHECK_EXIST() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x06); UART1_Send_Value(0xFF); return UART1_RX_Value_Buffer; } ////Setting the USB mode unsigned char SET_USB_MODE() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x15); UART1_Send_Value(0x03); return UART1_RX_Value_Buffer; } //Initialize the disk and test disk ready unsigned char DISK_MOUNT() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x31); return UART1_RX_Value_Buffer; } //Set to operate on the file name unsigned char SET_FILE_NAME() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x2F); char data[] = "TEST.TXT"; UART1_Send_String(data);

//TEST.TXT //UART1_Send_Value(0x54); //UART1_Send_Value(0x45); //UART1_Send_Value(0x53); //UART1_Send_Value(0x54); //UART1_Send_Value(0x2E); //UART1_Send_Value(0x54); //UART1_Send_Value(0x58); //UART1_Send_Value(0x54); return UART1_RX_Value_Buffer; } //Create documents unsigned char FILE_CREATE() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x34); return UART1_RX_Value_Buffer; }

unsigned char BYTE_WRITE() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x3C); UART1_Send_Value(0x0A); UART1_Send_Value(0x0A>>8); return UART1_RX_Value_Buffer; }

unsigned char BYTE_READ() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x3A); return UART1_RX_Value_Buffer; } unsigned char WR_REQ_DATA() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x2D);

UART1_Send_Value(0x31); UART1_Send_Value(0x32); UART1_Send_Value(0x31); UART1_Send_Value(0x32); UART1_Send_Value(0x41); UART1_Send_Value(0x0D); // \r UART1_Send_Value(0x0A); // \n UART1_Send_Value(0x45); UART1_Send_Value(0x47); UART1_Send_Value(0x48); return UART1_RX_Value_Buffer; }

unsigned char BYTE_WR_GO() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x3D); return UART1_RX_Value_Buffer; }

unsigned char FILE_CLOSE() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x36); UART1_Send_Value(0x01); return UART1_RX_Value_Buffer; }

unsigned char FILE_OPEN() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x32); return UART1_RX_Value_Buffer; }

unsigned char WR_OFS_DATA() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x2E); UART1_Send_Value(0x00); UART1_Send_Value(0x05);

UART1_Send_Value(0x42); UART1_Send_Value(0x42); UART1_Send_Value(0x42); UART1_Send_Value(0x46); UART1_Send_Value(0x46); return UART1_RX_Value_Buffer; }

unsigned char BYTE_LOCATE() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x39);

UART1_Send_Value(0xFF); UART1_Send_Value(0xFF); UART1_Send_Value(0xFF); UART1_Send_Value(0xFF); }

我们CH376创建文件成功的话会产生长度为1个字符的文件,这是正常现象。你遇到的问题是文件写不进去,文件写完之后需要更新文件长度的。看了你的程序,在发送CMD01_WR_REQ_DATA(2DH)命令后,需要读取可以往CH376数据长度,之后才是写数据。


前辈好,我目前测试的结果是假如我将TEST.TXT的文字内容删除那可以CH376S可以正常打开文件,可是假设文件内有资料的话就没办法正常打开文件,回复错误代码是42,可否请前辈指点,感谢!


你之前内容写不进文件的问题还有可能是写延迟问题,你可以这样试一下先关闭文件,再创建文件,再删除看看能否解决? 另外,返回0x42代表没有找到文件,你可以在电脑上创建一个文件写入内容,再用CH376看看能否正常打开。


現在的狀況是我只要文件內有資料的話要開啟檔案就會反回0x42,假設文件內沒有資料的話就可以找的到檔案,這個問題還蠻奇怪的,我的程式內容如下,可否請前輩抽空指點,感謝!

while(1) { PORTB = 0X00; Delay5ms(20);

//Test communication interface and work status while(CHECK_EXIST() != 0x00) Delay5ms(1); PORTBbits.RB0 = 1; UART1_RX_Value_Buffer = 0; //Setting the USB mode while(SET_USB_MODE()!= 0x51) Delay5ms(1); PORTBbits.RB1 = 1; UART1_RX_Value_Buffer = 0; //Initialize the disk and test disk ready while(DISK_MOUNT()!=0x14) Delay5ms(1); PORTBbits.RB2 = 1; UART1_RX_Value_Buffer = 0; //Set to operate on the file name Delay5ms(1); SET_FILE_NAME(); PORTBbits.RB3 = 1; UART1_RX_Value_Buffer = 0; //Open the file or directory, enumerate files and directories while(FILE_OPEN()!=0x14) Delay5ms(1); FILE_OPEN(); PORTBbits.RB4 = 1; UART1_RX_Value_Buffer = 0; //============================================================ unsigned char CHECK_EXIST() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x06); UART1_Send_Value(0xFF); return UART1_RX_Value_Buffer; } ////Setting the USB mode unsigned char SET_USB_MODE() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x15); UART1_Send_Value(0x03); return UART1_RX_Value_Buffer; } //Initialize the disk and test disk ready unsigned char DISK_MOUNT() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x31); return UART1_RX_Value_Buffer; } //Set to operate on the file name unsigned char SET_FILE_NAME() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x2F); char data[] = "TEST.TXT"; UART1_Send_String(data); }

unsigned char FILE_OPEN() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x32); return UART1_RX_Value_Buffer; }


目前的状况是只要TEST.TXT档案内有数据我用OPEN File就会回传0x42(找不到数据)假设TEST.TXT档案内容净空,那用OPEN File就可以找到数据,我的代码如下,可否请钱被抽空指点,感谢!

while(1) { PORTB = 0X00; Delay5ms(20);

//Test communication interface and work status while(CHECK_EXIST() != 0x00) Delay5ms(1); PORTBbits.RB0 = 1; UART1_RX_Value_Buffer = 0; //Setting the USB mode while(SET_USB_MODE()!= 0x51) Delay5ms(1); PORTBbits.RB1 = 1; UART1_RX_Value_Buffer = 0; //Initialize the disk and test disk ready while(DISK_MOUNT()!=0x14) Delay5ms(1); PORTBbits.RB2 = 1; UART1_RX_Value_Buffer = 0; //Set to operate on the file name Delay5ms(1); SET_FILE_NAME(); PORTBbits.RB3 = 1; UART1_RX_Value_Buffer = 0;

//Open the file or directory, enumerate files and directories while(FILE_OPEN()!=0x14) Delay5ms(1); FILE_OPEN(); PORTBbits.RB4 = 1; UART1_RX_Value_Buffer = 0; } //=========================================================== //Test communication interface and work status unsigned char CHECK_EXIST() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x06); UART1_Send_Value(0xFF); return UART1_RX_Value_Buffer; } ////Setting the USB mode unsigned char SET_USB_MODE() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x15); UART1_Send_Value(0x03); return UART1_RX_Value_Buffer; } //Initialize the disk and test disk ready unsigned char DISK_MOUNT() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x31); return UART1_RX_Value_Buffer; } //Set to operate on the file name unsigned char SET_FILE_NAME() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x2F); char data[] = "TEST.TXT"; UART1_Send_String(data); } unsigned char FILE_OPEN() { UART1_Send_Value(0x57); UART1_Send_Value(0xAB); UART1_Send_Value(0x32); return UART1_RX_Value_Buffer; }


你文件名换成"\\TEST.TXT"或者"/TEST.TXT"试一下?


前辈好,我现在遇到的问题是只要文件内有数据用open file就找不到档案,假设文件内容是净空的,用open file就找的到档案,不会回传0x42,请前辈指点,感谢!


文件的打开与文件里面有无内容没有关系的,你先用6楼的方法试一下?


請教前輩,對CH376下指令有規定每個指令之間要多少時間的延遲嗎?


命令与命令、数据之间间隔1.5us,数据与数据之间延时0.6us


前辈好,我在计算机上创建一个文件,只要这个文件内容是净空的,CH376就可以读取到这个文件,假设这个文件内容不是净空的,CH376就找不到文件,不知道前辈知道这是什么原因吗?请前辈指点,感谢!


前輩好,目前文件內容非淨空狀態以經可以找到文件,目前的狀況是只要文件內容非淨空,就沒辦法順利寫資料進去,可以請教前輩文件有內容就無法寫資料進去可能是哪些問題引起的呢?請前輩抽空指點,感謝!


文件的空和非空和你写入数据应该没什么关系,主要看你写入的时候是需要在文件后面追加数据还是打开文件直接写数据。如果是追加数据,则需要使用LOCATE函数跳至你需要追加的位置。然后写数据。如果是直接写数据,则打开文件之后直接写数据。每次写完之后需要更新文件长度。关闭文件。每次调用函数请监控文件的返回状态。


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