- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想通过串口发送和接收字节。我的接收器应该异步获取字节。我在下面写了一个看起来可行的小例子,但它给我留下了一种不安的感觉。
我真的应该使用 WriteLine、ReadLine 吗?正如现在所写的那样,是否有可能为每个字节调用事件处理程序 m_port_DataReceived 中的代码?那是我对事件“DataReceived”的理解;也许我错了。 ReadLine 是否会阻塞直到它看到行尾字符?
我是否应该以某种方式在事件处理程序中使用“if (e.EventType == SerialData.Eof)”结构?你可以看到我已经把它注释掉了。我试过了,但无法让它工作。人们什么时候会期待 SerialData.Eof?我的想法是,在调用“ReadExisting”之前,我可以等待所有字节都存在。但是,“if”语句从未评估为真。强制代码转到 ReadExisting 确实正确读取了所有字节。
一般来说,设置我的代码以接收来自串行端口的字节的最佳方法是什么?发件人将每 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/
我正在使用 Twisted 从套接字接收数据。我的协议(protocol)类继承自协议(protocol)。 由于Python 2.*中没有byte类型,所以接收到的数据类型是str。当然, len
我正在使用串行端口与设备通信。该设备具有 RS-485,另一侧(PC)是 RS-232(虚拟端口)。设备正常工作、发送和接收数据。 问题是,有时不会触发 DataReceived 事件。我使用 Sys
我有一个 WPF 测试应用程序,用于评估基于事件的串行端口通信(与轮询串行端口)。问题是 DataReceived 事件似乎根本没有触发。 我有一个非常基本的 WPF 表单,其中包含用于用户输入的 T
我一直在编写一个概念验证类型的程序,该程序通过网络发送屏幕截图,并且由于某种原因,发送数据后没有调用 dataRecieved 方法。这是我的代码 服务器 from twisted.internet
根据 DataReceived 事件的 MSDN,它说 The DataReceived event is raised on a secondary thread when data is rece
我正在尝试使用 Twisted 框架编写服务器并希望多次接收数据 class Echo(Protocol): def connectionMade(self): print "
我正在使用 protocol.Protocol 从服务器接收数据。如下 from twisted.internet.protocol import Protocol, Factory class My
我正在使用 visual C# 2010 windows 窗体应用程序串口 对象在串行端口上接收十六进制数据字节。 但是,我意识到我的 DataReceived 事件被触发了两次,即使我已经读取了缓冲
我正在 PC 和嵌入式设备之间实现串行协议(protocol)。 我正在将文件内容从 PC 分块发送到设备。 在我开始发送文件之前,我会发送文件的名称和大小,然后等待来自设备的 ACK,然后开始循环发
我有一个 Visual Studio 2008 C# .net 2.0 CF 应用程序,它使用 System.IO.Ports.SerialPort 类从串行端口读取数据。不幸的是,SerialDat
我目前正在使用一种称为 Fluke 5500A 多产品校准设备的设备。我用 C# 编写了一个小程序来与它交互并了解有关它如何工作的更多信息,但不幸的是 SerialPort.DataReceived
我目前正在研究一个完全用 c# 编写的防盗报警解决方案。该程序与基于 USB 串行端口的 IO 板通信,该 IO 板具有硬连线到其中的警报传感器。我遇到了一个问题,即 DataReceived 事件无
假设只要有 100 个字节可用,我就从 SerialPort 读取数据,否则什么也不做。这意味着,串行端口缓冲区中的剩余数据仍然可用。此读取是在 DataReceived 的事件处理程序内完成的。 现
我正在尝试学习 python 扭曲的互联网框架,但有一件事让我感到困惑。使用 telnet 进行的初始测试表明,只要接收到数据,就会调用 protocol.Protocol.dataReceived(
我在 VS2008 express 中设置了一个 SerialDataReceivedEventHandler,其中包含一个基于表单的程序。我的串口设置如下: 115200, 8N1 启用 Dtr 和
我正在为我的 WPF 应用程序开发串行监视器,使用 C# 编程。我在管理 DataReceived 事件时遇到了麻烦,因为我想要一个实时监视器,例如 HyperTerminal 或 TeraTerm(
我是twisted新手,在dataReceived内调试我的代码时遇到困难。 twisted.internet.protocol.Protocol的方法对象。 给出一些像这样的代码 class Pri
我从 MSDN 文档中了解到,事件 DataReceived 不一定会每字节触发一次。 但是有谁知道导致事件触发的机制到底是什么? 每个字节的接收是否会重新启动一个计时器,该计时器必须在事件触发之前达
我知道 DataReceived event在后台线程上触发。我如何告诉 GUI 线程在事件处理程序中显示数据? 最佳答案 此代码假定您已经添加了一个表单级 SerialPort 对象,并在其 Dat
我正在为 modbus 和串行连接构建一个类库,我需要返回一个字节数组,但是当使用来自 System.IO.Ports 的 DataReceived 事件时,我不能返回任何,因为它的类型是无效的。另外
我是一名优秀的程序员,十分优秀!