0

마이크로 컨트롤러와 C# Windows 응용 프로그램 간의 직렬 통신을 구현하려고합니다.시리얼 메시지 분리

저는 컴퓨터에서 마이크로 컨트롤러 방향으로 올바르게 작동하고 있습니다. 그러나 다른 방향으로 통신을 구현하는 방법을 정확히 파악하는 데 문제가 있습니다. 주소/

  • B1
  • 을 전송되는 값의 이름 - - 높은 바이트
  • B2 - 낮은 바이트
  • B3 -의 체크섬 = 추가

    내 메시지는 4 바이트

    • B0로 구성되어 있습니다 바이트 0-2

    완전한 메시지가 수신되는지 확인하기 위해 마이크로 컨트롤러가 현재 메시지를 다시 보내야합니다. 바이트 간 간격이 20ms보다 길면 잘 작동하는 것처럼 보이며 동기화시 손실을 초래할 수있는 통신 오류를 허용 할 수 있습니다.

    C# 응용 프로그램 내에서이 지연을 구현할 수있는 방법에 대해 잘 모르겠습니다. 타이밍에 대한 제어 기능이 훨씬 적다는 것을 알고 있습니다.

    시작 및 정지 문자를 보내는 다른 ASCII 프로토콜을 보았지만이 값을 바이트로 변환 할 수있는 이진 데이터를 전송할 때이를 구현하는 방법을 모르거나 시작 또는 종료 문자를 사용할 수 있습니다. 정지 문자입니다.

    제한된 리소스를 가지고 있으므로 마이크로 컨트롤러 측면을 기본으로 유지해야하며 컨트롤러 기본 작업에는 ascii에서 십진수로 변환하는 매우 정밀한 (하위 범위)이 필요합니다.

    아무에게도 마이크로 프로세서 또는 컴퓨터 쪽에서 구현해야하는 방법에 대한 권장 사항이 없습니다.

    편집
    여기에 다른 몇 가지 질문에 보았다 그러나 그들 모두는 훨씬 더 큰 ASCII 기반의 메시지를 참조 할 것.

  • +0

    내가 작업 한 프로토콜은 일반적으로 시작/종료 메시지 표식, 바이트 값 2와 3을 지정하고 일반적으로 이스케이프 알고리즘을 사용하여 실제 데이터 값 3 (끝 마커) 데이터 (때때로 DLE 인코딩이라고도 함. –

    답변

    1

    이것은 매우 나쁜 생각입니다. 그것은 전선의 다른 쪽 끝에있는 기계가 동일한 보증을 제공 할 수 있다고 가정합니다. 마이크로 컨트롤러에서는 20 밀리 초가 전혀 문제되지 않습니다. Linux 나 Windows를 부팅하는 머신이 아닙니다. 직렬 포트에 쓰는 쓰레드가 수백 밀리 초 동안 프로세서를 쉽게 잃어 버릴 수 있습니다. C#의 경우 가비지 수집.

    예외적 인 경우에만 최적화하지 마십시오. 아무런 의미가 없습니다. 제한 시간은 범위 여야하며 예상 한 최악의 경우보다 10 배 더 커야합니다. 프레이밍으로 프로토콜을 더욱 신뢰할 수있게 만드십시오. 항상 수신기가 재 동기화 할 수있는 시작 바이트. 길이 바이트를 포함 할 수도 있지만, 조만간 필요할 것으로 예상됩니다. 체크섬을 통해 CRC를 선호하십시오. 널리 무시 되더라도 복구 가능한 프로토콜 제안에 대해 RFC916을 확인하십시오. 연결 시도를 안정적으로 수행하려면 추가 작업이 필요했지만 사용했을 때 제대로 작동했습니다. 수신 버퍼를 플러시해야합니다.

    +0

    이것은 좋은 조언이지만 질문은 .net kernal의 직렬 포트가 ReadTimeout 및 readByte 기능으로 내려갈 때 win32를 래핑하기 때문에 기반이 아닙니다. 또한, Windows는 스케줄링 할 때 16ms 해상도를 가지고 있지 않습니다 (루프가있는 전용 읽기 스레드가 있다고 가정 할 때) – Serdalis

    +1

    예, 바이트가 드라이버의 전송 버퍼에 있으면 아무런 문제가 없습니다. 이 문제는 사용자 모드 프로그램에서 송신 버퍼로 바이트를 가져 오는 중입니다. 이와 같은 프로토콜을 사용하면 프로그램이 한 번에 한 바이트 씩 쓸 가능성이 높습니다. 이것은 당신이 테스트 할 수있는 것이 아니며 너무 드물게 발생합니다. 프로토콜 결함에서 복구 할 수있는 방법이 없다면 그것이 끝입니다. –

    1

    당신은

    serialPort.ReadTimeout = 20; 
    

    는 경우에 당신은 당신이 원하는 것을 할 수있는,이 20ms 후에 읽기 작업 시간을 만들 것입니다, 다음 명령을 사용하여이 20ms로 read timeout을 설정할 수 있습니다.

    는 읽기 제한 시간에 의존하지 않는 한이 타임 아웃 ReadExisting를 사용하지 마십시오

    ,
    대신 Read() 사용하거나 readByte()을 심지어 성공적으로 쓰기에 WriteTimeout 수행 할 수 있습니다 incedently으로 동일한 Timeout Exception

    확인 . 그래서 그것에주의를 기울이십시오.