2011-01-27 235 views
2

.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(); 
+3

这两个字符串有什么区别?您是否检查接收错误(例如奇偶校验错误)?为什么不设置/指定COM端口参数:例如波特率,停止位和奇偶校验? – ChrisW 2011-01-27 17:36:35

+0

我写了很多串口代码,包括native和.NET,而IMO System :: IO :: Ports :: SerialPort和MSCOMM.OCX都是垃圾。他们采用功能强大且功能强大的Win32串行端口API并滥用它,迫使您陷入不良行为。如果你想编写健壮的代码,你必须使用p/invoke(或者我所做的,C++/CLI包装器)。 – 2011-01-27 18:30:03

+0

@Ben Voigt什么是C++/CLI包装,如果没有pinvoke?我认为C++/CLI只是将遗留(非托管)C++移植到.NET中;它是否也有助于以某种方式从托管代码访问非托管API? – ChrisW 2011-01-27 18:45:22

回答

1

我期待他们都使用the underlying O/S API;但我想他们可能会以不同的方式使用该API:例如使用不同的默认COM端口参数(如果不明确指定参数)。

另一个区别可能在于:在阅读输入/回复时,您如何知道它是否已发送,您如何知道“读取”或“输入”功能是否在等待足够长的时间?

5

您正在混合字节和字符串。 MSComm对此非常松懈,但SerialPort关心文本编码。显然你使用的是二进制协议,很可能你收到的字符串中包含无法转换为SerialPort.Encoding的字节(默认为ASCII)的问号。您必须使用Read()方法来获取响应。

0

MSComm和Serialport是免费赠品,并没有太多共同之处。一个众所周知的便携式图书馆,可以帮助您免除麻烦,是SuperCom。它提供了兼容MSComm的ActiveX以及一个A NET类库。人们可以使用更合适的那个。它可以与C++,Delphi,VB6,VB网络,C#,FreePascal,Perl,Java等一起使用。它完全兼容32位和64位的Windows, Windows XP,7,8,10。