2011-01-27 3 views
2

.Net SerialPort와 VB6 MSComm이 다르게 작동 할 수 있습니까?SerialPort 대 MSComm

두 경우 모두 버퍼에서 데이터를 읽는 중이며 둘 다 다른 문자열을가집니다. MSComm dll을 내 .Net 프로젝트로 가져 오면 완벽하게 작동합니다 (분명히).

누구든지 자세한 정보가 있습니까?

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

필자는 네이티브 및 .NET의 직렬 포트 코드를 많이 작성했으며 IMO System :: IO :: Ports :: SerialPort 및 MSCOMM.OCX는 모두 휴지통입니다. 그들은 견고하고 강력한 Win32 시리얼 포트 API를 사용하여 악용 사례에 강요합니다. 견고한 코드를 작성하려면 p/invoke (또는 C++/CLI 래퍼)를 사용해야합니다. –

+0

@Ben Voigt pinvoke가 아니라면 C++/CLI wrapper는 무엇입니까? C++/CLI는 레거시 (관리되지 않는) C++에서 .NET으로 이식하기위한 것이라 생각했습니다. 관리되는 코드에서 관리되지 않는 API에 액세스하는 데 도움이됩니까? – ChrisW

답변

1

내가 기대 : 도움이된다면

, 여기

VB6 ... 두 경우 모두 내가 같은 바이트 배열을 보내, 간단한 샘플 내입니다 둘 다 사용하는 것 the underlying O/S API; 하지만 그들은 각기 다른 방식으로 API를 사용할 수 있다고 생각합니다. 다른 기본 COM 포트 매개 변수 (매개 변수를 명시 적으로 지정하지 않은 경우).

또 다른 차이점은 입력/응답을 읽었을 때 그것이 아직 보내 졌는지 어떻게 알 수 있으며 '읽기'또는 '입력'기능이 충분히 오래 기다리는 지 어떻게 알 수 있습니까? ?

+0

나는 독서 전에 Thread.Sleep을하고 있는데, 나는 가지고있는 응답을 가지고 있지만, 다른 문자를 가지고있다. ... – Rama

5

바이트와 문자열을 혼합합니다. MSComm은 매우 느리지 만 SerialPort는 텍스트 인코딩에 신경 쓰고 있습니다. 분명히 바이너리 프로토콜을 사용하고 있는데,받은 문자열에 SerialPort로 변환 할 수없는 바이트에 물음표가 들어있을 가능성이 있습니다. 인코딩 (기본값은 ASCII)입니다. 응답을 얻으려면 Read() 메서드를 사용해야합니다.

+0

나는 내 문자열 (실제로는 사각형)의 바이트에 대해 물음표를 받는다. 그것들을 Chars로 분리하면 거기에 for 루프 내에서 Read()를 사용하는 것과 같지 않을 ASCII 코드가 있습니다. 어느 쪽이든, 저는 월요일에 답을 테스트 할 것입니다. (나는 사무실에서 장치를 돌려서 집에서 일하지 않을 것입니다 ...) – Rama

0

MSComm 및 Serialport는 무료 선물이며 많은 공통점이 없습니다. 문제로부터 당신을 구하는 잘 알려진 휴대용 라이브러리는 SuperCom입니다. MSComm 호환 ActiveX과 A NET 클래스 라이브러리를 제공합니다. 하나는 더 잘 맞는 것을 사용할 수 있습니다. C++, Delphi, VB6, VB net, C#, FreePascal, Perl, Java 및 기타 여러 언어에서 사용할 수 있습니다. 또한 Windows 32 비트 및 64 비트와 완벽하게 호환됩니다. Windows XP, 7,8,10.