iT邦幫忙

0

serial 接收值 寫檔卻無法正確寫檔

想要寫一個接收一個值之後,將這一個值寫檔到txt檔裡面
但是卻會出現txt檔的byte有問題,會寫檔有64byte又會清除規零,而且寫進去的內容也不是想要的字串,請問是記憶體的部分哪裡配置錯了嗎?

CSerial serial;
int main(){
if (serial.Open(3, 9600)){
		 printf("Port opened successfully");

		char* lpBuffer = new char[50];
		 
		 int nBytesRead = serial.ReadData(lpBuffer,50 );
		
			 while(1){			
				while (!nBytesRead)
				{
					FILE *fptr1;
					fptr1 = fopen("C:\\Users\\User\\Desktop\\BlueTooth\\test.txt","w"); 	 
					fprintf(fptr1,"%s",lpBuffer);		 
					
					fclose(fptr1);
					
				}
				  delete []lpBuffer;
			 } 
	 }
			
		
	else
		{
			printf("Failed to open port!"); 
		}

	system("pause");
	return 0;
}
看更多先前的討論...收起先前的討論...
wwx iT邦研究生 1 級 ‧ 2017-10-07 11:46:59 檢舉
nBytesRead = serial.ReadData(lpBuffer,50 );
應該寫在 while(1) 的迴圈內才對吧,
然後
while (!nBytesRead) 是想沒讀到資料要寫檔嗎?!
是否應該改成 if (nBytesRead) 才是

如果是讀到一次資料寫檔就要結束(因為看到寫了 delete []lpBuffer )
那要多個break跳出while(1)才行吧~
如果是想持續讀資料就寫,那就不能delete,
不然lpBuffer都沒了要怎麼繼續讀資料存放呢?

而serial有確定都會讀到text嗎? 如果是binary有0x00的字組會出現,那麼用 "%s" 是出不來的...

由於太多可疑的問題,只能一一提出,請自行多加考慮
wwx iT邦研究生 1 級 ‧ 2017-10-07 11:54:58 檢舉
然後寫檔問題fopen:
"w" Create for writing. If a file by that name already exists, it will be overwritten.
"a" Append; open for writing at end-of-file or create for writing if the file does not exist.

用法還有 "r", "r+", "w+", "a+" 要查清楚
然後選擇想要用的正確模式
weiclin iT邦高手 7 級 ‧ 2017-10-07 13:20:04 檢舉
有好多地方需要改..隨便挑幾個
例如 nBytesRead 不是只用來判斷有沒有讀到資料, 還要用來決定你要寫多少東西進去檔案裡, 以你的寫法如果只讀了 5 bytes, 結果你寫了 50 bytes 進去, 後面就都是垃圾資料
另外以你這個範例根本用不到 new 與 delete, 直接 char buffer[50] 就可以用了, 還不用手動釋放
fptr1 = fopen 這根本不應該放在迴圈內, 除非你每次迴圈寫不同的檔案
最後你不能在迴圈內 delete []lpBuffer, 如果迴圈跑兩次你就重複 delete 了, 這是很糟糕的事情
pigs0231 iT邦新手 5 級 ‧ 2017-10-07 16:24:09 檢舉
原本用意是設置編號,假如設置1~10的編號,當讀取出某一個編號的時候,會在觸發那一個編號的虛擬按鍵,而寫檔是想了解讀取出來的值是跟原本發射出來的是否相同 。
而程式原本構想是,假如接收到值就將這個值寫檔,若使用者發送不同的値,就將原本的覆蓋掉
```
CSerial serial;
int main(){
if (serial.Open(3, 9600)){
printf("Port opened successfully");
char lpBuffer[20];

FILE *fptr;
fptr = fopen("C:\\Users\\User\\Desktop\\BlueTooth\\test.txt","w");
while(1){
int dwBytesRead = serial.ReadData(lpBuffer,20 );
if(dwBytesRead)
{
fptr = fopen("C:\\Users\\User\\Desktop\\BlueTooth\\text.txt","w");
fprintf(fptr,"%s",lpBuffer);
fclose(fptr);
}
}
lpBuffer[20];
}


else
{
printf("Failed to open port!");
}

}
```
現在這樣是可以接收第一個數字 但是後面又會出現亂碼

2 個回答

0
weiclin
iT邦高手 7 級 ‧ 2017-10-08 16:41:23
最佳解答

隨手改一改, 不一定能編譯也不一定能跑

#define BUFFER_SIZE 50

CSerial serial;
int main(){
    if (serial.Open(3, 9600)){
        printf("Port opened successfully");

        char buffer[BUFFER_SIZE];
        FILE *fptr1 = fopen("C:\\Users\\User\\Desktop\\BlueTooth\\test.txt","w");

        while(1){
            int nBytesRead = serial.ReadData(buffer, BUFFER_SIZE);
            printf("received %d bytes", nBytesRead);

            if (nBytesRead > 0) {
                fwrite(buffer, sizeof(char), nBytesRead, fptr1);
            } else {
                printf("no data");
                break;
            }
        }

        fclose(fptr1);
    } else {
        printf("Failed to open port!");
    }

    system("pause");
    return 0;
}
pigs0231 iT邦新手 5 級 ‧ 2017-10-08 16:50:36 檢舉

半夜的時候已經自己處理好了 謝謝你

if (serial.Open(3, 9600)){
		 printf("Port opened successfully\n");
		 char *lpBuffer =(char*)malloc(sizeof(char)*50);
		
			FILE *fptr;
			fptr = fopen("C:\\Users\\User\\Desktop\\BlueTooth\\test.txt","w"); 
			while(1){			
				int dwBytesRead = serial.ReadData(lpBuffer,1 );	
				lpBuffer [1]=  serial.ReadData(lpBuffer,0);
				 
				if(dwBytesRead){
						fptr = fopen("C:\\Users\\User\\Desktop\\BlueTooth\\test.txt","w"); 			
						 
						fprintf(fptr,"%s",lpBuffer);
						printf("%s\n",lpBuffer);
						fclose (fptr); 
				}
0
WilliamHuang
iT邦大師 1 級 ‧ 2017-10-06 22:11:40

字元跟字串
有轉換嗎
我只有看到int跟char
沒有sprint
...

pigs0231 iT邦新手 5 級 ‧ 2017-10-06 23:14:12 檢舉

是要將 char lpBuffer 跟int nBytesRead做轉換嗎?

sprintf(lpBuffer,"%d",nBytesRead);

這樣對嗎?

我要發表回答

立即登入回答