作者leicheong (睡魔)
看板C_Sharp
標題Re: [問題] 幾個有關serial port的問題.
時間Tue Jan 19 23:03:55 2010
※ 引述《liaommx (Orz)》之銘言:
: 網路上找了很多資料,
: 都是寫入的比較多,
: 讀取的比較少.
: 寫入的比較簡單,
: 先加一個
: using System.IO.Ports;
: 然後後面要列出所有電腦上的com port
: this.comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
: 這樣一個指令就可以打發,
: 然後設定一個serialport port,
: SerialPort port = new SerialPort(
: "COM1", 9600, Parity.None, 8, StopBits.One);
: 用port.write(string)
: 這樣就可以寫入,
: 若是要寫入byte,
: port.Write(new byte[] { 0x31, 0xE2, 0xFF }, 0, 3);
: 這樣就可以.
: 但是要讀取的話,比較困難..
: 這也是我這篇問題比較主要的地方.
: 我原本想說也利用
: serialport port_open
: 這樣一個指令,去開啟serialport
: (PS:讀取的port和上面寫入的port不同
: 因為打算做兩件不同的事情.
: 一個是寫入裝置,另一個是從無線裝置讀取剛剛寫入的資料,並確認是否正確)
: 因為讀取的資料還不確定是byte coding (HEX)或是ASCII coding.
: 所以這邊還不敢肯定要用readbyte還是readline比較適合
用ReadBytes()讀入再經System.Text.Encoding那些class轉換就可以了.
沒有衝突的. :P
介面的話像一般Hex Editor用左邊Hex加右邊Text的方式處理就好.
灌DataTable放Grid簡單明瞭.
: 這邊就暫時略過不談,
: 但是read的問題滿大的.
: 我是應該用timer去定時抓取資料呢,
: 還是該用thread搭配while去一直撈資料呢..
: 有沒有人可以給一點意見?
SerialPort class有DataReceived這event的.
: 這個邏輯沒什麼問題,
: 可是我想要讓撈完資料之後能跳出個視窗定住,
: 讓使用者確認剛剛撈到的資料和寫入資料是同樣的內容.
讓EventHandler在這段時間把data存到buffer裡就可以了.
確認內容把兩邊都加上行號就足夠了?
: 這讓我苦惱了很久,
: 該用什麼方法比較直覺...
: 另外,com port建立連線的時候.
: 是不是可以在同樣的com port讀取和寫入?
Serial Port是Half Duplex的. 因此無法同時讀取/寫入.
讀取/寫入的時機大多是看Handshake是用DTR/DSR或RTS/CTS吧.
: 有沒有可以參考的內容?
: 找了MSDN和codeproject都沒有比較好的說明.
: 下面附上port_open.read while和timer不同的想法
CodeProject中那C++的Serial Library是很好的參考.
http://www.codeproject.com/KB/system/serial.aspx
說明的用語不論是在用甚麼programming language都是通用的.
瞭解基礎知識後可以更明白的正確的Serial communication
使用方式了.
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.92.89.78
推 windsheep:SerialPort是Half或Full Duplex要看是RS-232/422 or 485 01/20 08:22
→ windsheep:要是是RS485的話,它是Half Duplex,這時就要小心處理讀寫 01/20 08:23
→ takashi737:判斷完後將buffer清除,等待新事件發生繼續處理! 01/25 16:47