문제

나는 건설 작은 장치와 함께 그것의 자신의 CPU(AVR Mega8)을 연결합니다.다고 가정하면 육체의 연결 및 전달의 바이 달성되었지만,무엇이 될 것이 최고의 프로토콜을 사용하여 위에 사람들의 바이트는?컴퓨터 요구를 설정할 수 있는 특정 전압 장치에서,그리고 다시 읽는 특정 기타 전압.

지금이 순간,나는 생각하고 완전한 호스트 기반의 동기식 프로토콜:컴퓨터가 요청을 보낼 포함된 CPU 답변이 있습니다.다른 어떤 아이디어가?

도움이 되었습니까?

해결책

모드 버스 당신이 찾고있는 것일 수 있습니다. 정확히 당신이 가진 문제의 유형을 위해 설계되었습니다. 많은 코드/도구가 있으며 표준 준수는 나중에 쉬운 재사용을 의미 할 수 있습니다. 또한 인간 읽기 가능한 ASCII를 지원하므로 여전히 이해/테스트하기 쉽습니다.

보다 프리 모드 버스 Windows 및 내장 소스 용.

다른 팁

클라이언트-서버 아키텍처 및 동기 프로토콜에는 많은 말이 있습니다. 단순성과 견고성, 시작. 속도가 문제가되지 않으면 디버깅에 도움이되는 작고 인간이 읽을 수있는 프로토콜을 고려할 수 있습니다. 명령에서 모뎀 선을 따라 생각하고 있습니다.

Host -->  [V02?]      // Request voltage #2
AVR  -->  [V02=2.34]  // Reply with voltage #2
Host -->  [V06=3.12]  // Set voltage #6
AVR  -->  [V06=3.15]  // Reply with voltage #6

닫는 괄호가 보이지 않으면 각면이 시간을 초과 할 수 있으며 다음 열린 브래킷에서 다시 동기화 될 수 있으며 메시지 자체 안에 나타날 수 없습니다.

속도 및 신뢰성 요구 사항에 따라 명령을 하나 또는 두 바이트로 인코딩하고 체크섬을 추가 할 수 있습니다.

항상 답장하는 것이 좋습니다. 실제 후속 읽기 작업을 저장하므로 명령을 반영하는 대신 전압.

디버그 해야하는 경우 오류 메시지를 정의하는 데 도움이됩니다.

나의 투표는 인간을 읽을 수있는 것입니다.

그러나 바이너리가되면 처음에 헤더 바이트를 넣어 패킷의 시작을 표시하십시오. 나는 직렬 프로토콜이 동기화에서 벗어나면서 항상 불운을 가졌습니다. 헤더 바이트를 사용하면 임베디드 시스템이 PC와 다시 동기화 될 수 있습니다. 또한 끝에 체크섬을 추가하십시오.

나는 물건을 다음과 같이 간단한 바이너리 형식

struct PacketHdr
{
  char syncByte1;
  char syncByte2;
  char packetType;
  char bytesToFollow;  //-or- totalPacketSize
};

struct VoltageSet
{ 
   struct PacketHdr;
   int16 channelId;
   int16 voltageLevel; 
   uint16 crc;
};

struct VoltageResponse
{
   struct PacketHdr;
   int16 data[N];  //Num channels are fixed
   uint16 crc;
}

동기화를 바이트는 덜 중요한 동기 프로토콜에는 비동기는 하나,하지만 그들은 여전히 도움을 때,특히 임베디드 시스템을 처음으로 전력을 공급하고,당신이 알고하지 않을 경우 첫 번째 바이트는 그것을 얻은 중앙의 메시지 또는 아닙니다.

형식해야하는 열거를 알려주는 방법 intepret packet.크기에서 유추한 유형,그러나 당신이 그것을 보내는 명시적으로,그 후 수신기 처리할 수 있는 알 수 없는 질식하지 않고.당신이 사용할 수 있는'총 패킷 크기',또는'바이트를 따라';후자는 만들 수 있는 수신기 코드 작은 청소기입니다.

CRC 끝에서 더 추가 보증하는 유효한 데이터이다.때로는 본 CRC 헤더에게 선언하는 구조물을 더 쉽게 하지만 그것은 끝에 방지할 수 있습 추가 통과 데이터를 보낼 때는 메시지입니다.

송신자와 수신기 모두가 시작 시간 제한 후의 첫 번째 바이트 패킷을 받은 경우에는 바이트가 떨어졌다.PC 측 또한 필요한 시간 제한 사건을 처리할 때는 임베디드 시스템에 연결되지 않은 응답이 없다.

는 것을 확신하는 경우 플랫폼을 모두 사용하여 IEEE-754 수레(PC 의)및 동 엔디안,다음 사용할 수 있습니다 떠으로 데이터를 입력합니다.그렇지 않으면 그것을 사용하는 것이 더 안전 정수 중 하나,원 A/D 비트,또는 사전 설정된 규모(i.e1 비트=.001V 제공+/-32.267V 범위)

Adam Liss는 많은 훌륭한 포인트를 만듭니다. 단순성과 견고성이 초점이어야합니다. 인간 읽기 쉬운 ASCII 전송은 디버깅하는 동안 많은 도움이됩니다. 훌륭한 제안.

이들은 귀하의 요구에 대해 과잉 일 수 있지만 HDLC 및/또는 PPP는 데이터 링크 계층의 개념과 데이터 링크 계층과 함께 제공되는 모든 이점 (및 비용)을 추가합니다. 링크 관리, 프레이밍, 체크섬, 시퀀스 번호, 재 운행 등은 모두 강력한 통신을 보장하지만 복잡성, 처리 및 코드 크기를 추가하고 특정 응용 프로그램에는 필요하지 않을 수 있습니다.

USB 버스 모든 요구 사항에 답변합니다. 장치에 요청을 보내는 컨트롤 파이프 만있는 매우 간단한 USB 장치 일 수도 있고 장치의 변경 사항에 대해 호스트에 알릴 수있는 인터럽트 파이프를 추가 할 수 있습니다. 예를 들어 사용할 수있는 간단한 USB 컨트롤러가 많이 있습니다. 사이프러스 또는 마이크로 칩.

전송 위의 프로토콜은 실제로 귀하의 요구 사항에 관한 것입니다. 설명에서 간단한 동기 프로토콜만으로는 충분한 것 같습니다. 방황하고 추가 접근 방식을 찾는 이유는 무엇입니까? 당신의 의심을 나누면 우리는 도와 주려고 노력할 것입니다 :).

경고를 할 필요가 효율적 전송 바이너리,나를 위한 터미널-스타일의 인터페이스는 이미 권장합니다.

내가 원하는 바이너리 패킷의 형식,내가 사용하는 경향이 뭔가를 느슨하게 based on PPP 바이트-asnc 갖게 한 형식은 매우 간단하고 쉽게 보낼 수신,기본적으로:

패킷을 시작과 끝으로 0x7e 당신은 탈출 char 붙여 0x7d 및 전환 bit5(i.exor 와 0x20) 그래서 0x7e 가 0x7d0x5e 고 0x7d 가 0x7d0x5d

모든 시간을 보 0x7e 다음 경우에 있어 모든 데이터의 저장,처리할 수 있습니다.

나는 일반적으로 호스트 기반의 동기 재료하지 않는 한 나는 아주 좋은 이유가 그렇지 않습니다.그것은 기술을 확장하에서 간단한 포인트-포인트 RS232multidrop RS422/485 번거로움 없이-자주 보너스입니다.

당신이 프로토콜로 직접 지시하지 않는 모든 응답에서 이미 결정했을 수도 있습니다.

그래서, 이것은 내가 생각하고 잘했는데, 여기 내 생각 중 몇 가지가 있습니다.

이 칩에는 6 개의 ADC 채널이 있으므로 RS-232 직렬 통신 (질문에서 추측)을 사용하고 있으며 물론 제한된 코드 공간에있어서 간단한 명령 구조를 정의하면 Adam이 지적한 것처럼 도움이됩니다. 칩에서 입력 처리를 최소로 유지하려면 바이너리 소리가 매력적이지만 트레이드 오프는 개발 및 서비스가 용이합니다 (지금부터 6 개월 후 죽은 입력을 촬영하는 데 어려움을 겪어야 할 수도 있습니다) - Hyperterminal은 강력합니다. 디버그 도구 - 따라서 신뢰성이 우수한 간단한 명령 구조를 구현하는 방법을 생각하게되었습니다.

몇 가지 일반적인 고려 사항 -

명령을 동일한 크기로 유지하면 디코딩이 더 쉬워집니다.

Adam이 지적한 것처럼 명령과 선택적 확인 합계를 프레임하면 명령을 쉽게 포장 할 수 있습니다. (작은 명령으로 간단한 XOR/추가 체크섬은 빠르고 고통스럽지 않습니다)

"hello; 펌웨어 버전 1.00Z"는 재설정의 펌웨어 버전을 사용하여 호스트에 대한 시작 발표를 권장합니다.

주로 모니터링하는 경우 대상이 단순히 아날로그 및 디지털 판독 값을 순환하는 "무료 실행"모드를 고려할 수 있습니다. 물론 연속적 일 필요는 없으며 1에서 간격을 두는 것이 가능합니다. 5, 10 초, 또는 명령 중. 마이크로가 항상 듣고 있으므로 업데이트 된 값을 보내는 것은 독립적 인 작업입니다.

CR (또는 다른 문자)으로 각 출력 라인을 종료하면 호스트의 동기화가 직접적으로 동기화됩니다.

예를 들어 마이크로는 단순히 문자열을 출력 할 수 있습니다.

  V0=3.20
  V1=3.21
  V2= ...
  D1=0
  D2=1
  D3=...
  and then start over -- 

또한 명령은 정말 간단 할 수 있습니다.

? - 모든 값을 읽으십시오. 그 중 많은 값이 없으므로 모두 가져 오십시오.

x = 12.34- 값을 설정하려면 첫 번째 바이트는 포트, 전압이며 "="및 ""를 유지하는 것이 좋습니다. 체크섬을 포기하는 경우 유효한 패킷을 보장하기 위해 프레임으로.

또 다른 가능성, 출력이 세트 범위 내에있는 경우 프리 스케일을 할 수 있습니다. 예를 들어, 출력이 정확하지 않아도되는 경우 다음과 같은 것을 보낼 수 있습니다.

5=0 
6=9
2=5  

포트 5 끄기, 포트 6에서 전체 켜짐, 포트 2에서 반 값을 설정합니다.이 방법으로 ASCII 및 이진 데이터는 마이크로에서 자원을 계산/디코딩하는 것과 관련하여 동일한 기반에 있습니다. 또는 더 정확하게 보려면 출력 2 바이트 (예 : 2 = 54)를 만들거나 XREF 테이블을 추가하면 값이 데이터 바이트가 인덱스 인 경우 값이 잉여 테이블에 인덱스 일 필요조차 필요하지 않습니다. .

내가 말하고 싶은대로; 그렇지 않다면 단순한 것이 일반적으로 더 좋습니다.

이것이 조금 도움이되기를 바랍니다.


다시 읽는 동안 또 다른 생각이있었습니다. "*"명령을 추가하면 HTML 태그로 랩핑 된 데이터를 요청할 수 있으며 이제 호스트 앱은 마이크로에서 브라우저 및 Wala, 브라우저 준비 -출력을 간단히 리디렉션 할 수 있습니다.

:)

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