gpt4 book ai didi

c# - SerialPort 类和 DataReceived 事件...获取字节。使用 ReadLine 还是 ReadExisting?有什么例子吗?

转载 作者:太空宇宙 更新时间:2023-11-03 14:25:25 24 4
gpt4 key购买 nike

我想通过串口发送和接收字节。我的接收器应该异步获取字节。我在下面写了一个看起来可行的小例子,但它给我留下了一种不安的感觉。

  1. 我真的应该使用 WriteLine、ReadLine 吗?正如现在所写的那样,是否有可能为每个字节调用事件处理程序 m_port_DataReceived 中的代码?那是我对事件“DataReceived”的理解;也许我错了。 ReadLine 是否会阻塞直到它看到行尾字符?

  2. 我是否应该以某种方式在事件处理程序中使用“if (e.EventType == SerialData.Eof)”结构?你可以看到我已经把它注释掉了。我试过了,但无法让它工作。人们什么时候会期待 SerialData.Eof?我的想法是,在调用“ReadExisting”之前,我可以等待所有字节都存在。但是,“if”语句从未评估为真。强制代码转到 ReadExisting 确实正确读取了所有字节。

  3. 一般来说,设置我的代码以接收来自串行端口的字节的最佳方法是什么?发件人将每 125 毫秒发送一小段字节,但不会发送特殊字符。字节数据包在时间上间隔开,所以我认为将数据包混合在一起不会有问题。更多的问题是,“一旦你看到一个字节,就去读所有的东西,只要你等待很短的时间,你就会得到所有的东西”。鉴于这种情况,是否有首选方法?

提前致谢,戴夫

public class SerialPortController
{
SerialPort m_port;

public SerialPortController(bool server)
{


if (server)
{
m_port = new SerialPort("COM4");
m_port.BaudRate = 115200;
m_port.Open();
byte[] sillyBytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
ASCIIEncoding encoding = new ASCIIEncoding();
string output_string = encoding.GetString(sillyBytes);
m_port.WriteLine(output_string);
//m_port.Write(sillyBytes, 0, 8);
}
else
{
m_port = new SerialPort("COM5");
m_port.DataReceived += new SerialDataReceivedEventHandler(m_port_DataReceived);
m_port.BaudRate = 115200;
m_port.Open();
}
int character = Console.Read();
}

void m_port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//if (e.EventType == SerialData.Eof)
{
// string answer = m_port.ReadExisting();
string answer = m_port.ReadLine();
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte_answer = encoding.GetBytes(answer);

}
}
}

最佳答案

MSDN 有一个例子这显示了这个的简单用法。

并且它使用 ReadExisting 而不是 ReadLine。

同样来自文档:

The DataReceived event is not guaranteed to be raised for every byte received. Use the BytesToRead property to determine how much data is left to be read in the buffer.

private static void DataReceviedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}

关于c# - SerialPort 类和 DataReceived 事件...获取字节。使用 ReadLine 还是 ReadExisting?有什么例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4232355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com