C# .NET SerialPort在115200 bps时可靠吗?

C# .NET SerialPort在115200 bps时可靠吗?,c#,.net,serial-port,C#,.net,Serial Port,我需要以115200 bps的速度通过RS232连接设备。距离很短(不到一米)。没有硬件或软件握手。交换的消息也很短:10-50字节。消息交换的频率-最大每秒10次 我曾经在C/C++中使用相应的WinAPI可靠地处理此类环境中的通信。不过,这次我想在.NET/C#中完成 不久前,我看到一篇关于.NET串行端口的文章。据我回忆,作者不建议使用SerialPortclass。相反,他选择了托管代码中的非托管WinAPI。我不确定这篇文章是否提到.NET1.1 有人知道使用SerialPort进行管

我需要以115200 bps的速度通过RS232连接设备。距离很短(不到一米)。没有硬件或软件握手。交换的消息也很短:10-50字节。消息交换的频率-最大每秒10次

我曾经在C/C++中使用相应的WinAPI可靠地处理此类环境中的通信。不过,这次我想在.NET/C#中完成

不久前,我看到一篇关于.NET串行端口的文章。据我回忆,作者不建议使用
SerialPort
class。相反,他选择了托管代码中的非托管WinAPI。我不确定这篇文章是否提到.NET1.1


有人知道使用
SerialPort进行管理是否安全吗?

SerialPort工作正常。可以说,它本可以实现得更好,但对于现代PC来说,每秒10条消息,每条消息50字节,每115k,是一个微不足道的工作量(为了进行比较,请记住PC能够从10Gigabit以太网链路接收数据)。在引擎盖下,操作系统/驱动程序缓冲数据,因此无论你从C++还是C语言读取缓冲区都不会产生很大的差异。 SerialPort与USB串行端口不兼容。。。。但那是因为USB是出了名的不可靠。插入PCI串行卡或通过以太网连接到终端服务器,SerialPort工作正常。从C++程序中使用USB到RS23 2转换器,并返回故障。得出你自己的结论

我们运行的系统有18个串行端口,以不同的速度运行(有几个是115k和10hz,数据包有几百个字节),而且串行端口从未出现过任何问题(只有USB到RS232转换器!)


试试看。。。原型制作不需要很长时间…

串行端口工作正常。可以说,它本可以实现得更好,但对于现代PC来说,每秒10条消息,每条消息50字节,每115k,是一个微不足道的工作量(为了进行比较,请记住PC能够从10Gigabit以太网链路接收数据)。在引擎盖下,操作系统/驱动程序缓冲数据,因此无论你从C++还是C语言读取缓冲区都不会产生很大的差异。 SerialPort与USB串行端口不兼容。。。。但那是因为USB是出了名的不可靠。插入PCI串行卡或通过以太网连接到终端服务器,SerialPort工作正常。从C++程序中使用USB到RS23 2转换器,并返回故障。得出你自己的结论

我们运行的系统有18个串行端口,以不同的速度运行(有几个是115k和10hz,数据包有几百个字节),而且串行端口从未出现过任何问题(只有USB到RS232转换器!)


试试看。。。原型制作不需要很长时间…

值得注意的是,这里的重点不是代码或计算机是否可以以115kbps的速度工作,而是您的电缆、串行硬件、外部设备和环境是否可以以这些速度工作


如果你在一个电力安静的地方,有良好的屏蔽电缆在短时间内运行,那么你可能很好。如果你在高功率的工业机器附近工作,这些机器会产生大量的电气噪音,并且有劣质的电缆,那么你肯定不会没事。我肯定在高速RS-232通信的电气噪音工业环境中遇到过问题。在这些情况下,有必要使用高质量电缆并降低传输速率,直到通信变得稳定和无差错。如果这是一个问题,除了亲自测试并查看之外,别无选择。

值得注意的是,这里的重点不是代码或计算机是否可以以115kbps的速度工作,而是您的电缆、串行硬件、外部设备和环境是否可以以这些速度工作


如果你在一个电力安静的地方,有良好的屏蔽电缆在短时间内运行,那么你可能很好。如果你在高功率的工业机器附近工作,这些机器会产生大量的电气噪音,并且有劣质的电缆,那么你肯定不会没事。我肯定在高速RS-232通信的电气噪音工业环境中遇到过问题。在这些情况下,有必要使用高质量电缆并降低传输速率,直到通信变得稳定和无差错。如果这是一个问题,那么除了亲自测试并查看之外,别无选择。

你不能试试吗?我认为协议必须包含某种校验和/验证消息的方法。只需让它继续运行,并检查您收到了多少丢弃的消息。我无法想象可靠性会受到开发平台选择的影响。鉴于.Net可靠地为其他形式的IO提供高出1000倍的带宽,我敢说任何可靠性问题都是由其他因素引起的。只需挂接到
SerialPort.BaseStream
并像其他流一样读取它。这是一条走得很好的道路,不太可能出错。
SerialPort
是一个巨大的痛苦(特别是对于USB/串行适配器),但我不认为速度是问题之一。是的,我确实在一个设备上尝试过,并注意到使用非托管C/C++代码会降低失败率(例如,由于NAKs或设备没有回复而重试)远低于使用SerialPort的类似托管代码中的值。我可能会在托管代码和设备之间放置一个嗅探器,以查看是否按照预期向设备发送消息和从设备接收消息。尽管如此,我还是想知道是否有人遇到了.net特定的限制。您也在非托管程序中使用的。它当然不会添加任何数据损坏模式。当出现问题时,你不能也不应该忽略例外情况。这当然会发生,尤其是USB emula