none
關於serialPort元件 ...透過RS232接收的問題.... RRS feed

  • 問題

  • 各位大大好, 小妹我最近初次接觸serialPort元件,要用RS232接收文字,

    電腦的Port是用usb to RS232,

    有問題的情況是,使用"設備1"傳輸...接收的文字沒有前段掉字的情況....

    在使用"設備2"的時候..傳回的文字,前段會一直掉字,導致資料不完全,

    但是"設備2"使用超級終端機接收時,又能收到完整的資料....

    程式碼如下:

           private void button1_Click(object sender, EventArgs e)
            {

                    serialPort1.PortName ="COM3";
                    serialPort1.BaudRate = 9600;
                    serialPort1.DataBits = 7;
                    serialPort1.Handshake = Handshake.XOnXOff;
                    serialPort1.Parity = Parity.Even;
                    serialPort1.StopBits = StopBits.Two;

                if(!serialPort1.IsOpen)
                {
                        serialPort1.Open();
                        button1.Text = "已連線";
                        button1.Enabled = false;
                        button2.Enabled = true;
                        timer1.Start();
                }
            }

       private void timer1_Tick_1(object sender, EventArgs e)
            {
                string a = serialPort1.ReadExisting();
                if (a != "")
                {
                    richTextBox1.AppendText(a);
                }
            }

    也有在想說是否設備2的線材過長,會導致RS232傳輸受到干擾之類的.....?

    麻煩大家了,謝謝.

                    
    2015年7月16日 上午 01:12

解答

  • 如果你用超級終端機不會掉, 通常傳輸干擾的成分就不大了.

    (1) 檢查序列埠的參數設定是否和設備相符, 如 baudrate, databits, stopbits, parity, handshark 等等

    (2) 不要用 Timer, 用執行緒來執行接收

    (3) ReadExisting 很好用, 但實務上不建議使用, 實務上我們都是用 Byte 型別作為基準, 所以不是用 Read, 就是 ReadByte

    (4) 初次接觸前, 你有沒有先讀一些書還是文件先準備好自己才開始寫程式呢 ?

    如果你沒有, 先放下你手邊的程式, 把以下連結的文章從頭到尾讀完搞懂, 再開始寫程式.

    海角點部落 Sreial Port 系列


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


    2015年7月16日 上午 06:20
    版主

所有回覆

  • 能把"正常"和"掉字"兩種狀況收到的資料拿出來看看嗎?

    2015年7月16日 上午 02:50
  • 不知道你送資料那邊的狀況是怎樣?設備1與2送出來的狀況是否一樣?

    但除非速度很慢、資料很少,否則用Timer定時去收不太明智。萬一Timer才剛收完,突然短時間內來了大量資料,那就很有可能會掉資料。

    一般建議用DataReceived事件去收資料

    https://msdn.microsoft.com/zh-tw/library/system.io.ports.serialport.datareceived(v=vs.110).aspx

    用DataReceived事件就是有資料才收,類似中斷。

    用Timer就是polling去看,看了又不一定有資料,有資料快滿的時候又不一定剛好有被看到,資料來的量不穩定時會很沒效率。




    • 已編輯 mosdeo 2015年7月16日 上午 03:45
    2015年7月16日 上午 02:57
  • 如果你用超級終端機不會掉, 通常傳輸干擾的成分就不大了.

    (1) 檢查序列埠的參數設定是否和設備相符, 如 baudrate, databits, stopbits, parity, handshark 等等

    (2) 不要用 Timer, 用執行緒來執行接收

    (3) ReadExisting 很好用, 但實務上不建議使用, 實務上我們都是用 Byte 型別作為基準, 所以不是用 Read, 就是 ReadByte

    (4) 初次接觸前, 你有沒有先讀一些書還是文件先準備好自己才開始寫程式呢 ?

    如果你沒有, 先放下你手邊的程式, 把以下連結的文章從頭到尾讀完搞懂, 再開始寫程式.

    海角點部落 Sreial Port 系列


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


    2015年7月16日 上午 06:20
    版主
  • 我已經改成用DataReceived事件去收資料,

    關於傳輸資料漏字的問題,是設備端的問題....已解決!

    感謝你指點新手...

    2015年7月16日 上午 07:51
  • 查出原因  是設備端送出的問題,

    修改設備端的參數之後 接收已正常不漏字...

    關於使用read接收資料這方面,我會在研究!!

    知道使用ReadExisting可能還會有些狀況  只是目前還沒遇到,

    Bill大大附的連結 對我來說很實用!!

    感謝^^

    2015年7月16日 上午 07:56
  • 不用 ReadExisting 的原因很簡單.

    因為 ReadExisiting 方法的回傳值是 string 型別, 但是在通訊過程所使用的資料未必每個 byte 都是可以轉化成可見的字元.


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

    2015年7月16日 上午 08:59
    版主
  • 通常是因為電腦 CPU 讀取緩衝區速度遠高於 SerialPort 傳輸速度,導致從接收到資料開始讀,一下就沒了,然後以為後面沒有。

    既有相關討論很多:

    https://social.msdn.microsoft.com/Forums/zh-TW/home?sort=relevancedesc&brandIgnore=True&searchTerm=SerialPort+MemoryStream


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2015年7月16日 下午 04:02