none
serialport資料遺失 RRS feed

  • 一般討論

  • 我的傳輸模式為,A電腦->B電腦,無窮單向傳輸。

    Baud 38400,8N1,資料長度不定,25ms發送一次(並不要求達到25ms)。

    以下為另開一Thread專職接收,此種情況下不會有資料遺失的情形,但在單核電腦上會耗盡CPU使用率,導致使用體驗極差。

    (註解的Sleep,是我曾試過,但發生漏碼)

            void doReceive()
            {
               System.Collections.Generic.List<char> buf = new System.Collections.Generic.List<char>(256);
                string frag;
                while (true)
                {
                    if (serialPort1.BytesToRead <= 1)
                    {
                        //Thread.Sleep(1);
                        continue; 
                    }
                    frag = serialPort1.ReadExisting();
                    foreach (char c in frag)
                    {
                        buf.Add(c);
                        if (c == '\n')
                        {
                            string input = new string(buf.ToArray());
                            buf.Clear();
                            messages.Add(input);//messages=List<string>
                            //Thread.Sleep(1);
                        }
                    }
                }
    }

    以上無窮迴圈Thread程式替換如下,並另開一Timer作資料整理,一樣會漏碼

    System.Collections.Generic.List<string> temp = new List<string>();

    String frag=""; void doReceive() {

    While(true)

    {

             if (serialPort1.BytesToRead <= 1)
             {
                 //Thread.Sleep(1);
                 continue;
              }
              frag = serialPort1.ReadExisting(); temp.Add(frag); Thread.Sleep(1);

    } }

    DataReceive事件的漏碼情形更嚴重。

    以下為DataReceive事件,且另開一Timer去做資料整理

    System.Collections.Generic.List<string> temp= new List<string>();

            String frag=""; void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) {

    frag = serialPort1.ReadExisting(); temp.Add(frag); }

    最後,我試著用AccessPort來接收資料,發現也會有漏碼問題。

    雖然A電腦的發送程式是自己寫的,但在Thread下的無窮迴圈並沒有漏碼情形,因此發送程式應該沒有錯誤才對。

    我想要達成無漏碼且不要耗盡CPU資源,請教各位前輩的建議。



    2012年10月29日 上午 09:22

所有回覆

  • 您好,
    可參考一下,SerialPort event handler is not handling high-speed binary data correctly

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年10月29日 上午 11:21
  • 因為這問題我解不出來, 所以我想知道樓上是亂猜的, 還是真的試過 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年10月29日 上午 11:32
    版主
  • 掉碼的原因應該是你沒事就用字串收吧?

    在你確定你足夠了解 Encoding 前,請一律使用 byte() 收。

    用字串收、轉字元、再轉 byte ... 你在搞啥?完全看不懂。

    .Net framework 字串只允許 Unicode ,所有非 Unicode 都必須以 Byte() 存在。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月29日 下午 03:49
  • 我在 VB6 / VBNET 用 115200 也沒掉碼過(西門子的設備,預設 115200 ,最低速為 57600)。

    高速環境下可能需要調大你 SerialPort 物件的 buffer ,ㄧ般來說是處理速度的 3 ~ 6 倍大。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月29日 下午 03:52
  • 以下為使用Byte版本,且另開一Timer作資料整理,仍然有掉碼情形。

            List<char> buf_ch = new List<char>();
            void doReceive()
            {
                int btr = 0;
                while (flag)
                {
                    btr = serialPort1.BytesToRead;
    
                    if (btr < 1)
                    {
                        System.Threading.Thread.Sleep(1);
                        continue;
                    }
                    buf_ch.Add( (char)serialPort1.ReadChar());
                }
            }

    我確實不瞭解Encoding,不過我的資料都是ASCII,應該是不用考慮到Encoding吧。

    我的資料長度為40~100不等,ReadBufferSize是設為8192。改成115200及230400也沒有改善掉碼情形。

    以上都是在VS2005及VS2008上測試的,不知道這會不會是個原因。

    另外亂馬客轉貼的關於第三方component,要等過一段時間試過後才能回復。

    希望各位前輩能繼續給予建議。

    2012年10月30日 上午 06:55
  • 字元 A

    Unicode = 00 40

    ASCII = 40

    SerialPort 相關討論先把這些看一看:

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=SerialPort%20MemoryStream

    我沒看到你程式碼中那裡用到 Byte 來讀。

    ReadChar 難道你不知道 Char 是甚麼意思嗎?

    還是你不知道你宣告中 char 是甚麼型別?

    所以你仍有上面的問題,因為字元是字串的最小單位,因此仍然是 Unicode 與編碼問題。

    除非你是用本機虛擬的 Null Modem 互連,否則你速率要到 115200 以上,本身要硬體先支援,包含主機板晶片、COM port、driver、通訊線材、通訊距離、中間有的 converter、設備端。我告訴你高速也沒掉碼的意思是問題跟速率沒啥關係,並非是建議你要用高速,速率最好配合你實體線材,若不確定,請先使用 19200 以下的速率,等穩定後再調速。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月30日 下午 12:03
  • 基本上ReadByte跟ReadChar我都試過了,沒有改善掉碼情形。

    我覺得跟Encoding沒關係,是因為我第一段無窮迴圈不加Slepp的doReceive就沒有掉碼的情形。

    且ReadChar跟ReadByte回傳值都為int,我觀察他回傳的int值並沒有00 byte,我也沒開DiscardNull。

    我並沒有把Baud rate 調到115200,我調的是ReadbufferSize。

    因為你上文說高速環境下Buffer要為處理速度的3~6倍,雖然我不知道我的環境算不算高速


    • 已編輯 juhhny 2012年10月31日 上午 08:46
    2012年10月31日 上午 02:24
  • Buffer 的空間不是從 鮑率 去乘,而是依照你的程式碼處理速度或迴圈速率去乘

    比如說你會睡 10ms ,你的速率是 9600 ,CPU 處理接收的程式碼片段是 10ms

    9600 * (10 + 10) / 1000 /8 * 3 ~ 6 = 72 ~ 144 bytes ,所以可以不用動預設 8kb 。

    你 25 ms 送一次,架設程式碼執行時間 75 ms ,用 100 ms 去估算:

    38400 * 100 / 1000 / 8 * 3 = 1440 ~ 2880 。

    一般沒必要根本不會用 ReadChar / ReadByte ,因為這會加大你程式執行的時間,以倍率乘上去

    一般直接用:

    SerialPort.Read 方法 (array<Byte>[]()[], Int32, Int32)

    我實在不知道給你 FAQ 的連結,你到底在看甚麼。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月31日 下午 12:43
  • 你如果對硬體線路、訊號電壓這些不會檢測,先用 Null Modem ,確保不是線路只是程式碼的問題。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年10月31日 下午 12:45
  • 換了一台測試電腦,問題解決了。

    使用DataReceived事件,並另開一Timer作資料整理。

            System.Collections.Generic.List<string> buf_str = new List<string>();
            void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                serialPort1.DataReceived -= serialPort1_DataReceived;
                if (serialPort1.BytesToRead > 0)
                {
                    buf_str.Add(serialPort1.ReadExisting());
                }
                serialPort1.DataReceived += serialPort1_DataReceived;
            }
    而Thread+Sleep仍然會掉碼。

    感謝各位前輩的指導。

    2012年11月1日 上午 09:11
  •                 buf_str.Add(serialPort1.ReadExisting());
    

    這還是在用字串收。

    你如果有充足的經驗,足夠了解 .Net 的字串,甚至 List ... 那也許有特殊目的這樣寫。

    當我看到用 List 組,用字串收,我會覺得是個完全不懂得家伙,而講半天都沒在聽,浪費彼此的時間。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年11月1日 下午 12:17
  • 基本上你說的方法,我都有試過。

    為了解決我上述所說的問題,每種Read function我也都嘗試過。

    用ReadExisting達成我要的結果,我就上來回覆了。

    事實上,我不太了解決Read function間有什麼優劣。

    我這裡的意思是說,既然ReadExisting可以達成我要的結果,有什麼必要一定要用其它的Read function?

    關於List我是在拜讀 Bill Chung的系列文章後才開始使用的,我不太清楚List有哪些風險嚴重到我應該放棄使用它。

    很感謝你提的建議,雖然根據我實際測驗的結果,確實是浪費時間。


    • 已編輯 juhhny 2012年11月2日 上午 11:04
    2012年11月2日 上午 07:56
  • 利用ErrorReceived事件,發現掉碼時幾乎都會觸發overrun。

    而相同的程式在第三台IPC測試時,DataReceived事件在10萬筆資料後才發生掉碼。

    Thread+Sleep則是在40萬筆資料後,都還沒有掉碼情形發生。

    初步研判是硬體造成的問題。

    2012年11月2日 上午 10:13
  • 從你補充的回應中,我覺得你完全沒搞懂。

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=SerialPort%20%e5%8f%8d%e6%87%89%e6%99%82%e9%96%93

    上面既有討論看一看。

    看完以後,想像你跟朋友對話所需的時間,跟你腦袋的反應速度,你會想起,你在跟人講電話時,腦袋可以處理很多東西,但是對方話還沒講完,你也不知道他要講到何時才輪到你講。

    SerialPort / Socket 在這方面都一樣,電腦速度就跟你思考速度一樣快,傳輸速度就跟你講話速度差不多,而講話的內容是語言。

    在你確認他用甚麼語言之前,不要用腦袋翻譯,把整句話記下來,然後再決定要不要翻譯。這就是要你別用字串收的原因。

    你覺得用 ReadExisting 就夠了,這表示先前貼給你看的相關既有討論,你沒用心在看,否則不會有這問題。

    你覺得夠了,那就夠了。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年11月2日 下午 04:08
  • 我知道傳跟送兩方Encoding不同,得到的結果會是錯誤的。

    可既然Encoding相同,那用ReadExisting還有其他風險嗎?

    或者用Byte讀,然後再做casting,會比較可靠或更有效率?

    你上次貼的serialport & MemoryStream,我確實沒看懂跟我的問題有什麼關聯。

    2012年11月3日 上午 03:54

  • 關於List我是在拜讀 Bill Chung的系列文章後才開始使用的,我不太清楚List有哪些風險嚴重到我應該放棄使用它。



    這我得解釋一下, 我用的是 List(of Byte())

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年11月3日 上午 04:07
    版主
  • .Net framework 字串只允許 Unicode ,所有非 Unicode 都必須以 Byte() 存在。

    所以跟你兩邊的 Encoding 無關。

    這樣說吧,當你把字串做 Encoding 後,就只能是 byte() 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年11月3日 下午 01:24
  • 不要把 .Net 內的 字串 當成跟 VB6 或 VC 是相同的東西,.Net 內的字串檢查規則很嚴,有些可以用 WideChar 轉的,在 Encoding 未必能轉。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年11月3日 下午 01:26
  • 我查了一下,MSDN裡serialport的Encoding預設是ASCII,這是不是代表我可以不用考慮Encoding?

    2012年11月3日 下午 02:21
  • 所以我說,你覺得夠了,那就夠了。

    大家沒時間陪你玩腦筋急轉彎。

    1. .Net 預設的是 Default ,而非 ASCII ,也就是同地區語言選項。

    你如果把 Default 當成 ASCII 看,就是拿 VB6 / VC 的角度去看,對 .Net 來說,Default 跟 ASCII 是不同的。所以一開始我就說,如果你沒有足夠了解 Encoding ,請使用 byte[]

    2. 前面一直強調,.Net 只接受字串為 Unicode ,那麼你有想過,Encoding 的預設值用在哪嗎?在 .Net 的記憶體中,不會有字串的編碼是 ASCII 或 Default ,字串一律是 Unicode 。

    3. 電腦的基礎是位元,最小計量單位是位元組,因此用位元組永遠比任何數值或字串型別更保險,因為可能在你沒想到的地方,你會碰上自動轉型,然後內容就因為是亂碼被捨去了。

    所以檔案存取、SerialPort、Socket 的預設單位都是 byte 而非 char 。byte 是給電腦看的,char 是給人類看的。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年11月3日 下午 03:35
  • 1. http://msdn.microsoft.com/zh-tw/library/system.io.ports.serialport.encoding%28v=vs.80%29.aspx

    2. http://msdn.microsoft.com/zh-tw/library/cc488003%28v=vs.90%29.aspx

    在不改serialport Encoding情況下,ReadByte跟ReadChar效果是一樣的。

    ReadExisting可不可靠?至少在我使用的過程中,跟其它Read Function達成的結果相同,而它更好用一些。

    你一直在說要用Byte收、要考慮Encoding,這些我都試過了,沒用就是沒用。

    如果沒有其它意見就不用再浪費彼此的時間了。


    • 已編輯 juhhny 2012年11月5日 上午 10:47
    2012年11月5日 上午 10:13
  • byte 顧名思義,每次一個 byte

    Char ,請問你知道是幾個 Byte 嗎? Unicode 2.0 以前的字碼,包含英數,是 2 bytes ,Unicode 3.1 是 3 bytes ,Unicode 5.x 是 4 bytes 。

    你能判斷你現在讀掉幾個 byte ?

    你有沒有想過,傳送都用 byte() ,你這邊只有接收,是不是傳的時候,就因為送字串造成 Encoding 掉碼?傳的時候就不對?

    一開始就給你 FAQ 連結,關鍵字是 SerialPort MemoryStream ,裡面程式碼你到底有沒有看過?裡面有有人討論到檔案傳輸,你看過嗎?大家都是用 SerialPort.Read 一次把 Buffer 區讀掉,你看過嗎?為什麼大家都可以?

    你的問題在於你根本不想接受別人的意見,你就是硬要 ReadExisting ,但是你又不懂 .Net 的字串處理行為。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年11月6日 下午 03:50
  • 我說的是回傳值為int的ReadByte跟ReadChar,至於Read我確實不清楚。

    如果傳送程式不正確或者Encoding會影響到我的程式,那為什麼我的無Sleep的DoReceive可以正確接收,會掉碼的程式在IPC上就不會掉碼?

    不過我還是修改成如下文來測試

                System.IO.StreamReader sr = new System.IO.StreamReader("test3.txt");
                int no = 1;
                while (flag)
                {
                    if (sr.EndOfStream)
                    { sr.Close(); sr = new System.IO.StreamReader("test3.txt"); }
                    string str=sr.ReadLine()+"\r\n";
                    byte[] byte_uni=Encoding.Unicode.GetBytes(str);
                    byte[] byte_ascii = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, byte_uni);
                    serialPort1.Write(byte_ascii, 0, byte_ascii.Length);
                    richTextBox1.AppendText((no++).ToString()+" : "+str);
                    Application.DoEvents();
                    System.Threading.Thread.Sleep(25);
                }
    結果仍然會掉碼。

    為了驗證你說的大家都可以,我試了Bill Chung的Serial Port 系列(11) 基本篇 -- 利用執行緒讀取資料

    http://www.dotblogs.com.tw/billchung/archive/2012/02/01/67312.aspx

    原文如下

    private void DoReceive()
    {
        Byte[] buffer = new Byte[1024];
        while (receiving)
        {
            if (comport.BytesToRead > 0)
            {
                Int32 length = comport.Read(buffer, 0, buffer.Length);
                Array.Resize(ref buffer, length);
                Display d = new Display(DisplayText);
                this.Invoke(d, new Object[] { buffer });
                Array.Resize(ref buffer, 1024);
            }
            Thread.Sleep(16);
        }
    }

    經我修改後如下,應該仍符合你的要求,且不偏離原文本意

            void doReceive()
            {
                Byte[] buffer = new Byte[1024];
                while (true)
                {
                    if (serialPort1.BytesToRead > 0)
                    {
                        Int32 length = serialPort1.Read(buffer, 0, buffer.Length);
                        Array.Resize(ref buffer, length);
                        byte_buf.Add(buffer);//List.Add
                        Array.Resize(ref buffer, 1024);
                        //在Timer中作如下Encoding轉換
                        //byte[] byte_uni=Encoding.Convert(Encoding.ASCII,Encoding.Unicode,byte_ascii);
                        //frag = Encoding.Unicode.GetString(byte_uni);
                    }
                    Thread.Sleep(1);
                }

    仍然會掉碼。

    上面說的測試正確狀況,都是用ReadExinting。

    ReadExinting是我比較常用的測試方法,其它的Read function我也測試過。

    最後,沒有用的意見,我就算想接受也沒辦法。

    2012年11月7日 上午 09:48
  • 有一個地方是 Thread.Sleep(1) 在大部份的情況下和你想的不一樣, 以 Windows 7 來說, 預設的時間解析度是 15.6 ms , 所以當你 Sleep(1), 它依然至少會停留 15.6 ms

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年11月7日 上午 10:19
    版主
  • 這個我了解,因為我猜測是Thread睡過久,導致資料遺失,所以採取Sleep(1),希望盡可能縮短Sleep時間。

    我也有試過用winmm的timeBeginPeriod來提升精度,用StopWatch來看確實是睡1ms,不過仍然會掉碼。

    另外我觀察到,除去我發送信息時的delay時間,每次Read function的間隔為2ms並收到8Bytes,包括DataReceive事件。

    而掉碼發生在間隔超過3ms以上,並收到16Bytes。

    Overrun一定會導致上述狀況,但是有上述狀況不一定會Overrun,也不一定會掉碼。

    而無Sleep的doReceive則都是穩定的2ms。

    2012年11月7日 上午 11:11
  • WinNT 預設是 10 ms ,不是 15.6 ms ~

    ASUS 主機板可以做 1 ms ,技嘉、MSI 都是 10 ms 。

    工業電腦跟一般電腦的差異,主要是 CPU 多半是省電型,例如 Atom ,所以速度有限。我辦公室裡面兩個人,今天下班時,有 10 台工業電腦、3 台 eBox、2 台 特製 Embedded OS 、三台 NB ,電腦來來去去,經常性存取 Modbus RTU/TCP 、走馬燈、各種自訂通訊協定,目前有家自訂通訊協定跟該廠商提供的 Protocol 不一致,跟廠商確認中。

    說這些是告訴你,我是靠通訊吃飯的。

    而你的程式碼中,若是有中文,或是特殊符號,超過傳統的 ASCII 128 以上,你有這行就是亂碼源,或是造成掉碼的依據,所以我說你不懂 .Net 的 Encoding,會有這種寫法,就是把 .Net 當成 VB6 / VS6 以前的方式去寫:

    byte[] byte_ascii = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, byte_uni);
                    serialPort1
    .Write(byte_ascii, 0, byte_ascii.Length);


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年11月7日 下午 02:39
  • 我的習慣是不管甚麼檔案都當成 binary 來傳輸,就一定不會有問題。

    所以傳輸過程中,根本不會用到字串暫存。

    除非是檔名的傳遞,檔名傳遞只要用 Unicode.GetBytes 即可拿來傳,避免日韓簡罕出問題。

    若必要時就壓縮、加密。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年11月7日 下午 02:43
  • 我的測試資料是固定的,內容都是ASCII。

    我不太了解你的意思,是要我用Unicode Encoding來傳收?

    我用Unicode的測試結果還是會掉碼,而且會有亂碼情形。

    2012年11月8日 上午 10:04
  • 在 .Net 中, Unicode 的 Char 範圍是 0 ~ 65535,擴展碼先不管。

    ASCII 是 0 ~ 127 ,對 .Net 來說,ASCII 不等同於 Big5 ,big5 允許大於 127。

    .Net 使用內建 Mapping 字碼頁,例如安裝 Unicode 補完計畫後,系統字碼頁增加日韓簡罕,API WideCharToMultiByte 可以轉換日韓簡罕到 big5 ,但是 Encoding.Convert 就不行。

    對於沒澈底玩過 Encoding 的人來說,會被 Encoding 功能迷惑。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年11月8日 下午 03:23