我对通过 .net 通过串行端口发送数据还很陌生,我注意到在实现 TCP 对应物后,使用串行端口我不会那么容易!
因此,从头开始,我的串行双向通信实现几乎已经完成,我只是在一些事情上遇到了困难:-
- 我的读取被分成多条消息或通过 COM 端口作为碎片响应接收,我不知道我可能需要什么设置,或者我应该如何以不同的方式编写代码来解决这个问题。什么会导致这个?我正在
SerialPort_DataReceived.
的断点处检查消息
基本上数据应该发送为:
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
属性设置为 XOnXOff
或 RequestToSendXOnXOff
可以改善这种情况。
关于c# - 需要 .NET 串行端口帮助,主要是在多个 "packets"中接收到的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/891475/