2010-11-20 5 views
4

저희 회사는 C# .net으로 작성한 응용 프로그램을 통해 PC와 통신하는 많은 임베디드 장치를 만들고 있습니다. 필자는 데이터 전송을 향상시키는 다양한 방법을 고려해 왔기 때문에 PC 응용 프로그램을 현재 상태 (어떤 경우에는 지속적으로 변경)와보다 쉽게 ​​동기화 할 수 있습니다.임베디드 장치의 데이터를 xml 형식으로 출력하는 것이 현명한 방법입니까?

나는 직렬 포트, USB, 이더넷 소켓 등을 통해 장치를 보내기 전에 장치의 설명과 상태 메시지를 xml 형식의 메시지로 포맷하는 접근 방식에 대해 생각 해왔다. 이 모든 데이터를 내 C# 클래스로 가져 오는 것이 더 간단합니다.

다른 방법은 호스트 애플리케이션의 getStatus 같은 명령을 전송 접근하고 장치가 바이트의 배열로 응답 다른 속성, 센서 판독 등

을 나타내는 각 I 좋은 없어 XML에 대한 경험이 있지만, XML에서 LINQ를 사용하면 XML을 사용하는 것이 좋을 것 같습니다. 너희들은 어떻게 생각하니? 이 일이 일반적으로 행해지는 것입니까? 그것은 끔찍한 생각입니까?!?

답변

4

먼저 어떤 방법을 사용하든 데이터 구조를 수정할 수 있도록 반환 된 데이터에 버전 번호가 포함되어 있는지 확인하십시오.

두 옵션 중 하나입니까? 진실하게, 더 가독한 형태로 데이터를 보내는 것이 바람직한 경우와 더 밀도가 높은 표현이 가장 좋은 경우가 있습니다 (대부분이 생각하는 것보다 적지 만 종교 전쟁을 시작하고 싶지 않습니다). 사람들은 서로 다른 것들에 대해 최적화하기 때문에 두 가지 모두에 대해 열정적으로 논쟁 할 것입니다. 두 옵션 모두를 제공하면 두 진영 모두를 만족시킬 수 있습니다.

멋진 XML 상태는 기기로 작업하기 시작한 사람들의 바를 확실히 낮출 수 있습니다. 또한 반환 된 이진 데이터에서 deserialize 할 수있는 C# 개체를 작성할 수도 있습니다.

+0

통찰력 주셔서 감사합니다. – PICyourBrain

+1

+1 버전 관리 –

2

끔찍한 생각은 아니지만 과장된 디자인 일 것입니다. 임베디드 장치가보다 쉽고 빠르게 생성 할 수있는 형식을 선호합니다. 그런 다음 PC 측에서 편리한 형식으로 변환하기 위해 레이어를 삽입합니다. 개체와 함께 LINQ를 사용할 수도 있습니다. 바이너리 형식 또는 간단한 ASCII 프로토콜로 데이터를 보낸 다음 C# 개체로 변환하지 않는 이유는 무엇입니까? LINQ를 사용하여 데이터에 액세스 할 수 있습니다. 제 생각에는 XML은 불필요한 복잡성을 초래합니다.

1

어느 쪽이든간에 절충점이 있으므로 올바른 선택은 응용 프로그램, 장치의 강력한 기능 및 누가이 프로토콜을 사용하게 될지에 따라 다릅니다.

이진 직렬화 된 요청 - 응답 방식을 사용할 수 있습니다. 직렬화 형식 (바이너리 또는 XML)과 통신 스타일이라는 두 가지 차원이 있습니다. 푸시 프로토콜이나 요청 - 응답 프로토콜에서 원하는 모든 직렬화 형식을 사용할 수 있습니다. 당신이 XML은 자체 설명하는 경향이 있기 때문에, 서로 다른 특성을 가지고 다른 장치가있는 경우 장치 사이의 변화, 즉이 경우

  • 가독성이
  • 중요한 경우

    XML은 좋은 선택이 될 수 있습니다.

  • 또는 장치 데이터를 인터넷에 게시하려는 경우.

물론 XML은 자세한 정보이며 이진 프로토콜을 사용하여 위의 모든 작업을 수행 할 수있는 확실한 방법이 있습니다 (예 : 태그가있는 값을 사용하여 이진 프로토콜을보다 잘 설명 할 수 있음). 바로이 사이트의 설립자의

0

에서 XML에 대한 몇 가지 제정신 재미있는 의견이 있습니다. 어도비 플렉스 (우리가 사용하고 있던 것)가 XML을 매우 쉽게 해석 할 수 있었던 이래로 PC 측에서는 매우 잘 작동했습니다. 닷넷은 똑같은 일을 매우 쉽게 할 수 있다고 생각합니다.

더 복잡한 부분은 마이크로 프로세서 측면에 있습니다. XML 파싱은 수작업으로 수행해야했지만 실제로 복잡하지는 않았지만 시간이 많이 걸렸습니다. XML 문자열을 작성하는 것은 수행중인 작업에 따라 상당히 많은 코드가 될 수 있습니다.

전반적으로 다시해야한다면 매우 유연한 프로토콜이기 때문에 여전히 XML이 좋은 선택이라고 생각합니다. RAM은 마이크로 프로세서 측면의 FIFO 버퍼에 몇 개의 패킷을 저장하는 것과 관련하여 많은 문제가 아니었지만 응용 프로그램에서 고려해야 할 사항 일 수 있습니다.

0

XML 파일을 생성하고 전송하는 데 소중한 임베디드 CPU 시간이 낭비됩니다. 대신 데이터를 표현하는 바이너리 바이트 배열을 사용 하겠지만 구조체를 사용하여 데이터를 해석하는 데 도움이됩니다. C#의 구조체 기능을 사용하면 바이트 배열을 의미있는 데이터로 쉽게 해석 할 수 있습니다.

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
public struct DeviceStatus 
{ 
    public UInt16 position; // Byte 0 and 1 
    public Byte counter;  // Byte 2 
    public Fruit currentFruit; // Byte 3 
}; 

enum Fruit : Byte 
{ 
    Off = 0, 
    Apple = 1, 
    Orange = 2, 
    Banana = 3, 
} 

그런 다음이 구조체의 바이트 배열을 변환하는 기능을 할 것이다 : 예를 들면 다음과 같습니다이다

public unsafe DeviceStatus getStatus() 
{ 
    byte[] dataFromDevice = fetchStatusFromDevice(); 
    fixed (byte* pointer = dataFromDevice) 
    { 
     return *(DeviceStatus*)pointer; 
    } 
} 

XML 비교를,이 방법은 장치와의 CPU 시간을 절약 할 수 PC이며 XML 파일을 작성하고 파싱하는 보완적인 기능을 통해 XML 스키마보다 유지 관리가 쉽습니다. C# 코드와 장치가 사용할 프로토콜에 동의하도록 embedding 된 장치의 struct 및 enum 정의가 C# 코드의 정의와 동일해야합니다.

모든 구조체 요소가 예측 가능한 방식으로 배치되도록 C# 및 포함 된 측면에서 "packed"특성을 사용하는 것이 좋습니다.

관련 문제