2014-12-17 4 views
1

여러 스레드를 읽었지만 여전히이를 수행하는 방법을 잘 모르고 있습니다. analogRead()를 사용하여 Arduino에서 일부 값을 읽으므로 0-1023 사이의 값을 얻고이를 직렬 통신을 통해 Matlab에 보냅니다. 나는 현재 Serial.print()를 사용하고 있지만, Serial.write()를 사용하는 것이 훨씬 더 효율적인 방법이라고 읽었습니다. 먼저 비트로 값을 채우고 MSB와 LSB 만 보내면됩니다. 이 방법을 사용하면 Serial.print를 사용할 때보 다 적은 수의 비트를 사용하여 하나의 값을 전송합니다.값을 비트로 포장하고 언 패킹 Arduino-Matlab

문제는 MSB와 LSB를 보내고 MATLAB에서 정수 값을 다시 정의하기 위해 Arduino에서 값 (0-1023)을 팩하는 방법을 알 수 없다는 것입니다.

나에게 손을 줘? 아두 이노에 C/C++에서

답변

0

먼저 사전에

감사합니다, 당신은 bit shiftingbitwise operationsbit masking를 통해 최상위 비트 (MSB) 또는 최하위 비트 (LSB) 얻을 수 있습니다 :

const word Value = 1000; // Could also be an int or an unsigned int, [0-1023] 
byte MSB = Value >> 8;  // Right shift 
byte LSB = Value & 0x00FF; // Mask 

그러나 Arduino 인 Arduino는 다음과 같은 기능을 제공합니다. highBytelowByte은 각각 값의 MSB와 LSB를 반환합니다.

Serial.Write을 사용하는 것이 더 빠를 지 모르겠다. Matlab에 많은 양의 데이터를 보내고있는 경우, 호출 횟수를 Serial.Write 또는 Serial.Print으로 제한하는 것이 가장 좋습니다. 버퍼 (바이트 배열)를 만들고, 그 안에 모든 데이터를 저장 한 다음, 상단을 Serial.Write으로 전달하면됩니다 (이 함수의 오버로드 된 버전에 대한 설명서 참조).

Matlab 쪽에서는 bitwise functions이라는 동등한 문자가 있습니다. 단지 C의 문자보다 효율적일 것으로 기대하지 마십시오. 그들은 프로토 타이핑 테스트에 유용합니다.

Value = uint16(1000); 
MSB = bitshift(Value,-8); % Right shift 
LSB = bitand(Value,255); % Mask 

당신은 비트 단위 연산 반전하여 2 바이트 값을 "재 조립": : C에서

Value = bitor(bitshift(MSB,8),LSB) 

이 단지입니다 예를 들어, 함께 매트랩 위의 C 코드를 재현 할 수 있습니다 (MSB<<8)|LSB 그리고 위의 내용을 Matlab에서 다음과 같이 효율적으로 구현할 수 있습니다 :

Value = MSB*256+LSB 
관련 문제