none
serialport 接收資料部完整 問題 RRS feed

  • 一般討論

  • 各位前輩好

    我寫了一個資料接收的介面

    利用serialPort_DataReceived來接收字串

    正常會接收到的資料為

    !0128,0025,0002,0003,-002,0003,-002,0005,-005,0002,-002,0003,0249,-030,-648$
    但有時候資料會不見變成

    0003,-002,0003,-002,0005,-005,0002,-002,0003,0249,-030,-648$

    -002,0005,-005,0002,-002,0003,0249,-030,-648$

    -002,0003,0249,-030,-648$

    類似這樣的情況

    下面為我的程式碼

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.IO.Ports;
    
    namespace _5555555555
    {
        public partial class Form1 : Form
        {
            public static System.IO.Ports.SerialPort serialPort1;
            public delegate void SetTextCallback(String message);
    
            public Form1()
            {
                InitializeComponent();
            }
            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                try
                {
                    string carray = serialPort1.ReadExisting();
    	            SetText(carray);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("\n{0}\n", ex.ToString());
                }
            }
            private void btnConnect_Click(object sender, EventArgs e)
            {
                System.ComponentModel.IContainer components = new System.ComponentModel.Container();
                serialPort1 = new System.IO.Ports.SerialPort(components); 
                serialPort1.PortName = "COM" + numCom.Value.ToString(); 
                serialPort1.BaudRate = 115200; 
                serialPort1.DtrEnable = true; 
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                serialPort1.Open(); 
                btnConnect.Text = "Connected.";
                btnConnect.Enabled = false;
                numCom.Enabled = false;
                
            }
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                serialPort1.Close();
            }
            private void SetText(string message)
            {
                try
                {
                    if (txtTemp.InvokeRequired)
                    {
                        SetTextCallback del = new SetTextCallback(SetText);
                        this.Invoke(del, message);
                    }
                    else
                    {
                        txtTemp.Text = message;
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
    }

    請問各位前輩

    我的程式問題出在哪

    導致所接收的資料會不完整?

    感謝

    2012年12月27日 上午 06:19

所有回覆

  • 用 read 先看讀到的 byte 數, 或是用 encoding 的 getbytecount 檢查你讀到的 string,

    會不會是字串裡頭有 '\0',

    例如:

    第一次收到 !0128,0025,0002,0003,-002,0003,-002,0005,-005,0002,-002,0003,0249,-030,-648$\0!0128,0025,0002,

    第二次收到 0003,-002,0003,-002,0005,-005,0002,-002,0003,0249,-030,-648$\0!0128,0025,0002,0003,-002,0003,

    第三次收到 -002,0005,-005,0002,-002,0003,0249,-030,-648$\0!0128,0025,0002,0003,-002,0003,-002,0005,-005,0002,

    這樣就有可能造成掉資料的錯覺...

    2012年12月27日 下午 12:01
  • 海角點部落-Serial port 系列


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

    2012年12月27日 下午 12:44
    版主
  • LonghairPan大你好

    請問要怎麼用read或encoding 的 getbytecount 來檢查?

    是否有範例?

    還有為什麼我傳送字串沒'\0'

    接收會收到'\0'?

    感謝

    2012年12月27日 下午 02:24
  • FAQ

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


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


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

    2012年12月27日 下午 03:09
  • 你好,

    \0 只是猜測, 如果你發送端用 writeline , 預設是會補個 \n, 但在 textbox 上 \n 會看到空白,

    不致於看不到後面的資料,

    read 就是用 serialport 的 read , 把 data 讀進 byte array , 其實主要是檢查 serialport.bytestoread 的加總, 跟你送出去的 bytes 數比較,

    或是你用 readexisting 讀回來的字串, 用 serialport.encoding.getbytecount 可以檢查 byte 數,

    方便把發送端的 code 一起貼上來嗎?

    2012年12月28日 上午 01:42
  • LonghairPan大

    我發送端是用微控制器的程式 寫一個字串發送到電腦的

    你要看微控制器的程式嗎?


    2012年12月28日 上午 08:11
  • 微控制器的程式, 我不一定能看懂, 

    但如果發送的部份程式碼不會太長, 我是覺得可以貼上來,

    我看不懂, 也有別人看得懂的....

    愈清楚完整的資訊, 可以提高你的問題被解決的機會,

    前面提及的 byte 數有 check 過了嗎? 我還是覺得看這個最準,

    畢竟 string 是個很博大精深的東西....

    此外, 前面有不少文章也有類似情況, 心冷大大貼的 link 你可以去看看

    2012年12月28日 上午 09:53
  • 這樣說吧,你事件中:

    DataReceived

    事件預設是收到資料開始觸發(除非你有動收到位元組數那個屬性),到你開始處理時,又多收到一點。

    但是你如何知道這一點是已經完成傳輸,還是傳輸過程中而已?

    所以把連結看一看,不然根本就懶得說重複的話。


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


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

    2012年12月28日 下午 04:38