문제

나는 .NET를 통해 직렬 포트를 통해 데이터를 보내는 것이 매우 처음이며 TCP 대응 물을 구현 한 후 직렬로 쉽게 얻지 못할 것이라는 것을 알았습니다!

그래서 정상에서 시작하기 위해, 나는 일련의 양방향 통신 구현에 거의 거기에 있습니다.

  1. 내 읽기가 여러 메시지에서 분리되거나 COM 포트에 대한 단편화 된 응답으로 수신되며 필요한 설정이 필요한지 또는이를 해결하기 위해 코드를 다르게 작성 해야하는 방법을 모릅니다. 이것을 원인 할 수있는 것은 무엇입니까? 나는 중단 점에서 메시지를 검사하고 있습니다 SerialPort_DataReceived.

기본적으로 데이터는 다음과 같이 전송되어야합니다.

01: LS|DA090521|TI111043|q
02: PS|RN102|PTC|TA1040000|P#0|DA090521|TI111429|j

그러나 그것은 분할되고 있습니다 (요청 된 각각의 판독 된 각각의 임의의 위치에서)

01: LS|DA090521|TI111
02: 043|q
03: PS|RN102|PTC|TA1
04: 0000|P#0|DA090521|TI111429|j

- 질문 1에 답변되었습니다. Chris W.와 다른 사람들에게 감사합니다! 이제 조각에서 구축 될 것으로 예상되는 메시지가 점차적으로 (STX, {MSG Body}, ETX를 찾아 보면) 메시지가 완전히 구축되었을 때 수행되는 작업을 수행하고 스레드 안전 큐, 매우 행복합니다. .

. 2. 나는 "|"를 받고있다. 기호는 거의 모든주기를 읽은 것입니다. 이것은 내가 어떻게 든 잘못 설정 한 명령, 직렬 커뮤니케이션의 인공물, 또는 장치가 보내는 무언가로 인한 것입니까? (하지만이 캐릭터 연결성 이이 캐릭터가 지속적으로 전송되지 않는다는 것이 밝혀 지므로 그렇게 생각하지 않습니다.)

. 3. 각 방법에서 데이터를 올바르게 읽고 쓰고 있음을 확인할 수 있습니까?

다른 두 가지 질문을 봐 주셔서 감사합니다.

다음과 같이 관련 코드 :

...
    //                          COM3,    9600,     None,   8,        One
    SerialPort = new SerialPort(comPort, baudRate, parity, dataBits, stopBits);
    if (SerialPort.IsOpen) SerialPort.Close();
    // SerialPort.RtsEnable = true; // Request-to-send
    // SerialPort.DtrEnable = true; // Data-terminal-ready
    SerialPort.ReadTimeout = 150; // tried this, but didn't help
    SerialPort.WriteTimeout = 150; // tried this, but didn't help
    SerialPort.Open();

    SerialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
}

void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Process received data
    SerialPort sp = (SerialPort)sender;
    byte[] buffer = new byte[sp.BytesToRead];
    int bytesRead = sp.Read(buffer, 0, buffer.Length);

    // message has successfully been received
    message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
}

public bool SendMessage(string text)
{
    // Only send message if a client is connected
    if (SerialPort != null && SerialPort.IsOpen)
    {
        byte[] buffer = Encoding.ASCII.GetBytes(text);
        SerialPort.Write(buffer, 0, buffer.Length);
    }
}
도움이 되었습니까?

해결책

내 읽기가 여러 메시지에서 분리되고 있습니다

이것은 정상적이고 예상되는 피할 수없는 행동입니다. Data-Over-TCP에서도 발생할 수 있습니다. 직렬 인터페이스에는 끝없는 바이트 스트림 일뿐입니다. 바이트를 패킷으로 재 포장하는 것은 응용 프로그램의 책임입니다.

패킷 경계의 위치가 중요하고 패킷 경계가 수신 된 데이터를보고있는 위치를 알 수없는 경우 데이터 형식을 다시 생각하여 귀하를 귀하에게 ~할 수 있다 패킷 경계가 어디에 있는지 알려주십시오.

나는 "|"를 받고있다 거의 모든주기를 읽은 기호

그 캐릭터의 16 진수는 무엇입니까? 설정 여부를 확인하십시오 Handshake 속성 XOnXOff 또는 RequestToSendXOnXOff 상황을 개선합니다.

다른 팁

하위 레벨에서 직렬 포트는 수신 된 데이터를 트리거 할시기를 결정할 수 있습니다. "전체"패킷이 도착하기 전에 그렇게하기로 결정할 수 있습니다. 그러나 예상 데이터 세트에 터미네이터 문자가있는 것 같습니다. 그렇다면 다음을 수행 할 수 있습니다 (참고 구문 혼동을 피하기 위해 Serialport 할당을 변경했습니다.

        p = new SerialPort(PortName, BaudRate, Prty, DataBits, SBits);
        p.NewLine = Terminator;

여기서 터미네이터는 종료 문자를 포함하는 문자열입니다. 그런 다음 serialport.readline () (및 Serialport.writeline ()가 적용되는 경우)를 사용할 수 있습니다. 이것은 최소한 첫 번째 문제에 도움이 될 수 있습니다.

나는 많은 Win32 직렬 포트 프로그래밍을했지만 .NET으로 조금만 있으므로 소금 한 알로 조언을하십시오.

내 읽기가 여러 메시지에서 분리되거나 COM 포트에 대한 단편화 된 응답으로 수신되며 필요한 설정이 필요한지 또는이를 해결하기 위해 코드를 다르게 작성 해야하는 방법을 모릅니다.

다른 사람들이 말했듯이, 이것은 완벽하게 정상입니다. DCE쪽에 어떤 유형의 장비가 있는지에 따라 스스로 재 포장해야 할 수도 있습니다. 나는 당신이 어떤 종류의 장비를 연결했는지 잘 모르겠으므로 실제로 더 많이 말할 수는 없습니다.

더 많은 데이터를 얻으려면 다음을 시도 할 수 있습니다.

  • System.int32 수신 된 비해 해상 속성을 조정합니다
  • 동기 I/O 사용 및 이벤트 기반 수신보다는 읽을 고정 된 수의 바이트를 지정

나는 "|"를 받고있다 기호는 거의 모든주기를 읽은 것입니다. 이것은 내가 어떻게 든 잘못 설정 한 명령, 직렬 커뮤니케이션의 인공물, 또는 장치가 보내는 무언가로 인한 것입니까? (하지만이 캐릭터 연결성 이이 캐릭터가 지속적으로 전송되지 않는다는 것이 밝혀 지므로 그렇게 생각하지 않습니다.)

라인을 넘어서고있는 것이 궁금하다면 확인하십시오. Sysinternals의 Portmon, 라인을 통해 데이터를 전송하는 동안 COM 포트를 스누핑하는 무료 앱. 기술적 인 것처럼 보이지만 실제로 IRP_MJ_WRITE 및 IRP_MJ_READ 명령을 살펴 봐야하며 라인에는 길이가 바이트와 와이어를 통해 전송 된 데이터를 볼 수 있습니다. 이를 통해 문제가 .NET 시리얼 포트 객체인지 또는 장치가 실제로 "|"를 전송하는지 알 수 있어야합니다. 라인을 통해.

각 방법에서 데이터를 올바르게 읽고 쓰고 있음을 확인할 수 있습니까?

이벤트 기반 데이터 수신 방법에 적합 해 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top