我很抱歉要问这样的问题,但是我在使用.NET的
我的第一种方法:
所以这里有一个显而易见的问题:我正在调用
现在,SerialPort.Read()的文档甚至没有说明它是否推进了流的当前位置(真的吗?),但我已经找到其他来源声称它会这样做(这是有道理的)。然而,如果我不调用
所以......我真的不喜欢这个接口。如果我必须在单独的线程上处理每个缓冲区,我会这样做,但这会带来自己的一系列问题,我希望我错过了什么,因为我对这个接口没有太多的经验。
SerialPort
类可靠地读取串口数据方面遇到了困难。我的第一种方法:
static void Main(string[] args)
{
_port = new SerialPort
{
PortName = portName,
BaudRate = 57600,
DataBits = 8,
Parity = Parity.None,
StopBits = StopBits.One,
RtsEnable = true,
DtrEnable = false,
WriteBufferSize = 2048,
ReadBufferSize = 2048,
ReceivedBytesThreshold = 1,
ReadTimeout = 5000,
};
_port.DataReceived += _port_DataReceived;
_port.Open();
// whatever
}
private void _port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
var buf = new byte[_port.BytesToRead];
var bytesRead = _port.Read(buf, 0, buf.Length);
_port.DiscardInBuffer();
for (int i = 0; i < bytesRead; ++i)
{
// read each byte, look for start/end values,
// signal complete packet event if/when end is found
}
}
所以这里有一个显而易见的问题:我正在调用
DiscardInBuffer
,因此在事件被触发后进入的任何数据都会被丢弃,即我正在丢失数据。现在,SerialPort.Read()的文档甚至没有说明它是否推进了流的当前位置(真的吗?),但我已经找到其他来源声称它会这样做(这是有道理的)。然而,如果我不调用
DiscardInBuffer
,我最终会出现RXOver
错误,即我处理每条消息的时间太长,缓冲区溢出了。所以......我真的不喜欢这个接口。如果我必须在单独的线程上处理每个缓冲区,我会这样做,但这会带来自己的一系列问题,我希望我错过了什么,因为我对这个接口没有太多的经验。
Read()
是否会推进位置,因为串口是不可寻址的——它甚至没有位置。(缓冲区也是FIFO,没有为随机访问做任何准备) - Ben Voigt