임베디드-컴퓨터 통신을위한 우수한 RS232 기반 프로토콜


10

원격 Arduino와 컴퓨터 간의 데이터 통신이 수월한 프로젝트를 진행 중입니다. 무선 연결은 한 쌍의 XBees를 통해 이루어 지므로 Arduino와 컴퓨터 사이에 RS232 링크가 있습니다. 소량의 데이터의 경우 간단한 통신 프로토콜을 쉽게 모을 수 있습니다. 더 큰 프로젝트의 경우 좋은 간단한 통신 프로토콜은 무엇입니까?

나는 가능한 옵션처럼 보이는 MODBUS를 보았지만 더 나은 옵션이 있는지 확인하고 싶었습니다.


2
요구 사항은 정확히 무엇입니까?

일반적인 제안을 찾고 있습니다. 단순성과 오버 헤드가 프로젝트의 주요 목표가 될 것입니다.
Computerish

1
죄송합니다, 또한 의미했습니다 : 데이터의 양, 속도

나는 그것에 대한 양적 조치가 없지만 많은 것이 아니며 속도는 큰 문제가 아닙니다.
Computerish

7
개발 및 디버깅이 훨씬 쉬워지기 때문에 문제가되지 않는 많은 사람과 속도는 사람이 읽을 수있는 것에 대해 강력하게 주장합니다. 터미널을 연결하고 링크 끝을 대신 할 수 있으면 좋습니다.
Chris Stratton

답변:


4

OP는 " 데이터가 많지 않고 속도가 큰 문제가되지 않는 "상황에 대한 직렬 프로토콜을 요청합니다 . MODBUS는 OP에서 언급되었습니다. RS-485를 통한 MODBUS는 빠른 프로토콜이 아닙니다. 이것은 사양이 아니지만 틈새 시장에 대한 아이디어를 제공합니다.

이 틈새 시장에 대한 두 가지 일반적인 표준 프로토콜 만 생각할 수 있습니다.

  • NEMA 0183 . 일반 텍스트 ASCII 프로토콜. 인간이 읽을 수 있습니다. 포인트 투 포인트 만. 멀티 드롭 버스를 지원하지 않습니다.
  • OP에서 이미 언급 한 MODBUS

임베디드 프로그래머가 OP와 같은 상황에 처할 때 종종 자체 직렬 통신 프로토콜을 처음부터 설계합니다.


10

일부 임베디드 시스템 프로토콜은, 그들 중 몇 가지 매우 단순 나열됩니다 임베디드 시스템 : 공통 프로토콜을 포함 :

아마도 이러한 프로토콜 중 하나는 현재 상태 그대로 또는 약간의 조정만으로도 적합 할 것입니다.


6

나는 당신 자신의 투표를하고 가능한 한 간단하게 유지합니다.

나는 내가 그 다양한 제어 애플리케이션을위한 직렬 프로토콜을 많이, 그리고 몇 가지 처리 한 당신이 포함하는 것이 좋습니다 :

  • 다른 곳에서는 사용하지 않는 시작 및 정지 문자
  • 어떤 종류의 체크섬 / 오류 검사
  • 특히 양방향 통신이 필요한 경우 일부 흐름 제어 / 신호 방법.

매우 기본적인 예로 데이터를 ASCII 문자로 변환하고 다음과 같이 시작 / 중지 문자 안에 넣을 수 있습니다.

바이트 값 0x7A를 보내려면 전송 된 데이터는 (7A)가됩니다. 여기서 ()는 선택된 시작 / 중지 문자이고 7과 A는 두 개의 ASCII 문자입니다. OK는 많은 오버 헤드를 추가하지만 기본 터미널 소프트웨어로 디버깅 할 수 있음을 의미합니다.


5

데이터가 XBees를 통과하는 경우 이스케이프 문자를 사용하여 모듈을 API 모드로 설정하고 데이터를 논리 패킷으로 나누고 API 모드에서 XBee에 제공되는 패킷이 그대로 도착하거나 도착한다는 사실을 이용해야합니다. 전혀. 1-255 바이트의 청크 전송에 관한 프로토콜을 설계하고 XBee 모듈이 각 청크 내에서 데이터를 전달하는 방법에 대해 걱정하게하십시오. 개별 패킷의 무결성을 유지하거나 그 사이의 세분화에 대해 걱정하지 마십시오. Digi 모듈은이를 잘 처리 할 것입니다. 가장 걱정할 점은 패킷을 전송하는 노드가 패킷이 배달되지 않았다고 믿고 교체를 보낸다고하더라도 수신자가 어쨌든 교체를받은 후에도 수신 할 수 있다는 사실입니다. 한 쪽이 "마스터"가되도록 프로토콜을 디자인하면 상황이 가장 쉬울 수 있습니다. 마스터가 데이터를 요청하면 슬레이브는 데이터를 한 번 전송해야하며 마스터가 데이터를 가져 오는지 걱정하지 않아도됩니다. 마스터가 원하는 데이터를 얻지 못하면 다시 요청할 수 있습니다.

슬레이브는 데이터에 일종의 시퀀스 번호를 할당해야하며 마스터는 슬레이브가 상태를 변경하도록 요청에 시퀀스 번호를 할당해야합니다. 마스터의 요청이 "시퀀스 번호가 XXX보다 큰 첫 번째 항목 보내기"형식이고 슬레이브의 각 데이터 항목에는 고유 한 시퀀스 번호와 이전 항목의 시퀀스 번호가 포함되어있는 경우 (연속적으로 번호가 매겨지지 않은 경우) ), 도착 지연 패킷은 슬레이브가 마스터에 데이터를 중복 전송하도록 할 수 있지만, 마스터는 결과적인 도착 지연 응답을 무시하는 데 어려움이 없습니다. 슬레이브가 시퀀스 번호가 이전 요청보다 낮은 상태 변경 요청을 수신하면 해당 요청은 수신되기 전에도 대체되었으므로 해당 요청을 무시해야합니다.


3

Firmata어떻 습니까? 다양한 운영 체제 및 프로그래밍 언어를 지원합니다. 컨트롤러 쪽 Arduino와 PICduino가 지원되지만 베어 마이크로 컨트롤러로 포팅하기에는 너무 어렵지 않습니다.


3

나는 이것과 비슷한 질문을했고 작은 AVR 등을 위해 간단하고 작은 것을 찾지 못했습니다. 그래서 CAN에서 영감을 얻은 것을 굴 렸습니다. MIN (Microcontroller Interconnect Network)이라고합니다.

https://github.com/min-protocol/min

나는 그것에 대해 블로그에 올렸습니다 :

https://kentindell.wordpress.com/2015/02/18/micrcontroller-interconnect-network-min-version-1-0/

블록 데이터에는 후크가 있지만 대부분 센서 / 액추에이터 용 신호를 목표로합니다. MIN 프레임 내에서 신호와 그 패킹을 설명하기 위해 JSON 형식을 정의했으며이를 사용하는 Wireshark dissector를 얻을 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.