Возможно ли, что .Net SerialPort и VB6 MSComm работают разные?SerialPort Vs MSComm
В обоих случаях я читаю данные из буфера, и у меня есть разные строки, если я импортирую dll MSComm в мой проект .Net, он отлично работает (очевидно).
У кого-нибудь есть более глубокая информация?
Если это помогает, вот мои простых образцов, в обоих случаях я отправляю тот же массив байтов ...
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
Я написал много кода последовательного порта, как native, так и .NET, и IMO System :: IO :: Ports :: SerialPort и MSCOMM.OCX - оба мусора. Они используют надежный и мощный API-интерфейс последовательного порта Win32 и злоупотребляют им, что заставляет вас ошибиться. Если вы хотите написать надежный код, вам придется использовать p/invoke (или то, что я сделал, C++/CLI-обертку). –
@Ben Voigt Что такое C++/CLI-обертка, если не pinvoke? Я думал, что C++/CLI предназначен только для переноса старого (неуправляемого) C++ на .NET; это также помогает каким-то образом получить доступ к неуправляемым API-интерфейсам из управляемого кода? – ChrisW