도와주세요!!
네, 먼저 확인하고 싶은 내용이라 소스 확인 전에 여쭙게 되었습니다.
먼저 텍스트 파일로 성공하셨다는 말씀을 주셨으면 좋았을텐데 말이죠. ^^
그럼 제가 먼저 이상하게 생각하는 부분부터 말씀드리겠습니다.
지금 파일 이름을 전송할 때에는 strlen() 함수를 사용하여 write()하셨습니다.
- write(PORT, file, strlen(file));
그러면 키보드로 입력한 파일 이름의 길이 만큼 상대방에게 전송될 것입니다.
그러나 수신하는 쪽은 file 버퍼 크기만큼 읽어 들이고 있습니다.
- read(PORT, file, sizeof(file));
이렇게되면 전송하는 쪽의 전송 데이터 크기와 수신하는 쪽에서 요구하는 데이터 길이가 틀리기 때문에 이름부터 제대로 송수신하기 어렸습니다.
밑에 FALINUX의 오재경 팀장님께서도 말씀하셨지만, 소켙 통신에는 기본적으로 제공되는 프로토콜이 있기 때문에 자료를 전송하고 받는 것이 간편하지만 시리얼은 제공되는 프로토콜이 없기 때문에, 모두 프로그래머가 만들어 주어야 합니다.
올려 주신 코드식으로 처리한다면 파일 이름 크기를 고정하고 파일 길이를 전하는 데이터 크기도 고정하는 방법을 사용하여 해결할 수 있습니다.
즉,
[파일 이름은 40자로 한다][파일 크기는 4byte][이후 파일 데이터는 파일 크기에 따라 변경된다]
이런 식으로 말이죠.
그렇다고 한다면 보내는 쪽의 소스에서 strlen()을 사용하시면 안 되고 sizeof()로 변경하셔야 하고,
file을 전송할 때, 파일 이름 외의 부분은 NULL 코드로 초기화를 해 주셔야 받는 쪽에서 파일 이름을 제대로
파악할 수 있습니다.
그러나 저는 이런 방법 보다는 다른 분이 많이 사용하는 프로토콜을 사용하시기를 권합니다.
프로토콜은 아래의 글을 참고하여 주십시오.
소스를 보니 시리얼 프로그램이라기 보다는 tcp 통신 프로그램이라는 생각이 듭니다.
시리얼로 파일을 전송하기위해서는 고려해야할 사항이 많습니다.
이유는 시리얼 통신은 물리적으로 에러가 발생할 확률이 많이 때문입니다.
작은 파일을 보내는것은 에러가 적어서 될수 있지만 조금 큰 파일은 안되는게 당연합니다.
시리얼 통신은 우선 패켓의 시작 과 끝을 분석한 후 데이타를 얻어야 합니다.
파일 이름을 보내기 위해서 예약된 명령어로 파일이름을 보내야 하며 파일 크기도 이런 규약에 의해 보내져야 합니다.
보통 이런것을 프로토콜 이라고 하죠
시리얼일 경우 패켓은 짧게 보내시는게 에러가 날 확률이 줄어듭니다. 그리고 상대편이 에러없이 받았는지 확인하는 절차도
필요합니다.
TCP,UDP 통신보다 코딩하기가 어려운게 시리얼 프로그램입니다. ^^
소스에 대한 설명 보다도 먼저 간단한 문자 전송이라도 테스트해 보셨나요?
ARM 키트 2개를 직접 연결하셨다면, 키트끼리 송수신해서 테스트하지 마시고,
키트랑 개발에 사용하시는 PC와 먼저 테스트해 보십시오. 통신이 되나요?