?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

아두이노와 Exynos eCube board 통신 질문

페이지 정보

작성자 권혁정 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일15-11-15 19:03 조회2,959회 댓글1건

본문

안녕하세요?

우선 읽어주셔서 감사드립니다.

 

Exynos eCube 4412 board에 cdc-acm.ko module을 껴넣고

file operation을 통하여 아두이노에서 전송하는 데이터를 eCube 4412에서 읽어들이는 부분을 공부하고 있습니다.

 

tftp 통신을 통하여 디바이스 드라이버 (cdc-adm.ko)를 4412에 올려놓았는데.

아두이노에서 보내는 값을 어플리케이션에서 읽으려면 디바이스 드라이버에서 제공하는

file operation을 사용한다고 알고있습니다.

 

 

 

[질문1]

C로 작성한 어플리케이션에서

 

#define BAUDRATE B115200
#define MODEMDEVICE "/dev/ttyACM0"

// OPEN Arduino DEVICE
fd= open(MODEMDEVICE, O_RDWR | O_NOCTTY );

// SETTING COMMUNICATION PARAMETERS
newtio.c_cflag= BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag= IGNPAR;
newtio.c_oflag= 0;

// READ from Arduino
read(fd,buf,255);
//TO DO .. MAKE YOUR CODES

이런식으로 작성하는 것은 이해했는데, CRTSCTS, CS8, CLOCAL, CREAD.. 등의 의미를 잘 모르겠습니다.

또한 읽어들인 값들이 buf에 저장이 되는 건가요?

http://www.tldp.org/HOWTO/Serial-Programming-HOWTO에서 file operation에 대하여 참고하였습니다.

[질문2]

arduino에는 무게 센서, 조도 센서, 온도 센서, 습도 센서, 심박 센서가 부착됩니다.

모두 입력 센서라서 아두이노는 읽어들인 데이터를 어플리케이션으로 보내기만 하는데요.

그럼 모두 5개의 값을 어플레이이션으로 보내야 하는데, 이 데이터들을 한꺼번에 보내려면

어떤 식으로 코드를 구성해야 하나요?

 

int weight, light, temp, humidiy, heartbeat

이 5개 변수에 값이 각각 저장되어있다고 가정한다면,

Serial.write(weight), Serial.write(light), ...., Serial.write(heartbeat)

를 통해 데이터를 보내고, 어플리케이션에서 read(fd, buf, 255)에 저장하면

buf에는 이 5개의 값들이 저장되어있나요?

 

 

 

[질문3]

buf에는 이 5개의 값들이 저장되어있나요?

아니면 5개 데이터를

int buf[5];

buf[0]=weight;

...

buf[4]=heartbeat;

 

이런 식으로buffer에 저장하고,

Serial.write(buffer)

이렇게 보내야 하나요?

 

 

 

[참고]

아두이노에서 보낸 데이터를 받고, 처리하는 라이브러리를 구성하고 있습니다.

아래는 제가 생각하고 있는 prototype입니다.

sturct arduino_context

{

    int fd;

    int buf[];

    int temp

   .....

}

 

struct arduino_context context;

 

arduino_init()

{

    context.fd = open() //

    ...

}

read_temp()

{

    ...

    context.temp = context.buf[?];

    return context.temp;

}

 

 

 

질문이 너무 복잡하여 죄송합니다.

답변 기다리겠습니다.

감사합니다.

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

1. c로 짜보질 않아서 잘 모르겠습니다. 아래 두 링크에 일부 내용들이 설명되어 있는 것 같으니 참고하세요.
http://www.delorie.com/gnu/docs/glibc/libc_365.html
http://www.delorie.com/gnu/docs/glibc/libc_362.html
Serial 통신에 대한 더 일반적인 내용들은 아래에 상세히 나와있습니다.
http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=tech_comm&wr_id=78
read(fd,buf,255); >>> 이 부분이 수신한 데이터를 buf 버퍼에 byte array 형태로 기록되는거 같습니다.

2. Serial.write(weight) ==> 이렇게 사용하면 int 형인 weight 가 byte(8bit) 형으로 형변환 되어 전송됩니다. 255보다 큰 숫자의 경우 상위 바이트에 기록된 값이 유실됩니다. 따라서 아래처럼 전송해줘야 integer 값이 온전히 전달됩니다.
Serial.write(byte(weight >> 8));    // 상위 8비트 전달
Serial.write(byte(weight));    // 하위 8비트 전달
수신측 버퍼에는 이렇게 전달된 값들이 순서대로 저장되어 있을겁니다. 보낼때처럼 비트 연산으로 int로 복원하시면 됩니다.

3. [2]번의 예제처럼 1byte씩 보내도되고, 큰 버퍼에 보내고 싶은 값들을 담아두고 한꺼번에 보내도 됩니다. 이때는 Serial.write(buffer, size) 함수를 쓰면 됩니다. print() 함수로도 보낼 수 있는데... 이 경우는 반드시 보내고 싶은 데이터를 적고 맨 마지막에 NULL byte(=0x00)를 추가해줘야 합니다. print() 함수는 전달된 byte 배열을 문자열로 인식해서 문자열 끝을 찾기 때문입니다.