방법을 변환하는 바이트 스트림을 패킷 스트림에서 C89 에서는 임베디드 장치[마감]

StackOverflow https://stackoverflow.com/questions/815029

  •  03-07-2019
  •  | 
  •  

문제

나는 작업이 포함된 장치가 연결되어 있는 PC 를 사용하여 rs232(rs232USB).

나는에 대해 생각하고 개발하는 내 자신의 프로토콜:

<MAGIC><LENGTH><BINARY DATA><CRC>

그러나 나는 원하지 않을 바퀴를 재발견 할 수 있습니다.

하십시오 참고 는:나는에 대해 생각하고 아주 제한된 장치:4kb RAM,커널,아 표준 C lib.

생각할 수 있에 대한 표준 방식으로 이렇게하려면(아마도 오픈 소스 라이브러리)?

는 경우에 당신은 코드에 당신의 자신의 솔루션을 할 수 있는 최고의 방법이 있나요?

  • 당신이 사용하여 마법의 바이트에서도 끝의 패키지?
  • 어쩌면 그것은 더 나은 사용하는 시간 간격을 구분 기호를 대신?
  • 당신은 어떻게 시작을 찾을 수 있는 패키지에서 스트림 데이터는 바이너리?
  • 어쩌면 그것은 더 나은 사용하는 텍스트 프로토콜?

업데이트: 다시 읽기 질문입니다.나 요구하지 않아야한 라이브러리에 대한 좋은 사례입니다.

도움이 되었습니까?

해결책

이 답변은 내가 매우 비슷한 질문 에 관한 정보의 간단한 프로토콜입니다.

에 대응하는 귀하의 특정 포인트:

  1. "마술"바이트의 끝에서 패킷을 하지 않는 어떤 해지만,그들은 중복되는 경우 당신은 이미 알고 얼마나 오래 패킷이 있어야,그리고 CRC.
  2. 할 수 있는 지정한 시간 제한 시간이 있는 경우 너무 큰 사이의 간격 바이트 중 하나에서 패킷,그 오류가 플래그가 있습니다.는 데 사용되는 Modbus, 나의 확신 값을 사용하여 시간을 기반으로 구분 기호습니다.
  3. 당신은 당신을 의미,"당신은 어떻게 시작을 찾을 수 있는 패킷에서 이진 데이터 스트림"?그렇다면 어쩌면 지정한 최소 사이의 간격에 패킷을,및/또는 요구를 받는 사람 acknolwedge 후에는 매 패킷을 전송합니다.
  4. 은 쉽게 디버깅,그리고 필요 없는 특별한 소프트웨어는 PC 에서지만,매우 효율적이지 않습니다.의 경우 물론,유용성은 더 중요한 것보다 효율,보다는 텍스트 기반의 시스템은 완전히 적합합니다.

다른 팁

에 대한 이 같은 것을 얻을 시간이 기존 솔루션을 작동하는 장치에 있었을 것이다,그냥 쉽게 바퀴를 재발견 할 수 있습니다.

void buffer_packet(unsigned char rx_byte)
{
    static unsigned char byte_count = 0;
    static unsigned char packet[8];

    packet[byte_count++] = rx_byte;
    if (byte_count == 8)
    {
        unsigned char crc = calculate_crc(packet, 8);

        write_uart(0x55);
        write_uart(8);
        while (byte_count--)
        {
            write_uart(packet[7 - byte_count]);
        }
        write_uart(crc);
    }
}

또 어쩌면 나는 과소 평가의 문제입니다.당신이 찾고있는 경우를 생성하는 방법 RS232 비트에 보면 마이크로컨트롤러 데이터시트를 참조하십시오.

에 대한 유일한 것이 있을 넘어 당신의 I/O 프리미티브가 될 것입니 CRC 계산이 됩니다.있는 멋진 문서로,코드 .

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