none
從Com Port中讀出來的資料都是亂碼 RRS feed

  • 問題

  • 我想要從Com Port中讀取資料,我用CreateFile和ReadFile,WriteFile來寫,但是讀出來的都是亂碼,都不是我所傳入的字串,但就是找不出來錯誤在哪,我知道在Wince上都是以Unicode為資料型態,而ComPort的傳輸都是以char為主,所以我都是設資料型態為char,不過問題還是沒有解決,以下是我的程式碼,可以幫我看看是哪裡錯了嗎,麻煩各位

    char szText[4];
     char temp[]="bbcd";這是我假設的字串,最終是希望變成可以讓我下ATCommand 字串
     
     int len;
     CString strtemp,strout;
     
     char Byte;
     DWORD dwBytesTransferred=1;
     DWORD cBytes=1;
      
     int rc;
     for(int j=0;j<2;j++)
     {
        rc=WriteFile(hLocal,&temp[j],1,&cBytes,NULL);
         }
     //上面是把我的字串一一寫進去ComPort
     Sleep(200);
     for(len=0;len<4;len++)
     {
       ReadFile (hLocal,&Byte,1,&dwBytesTransferred,NULL);
        // Display the data read.
        szText[len] = Byte;
        
      }//這是把傳入的字串從ComPort中讀出來再把它丟給szText[]這個陣列
       
     
     for(int i=0; i < 4; i++)
            {
                strtemp.Format(TEXT("%c"), szText[ i ]) ;
                strout += strtemp;
       
            }
     
     SetDlgItemText(IDC_MYTEXT,strout);

    2007年5月8日 上午 02:28

解答

  • 1. 你把寫的東西,馬上讀回來的話,應該要有一個loopback的線路,

        才能讀到。

    2. 如果已經接好loopback的話,程式上,沒有很明顯的錯誤,可以使用breakpoint去trace實際接收回來的東西。另外,記得檢查每個function call是否真的成功完成。例如ReadFile的回傳值是不是0,0代表read錯誤。

    2007年5月8日 上午 05:22

所有回覆

  • 1. 你把寫的東西,馬上讀回來的話,應該要有一個loopback的線路,

        才能讀到。

    2. 如果已經接好loopback的話,程式上,沒有很明顯的錯誤,可以使用breakpoint去trace實際接收回來的東西。另外,記得檢查每個function call是否真的成功完成。例如ReadFile的回傳值是不是0,0代表read錯誤。

    2007年5月8日 上午 05:22
  • 感謝J大,我已找到錯誤的地方,原來不是我的程式錯,是機器設定上的問題,不過我還有個疑問,因我最終是要輸入ATCommand,但當我把我的字串設為temp[]="AT\r\n",回傳回來後面兩個字卻是亂碼,我知道ComPort都是char資料型態,而Wince上是Unicode的,所以我一開始都是設char,但為何傳回來的還是亂碼勒
    2007年5月8日 上午 06:39
  • 你有試過 "AT\n" 嗎?
    2007年5月9日 上午 03:34
  • 這問題已經解決了,後來把buffer設大一點就可以得到正確值了,不過我不知道正確原因
    2007年5月9日 上午 04:55