방법을 변환하는 바이트 스트림을 패킷 스트림에서 C89 에서는 임베디드 장치[마감]
-
03-07-2019 - |
문제
나는 작업이 포함된 장치가 연결되어 있는 PC 를 사용하여 rs232(rs232USB).
나는에 대해 생각하고 개발하는 내 자신의 프로토콜:
<MAGIC><LENGTH><BINARY DATA><CRC>
그러나 나는 원하지 않을 바퀴를 재발견 할 수 있습니다.
하십시오 참고 는:나는에 대해 생각하고 아주 제한된 장치:4kb RAM,커널,아 표준 C lib.
생각할 수 있에 대한 표준 방식으로 이렇게하려면(아마도 오픈 소스 라이브러리)?
는 경우에 당신은 코드에 당신의 자신의 솔루션을 할 수 있는 최고의 방법이 있나요?
- 당신이 사용하여 마법의 바이트에서도 끝의 패키지?
- 어쩌면 그것은 더 나은 사용하는 시간 간격을 구분 기호를 대신?
- 당신은 어떻게 시작을 찾을 수 있는 패키지에서 스트림 데이터는 바이너리?
- 어쩌면 그것은 더 나은 사용하는 텍스트 프로토콜?
업데이트: 다시 읽기 질문입니다.나 요구하지 않아야한 라이브러리에 대한 좋은 사례입니다.
해결책
보 이 답변은 내가 매우 비슷한 질문 에 관한 정보의 간단한 프로토콜입니다.
에 대응하는 귀하의 특정 포인트:
- "마술"바이트의 끝에서 패킷을 하지 않는 어떤 해지만,그들은 중복되는 경우 당신은 이미 알고 얼마나 오래 패킷이 있어야,그리고 CRC.
- 할 수 있는 지정한 시간 제한 시간이 있는 경우 너무 큰 사이의 간격 바이트 중 하나에서 패킷,그 오류가 플래그가 있습니다.는 데 사용되는 Modbus, 나의 확신 값을 사용하여 시간을 기반으로 구분 기호습니다.
- 당신은 당신을 의미,"당신은 어떻게 시작을 찾을 수 있는 패킷에서 이진 데이터 스트림"?그렇다면 어쩌면 지정한 최소 사이의 간격에 패킷을,및/또는 요구를 받는 사람 acknolwedge 후에는 매 패킷을 전송합니다.
- 은 쉽게 디버깅,그리고 필요 없는 특별한 소프트웨어는 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 계산이 됩니다.있는 멋진 문서로,코드 기.
제휴하지 않습니다 StackOverflow