c# - 需要 .NET 串行端口帮助,主要是在多个 "packets"中接收到的数据

标签 c# .net serial-port

我对通过 .net 通过串行端口发送数据还很陌生,我注意到在实现 TCP 对应物后,使用串行端口我不会那么容易!

因此,从头开始,我的串行双向通信实现几乎已经完成,我只是在一些事情上遇到了困难:-

  1. 我的读取被分成多条消息或通过 COM 端口作为碎片响应接收,我不知道我可能需要什么设置,或者我应该如何以不同的方式编写代码来解决这个问题。什么会导致这个?我正在 SerialPort_DataReceived.
  2. 的断点处检查消息

基本上数据应该发送为:

01: LS|DA090521|TI111043|q
02: PS|RN102|PTC|TA1040000|P#0|DA090521|TI111429|j

但它正在被拆分(在每个请求的读取的随机位置)

01: LS|DA090521|TI111
02: 043|q
03: PS|RN102|PTC|TA1
04: 0000|P#0|DA090521|TI111429|j

- 问题 1 已得到解答,感谢 Chris W. 和其他人!我现在有了我希望逐步从片段构建的消息(寻找 STX、{msg body}、ETX),然后在消息完全构建时执行一个操作,并使用线程安全队列让它运行,非常高兴.

. 2. 我收到一个“|”符号几乎在每个周期都通过我的阅读,这是由于我以某种方式错误设置的命令,串行通信的产物,还是设备发送给我的东西? (不过我不这么认为,因为 super 终端连接显示这个字符没有被连续发送。)

. 3. 你能确认我在各自的方法中正确地读写数据吗?

也感谢大家看我的另外两个问题。

相关代码如下:

...
    //                          COM3,    9600,     None,   8,        One
    SerialPort = new SerialPort(comPort, baudRate, parity, dataBits, stopBits);
    if (SerialPort.IsOpen) SerialPort.Close();
    // SerialPort.RtsEnable = true; // Request-to-send
    // SerialPort.DtrEnable = true; // Data-terminal-ready
    SerialPort.ReadTimeout = 150; // tried this, but didn't help
    SerialPort.WriteTimeout = 150; // tried this, but didn't help
    SerialPort.Open();

    SerialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
}

void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Process received data
    SerialPort sp = (SerialPort)sender;
    byte[] buffer = new byte[sp.BytesToRead];
    int bytesRead = sp.Read(buffer, 0, buffer.Length);

    // message has successfully been received
    message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
}

public bool SendMessage(string text)
{
    // Only send message if a client is connected
    if (SerialPort != null && SerialPort.IsOpen)
    {
        byte[] buffer = Encoding.ASCII.GetBytes(text);
        SerialPort.Write(buffer, 0, buffer.Length);
    }
}

最佳答案

My reads are being split across multiple messages

这是正常的、预期的、不可避免的行为。它也可能发生在 data-over-TCP 上。对于串行接口(interface),它只是无穷无尽的字节流。您的应用程序有责任将这些字节重新打包成数据包。

如果数据包边界的位置很重要,并且如果您无法通过查看接收到的数据来判断数据包边界应该在哪里,那么您可能需要重新考虑数据的格式,以便您可以告诉数据包边界在哪里。

I am receiving a "|" symbol through my read nearly every cycle

那个字符的十六进制值是多少?查看是否将 Handshake 属性设置为 XOnXOffRequestToSendXOnXOff 可以改善这种情况。

关于c# - 需要 .NET 串行端口帮助,主要是在多个 "packets"中接收到的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/891475/

相关文章:

c# - System.Object 的 BaseType 应该和接口(interface)一样吗?

c# - SmsMessage不是线程安全的吗?

c# - ocelot api网关中的System.InvalidOperationException

c++ - QSerialPort 读取字符串

linux - 如何在 Linux 上为串口设备设置非标准波特率?

java - 将 java 翻译成 c#

C# 6.0 列表出现语法错误, ' , '

c# - 将字符串解析为 float C#

java - 有状态 Java Web 服务和 .NET 客户端

c# - POS协议(protocol)串口通讯