2013-12-07 2 views
0

많은 질문과 답변을 읽었지만 해결책을 찾지 못했습니다. 내 질문이 맞을 수도 있지만 약간의 지침이 필요합니다. 내 Arduino 장치에서 데이터를 읽는 Linux에서 직렬 포트를 사용하고 있습니다. Arduino에서 Linux로 데이터를 보내려고 할 때마다, 먼저 Arduino에서 오는 전체 바이트를 나타내는 2 바이트를 보냅니다. 이 두 바이트를 정수 값으로 변환하고 직렬 포트에서 데이터 읽기를 시작합니다. 난 그냥 처음 {1, 44}를 쓸 것입니다, 나는 리눅스에 Ardiuno에서 300 바이트를 보내려면, 말과 다음 공식에 의해 INT로이 1, 44 바이트를 변환 :직렬 포트에서 NULL 문자 읽기 Linux C

char data[] = {1, 44}; 
int to_read = data[0] 
to_read = to_read << 8; 
to_read = to_read | data[1]; 
return to_read; 

이 나에게 300을 줄 것이다 int 값, charm처럼 작동합니다. 하지만 255 이하의 데이터를 읽어야 할 때 문제가 발생합니다. 100 바이트를 읽으려는 경우 처음 두 바이트는 {0, 100}이됩니다. 0은 null 문자이고 직렬 포트는 처리하지 않습니다 (직렬 포트에 0을 직접 썼습니다. 항상 0 바이트를 썼습니다). 그리고 모든 순서가 잘못되었습니다. 그래서 내 질문에 직렬 포트 또는 누군가가 내게 더 나은 솔루션을 제공하십시오. null 문자를 읽을 수 있습니다 ..

미리 감사.

+2

이유 # 18 문자에 대해 이야기 할 때 사람들이 "널 (null)"를 말할 때 내가 그것을 싫어. "널"은 기본적으로 "값 없음"을 의미합니다. 즉, 허용되는 값의 범위를 벗어나고 "null 문자"는 코드 0의 문자입니다. IE : 다소 홀수 인 경우 허용되는 값입니다. 대신 NUL을 사용하십시오. 이것이 ASCII 테이블에있는 것입니다. : P – cHao

+1

포인트가 0 인 문자는 여전히 일반 문자입니다. 끝이없는 바이트 문자열 *로 작업 할 때 C에 특별한 의미가 생기는 경우도 있습니다. 반면에 직렬 포트는 덜 신경 쓸 수 없었습니다. – cHao

+0

양면에 직렬 장치를 설치하는 방법과 이러한 장치를 통해 데이터를 보내고받는 방법을 코드로 표시하고자 할 수 있습니다. – alk

답변

1

문제가 해결되었습니다. C에서 바이트를 작업 할 때 바이트 배열 (문자 데이터 [])을 처리하는 것처럼 바이트 (char)를 문자열과 혼동하지 마십시오.이 바이트를 write 길이의 strlen (데이터), null이 아닌 바이트 만 가져 왔습니다. strlen은 첫 번째 null 문자 인 \0을보고 난 후 데이터의 길이를 반환합니다. 왜냐하면이 경우 원하는 출력을 얻지 못하기 때문입니다. 내가 한 일은 내가 데이터 char data[] = {0, 4}를 쓰고 싶은 경우에 나는 같은 것을 할 것이다 :

char data[] = {0, 4}; 
write(serial_port_fd, data, 2); 

은 2 바이트를 작성하는 write 기능을 말했다.

char data[] = {0, 4} 
write(serial_port_fd, data, strlen(data)); 

NOTHING을 쓸 것이다 : 나는 이런 식으로 뭔가를 작성하는 경우이, 0, 4 작성합니다.

한 가지 더, 직렬 포트에서 인쇄 할 수없는 문자 (바이트 값 0에서 32까지)를 쓰려면 원시 입력 및 출력에 맞게 직렬 포트를 구성했는지 확인하십시오. 이 가이드에 보라 :

http://www.cmrr.umn.edu/~strupp/serial.html#config

관련 문제