도와주세요!!
글 수 15,339
2008.05.16 02:58:21 (*.241.179.145)
6710
ㅜ.ㅜ 고수님들 안녕하세요~
암 보드 공부하는 학생입니다..
시리얼 통신 질문입니다.~~
제가 128에서 gps 좌표를 arm보드로 날려줍니다.
$123456789012345678*
이렇게 데이타가 스트링 부터 아스트링크 까지 날아오는데
보드에서 읽을때 일정하게 들어오지가 않아서 버퍼를 두어서 저장을 해서
문자열을 제가 쓰고 싶은부분만 잘라서 int 값으로 변환 해서 사용할려고 하니
계속 막힙니다.
소스는 이렇습니다.
while{1}
(
res = read(fd, buff, 1); //한문자씩 buf 읽어들임.
temp[i] = buff[0];
i++;
if(i == 18)
{
i = 0;
for(i=0;i<8;i++)
{
value[i] = temp[i+1] //문자열 $ 다음부터 8번째 까지 저장
}
}
ea = atol(value);
printf("%d", ea);
}
버퍼에서 수신받는게 일정하지 않아서 1문자씩 받습니다.
대체 뭐가 잘못된걸까요?
간단히 해결하리라 생각했는데 이상하게 시간이 흘러가서 답답해서
올려봅니다~~
많은 조언 구합니다.
암 보드 공부하는 학생입니다..
시리얼 통신 질문입니다.~~
제가 128에서 gps 좌표를 arm보드로 날려줍니다.
$123456789012345678*
이렇게 데이타가 스트링 부터 아스트링크 까지 날아오는데
보드에서 읽을때 일정하게 들어오지가 않아서 버퍼를 두어서 저장을 해서
문자열을 제가 쓰고 싶은부분만 잘라서 int 값으로 변환 해서 사용할려고 하니
계속 막힙니다.
소스는 이렇습니다.
while{1}
(
res = read(fd, buff, 1); //한문자씩 buf 읽어들임.
temp[i] = buff[0];
i++;
if(i == 18)
{
i = 0;
for(i=0;i<8;i++)
{
value[i] = temp[i+1] //문자열 $ 다음부터 8번째 까지 저장
}
}
ea = atol(value);
printf("%d", ea);
}
버퍼에서 수신받는게 일정하지 않아서 1문자씩 받습니다.
대체 뭐가 잘못된걸까요?
간단히 해결하리라 생각했는데 이상하게 시간이 흘러가서 답답해서
올려봅니다~~
많은 조언 구합니다.
몇 가지 도움이 될 만한 말씀을 올립니다.
1. i 변수 사용
i = 0; <--- 이 부분이 있을 것으로 생각됩니다.
while{1}
(
res = read(fd, buff, 1); //한문자씩 buf 읽어들임.
temp[i] = buff[0];
i++;
if(i == 18)
{
i = 0; <--- 여기서 i 를 0으로 초기화하셨는데,
for(i=0;i<8;i++) <-- 다시 i 는 8 이 됩니다.
{
value[i] = temp[i+1] //문자열 $ 다음부터 8번째 까지 저장
}
}
ea = atol(value);
printf("%d", ea);
}
2. 문자 길이로 데이터 수신을 확인
시리얼 통신은 가장 저렴하지만 매우 불안한 통신방법입니다. 물론 모든 통신은 불안합니다마나,
그 불안한 부분을 프로토콜로 해결합니다.
TCP/IP나 UDP/IP를 사용하는 소켓프로그래밍에서는 이미 TCP/IP나 UDP/IP 프로토콜이 도와 주어서
안정된 통신을 할 수 있습니다만 시리얼 통신은 제공되는 프로토콜이 없기 때문에
개발자가 처음부터 끝까지 처리해 주어야 합니다.
생각에서는 $ 부터 * 까지 모두 10바이트가 전송되고 수신될 것 같지만
때로는 바이트가 하나 또는 이상이 누락되는 경우가 발생할 수 있습니다.
$부터 * 까지를 한개의 패킷이라고 한다면, 이번 패킷에서 한 바이트만 빠져도
다음 패킷부터 정상적으로 받을 수 없습니다.
그러므로 문자열 길이로 판단하지 마시고, 한 바이트씩 수신 하시면서 $와 * 문자를 비교하시면서
자료를 수신하는 것이 좋습니다.
3. 수신 자료의 변형
$ 문자나 * 문자도 다른 문자로 변형될 수 있습니다. 그러므로 $ 문자가 수신할 때 까지 대기하면
문제가 없겠지만 * 문자가 올 때까지 버퍼에 쌓다 보면 버퍼 크기를 넘길 수 있습니다.
그러므로 $ 문자 수신 후에 * 문자가 올 때까지 버퍼에 쌓더라도 수신된 자료가 버퍼 크기를 벗어 나거나
정상 패킷 크기보다 크다면 가감히 버퍼에 쌓인 자료를 버리고 새로 $ 문자를 대기해야 합니다.
더 자세한 프로토콜 설명은 아래의 링크를 참고하세요. ^^
http://forum.falinux.com/zbxe/?mid=network_programming&document_srl=406026
그럼 좋은 하루 되세요. ^^