도와주세요!!
글 수 15,339
2007.08.08 22:53:25 (*.212.137.28)
6657
안녕하세요. 말씀을 들어 보니 프로토콜 문제로 생각됩니다.
영문 문자열이라면 0x00부터 0x1f까지는 통신을 위한 분류코드로 이용하고 나머지 0x20부터 0xff까지는
문자 데이터로 처리하여 통신할 수 있겠습니다만,
한글이나 파일을 전송하기 위해서는 바이트를 전송하더라도 8 bit 모두 사용할 수 있도록 전송해야 겟습니다.
이렇게 하기 위해서는 강좌에 올려드린 DLE 코드를 이용한 프로토콜을 권해 드립니다.
http://forum.falinux.com/bbs/zboard.php?id=lecture2&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=dle&select_arrange=headnum&desc=asc&no=167
이 DLE프로토콜을 이용하시면 모든 비트를 데이터로 전송할 수 있기 때문에
0x20 이상만 사용하는 영문 이든 8bit를 모두 사용하는 한글이든 파일이든 간에 문제없이
전송할 수 있습니다.
이 DLE 프로토콜을 이용하여 파일을 전송하는 방법에도 여러 가지가 있습니다만
파일의 크기가 천차만별이므로 서로 버퍼의 크기에 맞추어 파일을 부분부분으로 나누어 전송하게 됩니다.
가장 간단한 방법은,
1. 전송하는 쪽: 첫번째 파일 전송 전에 파일에 대한 정보, 이름, 크기 등을 전송합니다.
2. 수신하는 쪽: 상대방에서 전송을 허락합니다.
3. 전송하는 쪽: 파일을 버퍼의 크기에 맞추어, 예로 서로 한번에 1024byte씩 전송하겠다고 한다면
1024byte를 읽어서 전송합니다.
물론, 전송되는 데이터의 크기는 시작과 종료, 그리고 CRC때문에 1024byte보다
크며, 또한 DLE코드의 중복으로 1024보다 2배가 될 수 있으므로 전송 크기와 버퍼 크기는
적당한 크기로 잡으셔야합니다.
4. 수신하는 쪽: 상대방은 첫번째 전문에서 파일에 대한 정보를 알고 있고,
파일의 크기를 알고 있으므로
자료를 수신 후에 파일의 전체 크기를 확인합니다.
모두 읽었다면 수신을 종료합니다.
아직 모두 받지 못했다면 상대에게 다음 자료를 요청합니다.
5. 전송하는 쪽: 상대방으로부터 다음 자료를 요청 받으면 파일의 다음 부분을 읽어서 전송해 줍니다.
여기서 안정성을 높이기 위해 조금씩 추가하다 보면 더 복잡해시고 커질 수 있습니다. DLE코드는 8bit 데이터를
안전하게 보내주는 프로토콜이지만 자료에 DLE코드인 0x10 바이트가 많다면 전송 데이터가 길어지는 단점이 있습니다.
그러나 DLE코들 사용했을 때, 지금까지 아무 탈 없이 사용해온 것으로 보아도 즉, 경험 상으로도 권하고 싶습니다.
>안녕하세요..
>항상 좋은 정보 감사드립니다..
>시리얼 통신 강좌를 잘 보았는데요,
>
>시리얼로 파일을 전송하고자 하는데
>너무 막막하여 이렇게 질문 드립니다.
>
>제가 하려고 하는 것은 블루투스를 이용하여
>보드에서 보드로 이미지 파일을 전송하여
>화면에 띄우려는 것인데요..
>
>여기 저기 예제들을 보면 다 문자만 보내는 예제들이라
>파일을 보낼 땐 어떻게 해야 하는지 잘 모르겠습니다.
>
>시리얼로 먼저 파일이름을 전송하고,
>그 파일이름으로 파일을 생성해서
>이미지파일을 한 자 한 자씩 write를 통해 받아야 하는지,
>아니면 다른 방법이 있는지 궁금합니다..
영문 문자열이라면 0x00부터 0x1f까지는 통신을 위한 분류코드로 이용하고 나머지 0x20부터 0xff까지는
문자 데이터로 처리하여 통신할 수 있겠습니다만,
한글이나 파일을 전송하기 위해서는 바이트를 전송하더라도 8 bit 모두 사용할 수 있도록 전송해야 겟습니다.
이렇게 하기 위해서는 강좌에 올려드린 DLE 코드를 이용한 프로토콜을 권해 드립니다.
http://forum.falinux.com/bbs/zboard.php?id=lecture2&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=dle&select_arrange=headnum&desc=asc&no=167
이 DLE프로토콜을 이용하시면 모든 비트를 데이터로 전송할 수 있기 때문에
0x20 이상만 사용하는 영문 이든 8bit를 모두 사용하는 한글이든 파일이든 간에 문제없이
전송할 수 있습니다.
이 DLE 프로토콜을 이용하여 파일을 전송하는 방법에도 여러 가지가 있습니다만
파일의 크기가 천차만별이므로 서로 버퍼의 크기에 맞추어 파일을 부분부분으로 나누어 전송하게 됩니다.
가장 간단한 방법은,
1. 전송하는 쪽: 첫번째 파일 전송 전에 파일에 대한 정보, 이름, 크기 등을 전송합니다.
2. 수신하는 쪽: 상대방에서 전송을 허락합니다.
3. 전송하는 쪽: 파일을 버퍼의 크기에 맞추어, 예로 서로 한번에 1024byte씩 전송하겠다고 한다면
1024byte를 읽어서 전송합니다.
물론, 전송되는 데이터의 크기는 시작과 종료, 그리고 CRC때문에 1024byte보다
크며, 또한 DLE코드의 중복으로 1024보다 2배가 될 수 있으므로 전송 크기와 버퍼 크기는
적당한 크기로 잡으셔야합니다.
4. 수신하는 쪽: 상대방은 첫번째 전문에서 파일에 대한 정보를 알고 있고,
파일의 크기를 알고 있으므로
자료를 수신 후에 파일의 전체 크기를 확인합니다.
모두 읽었다면 수신을 종료합니다.
아직 모두 받지 못했다면 상대에게 다음 자료를 요청합니다.
5. 전송하는 쪽: 상대방으로부터 다음 자료를 요청 받으면 파일의 다음 부분을 읽어서 전송해 줍니다.
여기서 안정성을 높이기 위해 조금씩 추가하다 보면 더 복잡해시고 커질 수 있습니다. DLE코드는 8bit 데이터를
안전하게 보내주는 프로토콜이지만 자료에 DLE코드인 0x10 바이트가 많다면 전송 데이터가 길어지는 단점이 있습니다.
그러나 DLE코들 사용했을 때, 지금까지 아무 탈 없이 사용해온 것으로 보아도 즉, 경험 상으로도 권하고 싶습니다.
>안녕하세요..
>항상 좋은 정보 감사드립니다..
>시리얼 통신 강좌를 잘 보았는데요,
>
>시리얼로 파일을 전송하고자 하는데
>너무 막막하여 이렇게 질문 드립니다.
>
>제가 하려고 하는 것은 블루투스를 이용하여
>보드에서 보드로 이미지 파일을 전송하여
>화면에 띄우려는 것인데요..
>
>여기 저기 예제들을 보면 다 문자만 보내는 예제들이라
>파일을 보낼 땐 어떻게 해야 하는지 잘 모르겠습니다.
>
>시리얼로 먼저 파일이름을 전송하고,
>그 파일이름으로 파일을 생성해서
>이미지파일을 한 자 한 자씩 write를 통해 받아야 하는지,
>아니면 다른 방법이 있는지 궁금합니다..