2011-01-27 4 views
2

Возможно ли, что .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(); 
+3

В чем разница между двумя строками? Проверяете ли вы ошибки приема (например, ошибки четности)? Почему вы не устанавливаете/не указываете параметры COM-порта: например, скорость передачи, стоповые биты и четность? – ChrisW

+0

Я написал много кода последовательного порта, как native, так и .NET, и IMO System :: IO :: Ports :: SerialPort и MSCOMM.OCX - оба мусора. Они используют надежный и мощный API-интерфейс последовательного порта Win32 и злоупотребляют им, что заставляет вас ошибиться. Если вы хотите написать надежный код, вам придется использовать p/invoke (или то, что я сделал, C++/CLI-обертку). –

+0

@Ben Voigt Что такое C++/CLI-обертка, если не pinvoke? Я думал, что C++/CLI предназначен только для переноса старого (неуправляемого) C++ на .NET; это также помогает каким-то образом получить доступ к неуправляемым API-интерфейсам из управляемого кода? – ChrisW

ответ

1

Я ожидаю что оба они используют the underlying O/S API; но я предполагаю, что каждый из них может использовать этот API разными способами: например. с различными параметрами COM-порта по умолчанию (если вы явно не укажете параметры).

Другим отличием может быть время: когда вы читаете ввод/ответ, откуда вы знаете, было ли оно еще отправлено, и откуда вы знаете, ожидает ли функция «читать» или «вводить» достаточно долго ?

+0

Я делаю Thread.Sleep перед чтением, чтобы убедиться, что у меня есть ответ, который у меня есть, но с разными символами ... – Rama

5

Вы смешиваете байты и строки. MSComm был очень слабый, но SerialPort заботится о кодировании текста. Очевидно, что вы используете двоичный протокол, вероятно, ваша полученная строка содержит вопросительные знаки для байтов, которые не могут быть преобразованы в SerialPort.Encoding (по умолчанию ASCII). Чтобы получить ответ, вы должны использовать метод Read().

+0

Я получаю вопросительные знаки для байтов в моей строке (на самом деле квадраты), по I разделите их на Chars, и там у меня есть код ASCII, так что это будет то же самое, что использовать Read() в цикле for? В любом случае, я собираюсь проверить ваш ответ в понедельник (я поворачиваю устройства в офисе, чтобы я не работал из дома ...) – Rama

0

MSComm и Serialport - это бесплатные подарки и не так много общего. Известная портативная библиотека, которая избавляет вас от неприятностей, - SuperCom. Он предлагает совместимый с MSComm ActiveX, а также библиотеку классов NET. Можно использовать тот, который подходит лучше. Он может использоваться с C++, Delphi, VB6, VB net, C#, FreePascal, Perl, Java и многими другими. И он полностью совместим с 32-битными и 64-разрядными версиями Windows, включая. Windows XP, 7,8,10.

 Смежные вопросы

  • Нет связанных вопросов^_^