作者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
1F:推 windsheep:SerialPort是Half或Full Duplex要看是RS-232/422 or 485 01/20 08:22
2F:→ windsheep:要是是RS485的话,它是Half Duplex,这时就要小心处理读写 01/20 08:23
3F:→ takashi737:判断完後将buffer清除,等待新事件发生继续处理! 01/25 16:47