.Net SerialPort和VB6 MSComm的工作方式可能不同吗?在这两种情况下,我正在从缓冲区中读取数据,并且如果将MSComm dll导入到我的.Net项目中,它们都得到了不同的字符串,它完美地工作(很明显)。SerialPort与MSComm
有没有人有更深的信息?
如果有帮助,这里是我的简单的样品,在这两种情况下,我发送相同的字节数组...
VB6:
Dim MSComm1 As Object
Dim ArrToSend() As Byte
Dim IncomeData As String
Set MSComm1 = CreateObject("MSCommLib.MSComm")
With MSComm1
.CommPort = 1
.PortOpen = True
End With
ReDim ArrToSend(4)
ArrToSend(0) = 179
ArrToSend(1) = 1
ArrToSend(2) = 92
ArrToSend(3) = 92
MSComm1.Output = ArrToSend
IncomeData = MSComm1.Input
C#
SerialPort _serialPort = new SerialPort();
_serialPort.Open();
Byte[] _bytesToSend = new Byte[4];
_bytesToSend[0] = 179;
_bytesToSend[1] = 1;
_bytesToSend[2] = 92;
_bytesToSend[3] = 92;
_serialPort.Write(_bytesToSend, 0, _bytesToSend.Length);
String ReadExisting = _serialPort.ReadExisting();
这两个字符串有什么区别?您是否检查接收错误(例如奇偶校验错误)?为什么不设置/指定COM端口参数:例如波特率,停止位和奇偶校验? – ChrisW 2011-01-27 17:36:35
我写了很多串口代码,包括native和.NET,而IMO System :: IO :: Ports :: SerialPort和MSCOMM.OCX都是垃圾。他们采用功能强大且功能强大的Win32串行端口API并滥用它,迫使您陷入不良行为。如果你想编写健壮的代码,你必须使用p/invoke(或者我所做的,C++/CLI包装器)。 – 2011-01-27 18:30:03
@Ben Voigt什么是C++/CLI包装,如果没有pinvoke?我认为C++/CLI只是将遗留(非托管)C++移植到.NET中;它是否也有助于以某种方式从托管代码访问非托管API? – ChrisW 2011-01-27 18:45:22