시리얼로 파일 전송 프로그램 - 문제 ;;
글쓴이: lukep2s / 작성시간: 수, 2007/10/17 - 4:21오후
시리얼로 파일을 주고 받기위해서 일단 테스트 삼아 만들어본건데 문제가 많습니다.
깨진 문자가 들어가고
파일이 전부 다 전송되지 않고
원본 파일과 줄바꿈 위치가 다릅니다.
받는 쪽에서 일단 동작하고 보내는 쪽에서 파일을 오픈하여 전송하는 방식입니다.
한번 확인 해주셨으면 합니다.
받는 쪽 소스 ======================================== #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #include <fcntl.h> #include <termios.h> #include <stddef.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <errno.h> #include <time.h> #define BAUDRATE B115200 #define MODEMDEVICE "/dev/ttyS0" #define _POSIX_SOURCE 1 #define FALSE 0 #define TRUE 1 #define CRTSCTS 020000000000 #define MAX 255 #define DATA_MAX 20 #define GET_DONE 0 //////////////////////// FILE *fp1; FILE *fp2; long buffsize = 0; long rFilesize = 0; char serial_buf[MAX]; int fd; int res; struct termios oldtio,newtio; ////////////////////////////////////////////////////////////////// void serial_open() { fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); if (fd <0) {perror(MODEMDEVICE); exit(-1); } tcgetattr(fd,&oldtio); bzero(&newtio, sizeof(newtio)); newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; newtio.c_iflag = ICRNL; newtio.c_lflag = ICANON; tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio); } void serial_close() { tcsetattr(fd,TCSANOW,&oldtio); close(fd); } int get_data () { fp2 = fopen("c","wb"); // 파일을 복사할때는 binary 모드로 여는 편이 좋아요 rFilesize = 72; while(rFilesize > 0) // 파일 크기만큼 반복 { fread(serial_buf, buffsize, 1,fd); printf("1%s1",serial_buf); write(fp2,serial_buf, sizeof(serial_buf)); rFilesize --; bzero(serial_buf,MAX); } return 0; } int main() { serial_open(); fp2 = fopen("c","wb"); res =0; while( read(fd,serial_buf,DATA_MAX)) { printf("%s\n\n %d",serial_buf,res); fwrite(serial_buf,MAX-50,1,fp2); bzero(serial_buf,MAX); } return 0; }
===========================================
보내는 쪽 소스
========================================
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #include <fcntl.h> #include <termios.h> #include <stddef.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <errno.h> #include <time.h> #define BAUDRATE B115200 #define MODEMDEVICE "/dev/ttyS1" #define _POSIX_SOURCE 1 #define FALSE 0 #define TRUE 1 #define CRTSCTS 020000000000 #define MAX 255 #define DATA_MAX 20 #define GET_DONE 0 //////////////////////// FILE *fp1; FILE *fp2; long buffsize = 0; long lFilesize = 0; char serial_buf[MAX]; int fd; int res; struct termios oldtio,newtio; ////////////////////////////////////////////////////////////////// void serial_open() { fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); if (fd <0) {perror(MODEMDEVICE); exit(-1); } tcgetattr(fd,&oldtio); bzero(&newtio, sizeof(newtio)); newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; newtio.c_iflag = ICRNL; newtio.c_lflag = ICANON; tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio); } void serial_close() { tcsetattr(fd,TCSANOW,&oldtio); close(fd); } void send_data( ) { fp1 = fopen("a","rb"); if( fp1 == NULL ) { exit(0); } fseek(fp1, 0, 2); lFilesize = ftell(fp1); fseek(fp1, 0, 0); res = 0; while(lFilesize > 0) { if(lFilesize > DATA_MAX) buffsize = DATA_MAX; else buffsize = lFilesize; fread(serial_buf, buffsize,1,fp1); printf ( "%s",serial_buf); write(fd,serial_buf,buffsize); lFilesize -= buffsize; bzero(serial_buf,MAX); } bzero(serial_buf,MAX); fclose(fp1); } int main() { serial_open(); send_data(); return 0; }
===========================================
Forums:
보내는 쪽 프로그램
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
vi로 전송된 파일을 열었을때 이런 문자가 들어간 것을 확인할 수 있습니다.
cat 으로 열 경우 정상적으로 출력되어 보입니다.
zmodem을 사용하는 방법은 어렵나요?
참고할 만한 소스나 자료있으면 알려주시면 감사하겠습니다.
int get_data () {
int get_data ()
{
fp2 = fopen("c","wb"); // 파일을 복사할때는 binary 모드로 여는 편이 좋아요
rFilesize = 72;
while(rFilesize > 0) // 파일 크기만큼 반복
{
fread(serial_buf, buffsize, 1,fd);
printf("1%s1",serial_buf);
write(fp2,serial_buf, sizeof(serial_buf));
rFilesize --;
bzero(serial_buf,MAX);
}
return 0;
}
fread()를 read(), write()를 fwrite() 여기가 좀 이상하네요.
아마도 오타 이신듯..
파일을 바이너리로 읽어올 때
댓글 감사합니다.
파일을 바이너리로 오픈하고
읽거나 쓸때 fread 와 fwrite를 써야 이상 없이 잘 되더라구요
fread 후 write를 한거는 파일에서 열어서 시리얼로 쓰고
read 후 fwrite를 한거는 시리얼에서 열어서 파일로 쓰기 위함입니다.
fread 가 좀 이상하군요;;
그냥 한번 쭉 보다가 발견한 것이라 다른 부분은 모르겠습니다만,
일단 발견한 것은 fread함수를 잘못 사용하신 것 같습니다.
fread(변수,변수형의크기,데이터크기,파일핸들러) 와 같이 사용하셔야 할꺼 같은데요;;
joinc에 나온 예제를 올려드리자면..
이런 식이므로..
를
로 변경해야 될것 같습니다..
쓰레기값이 나왔던 문제가 해결되었습니다.
알려주신대로 사용하니 쓰레기 값이 사라지고
정상적인 줄바꿈도 일어납니다.
테스트를 할때 한개의 컴퓨터에서 시리얼 포트 1 과 시리얼 포트 2를 서로 연결해서 테스트 했습니다. 정상적으로 파일이 전송이 이루어졌습니다.
그런데 QNX ( 리눅스 / 유닉스 계열의 RTOS )와 리눅스가 각각 설치된 다른 컴퓨터에서 시리얼 통신을 했더니 똑같은 프로그램이 다 전송이 안되는 군요
컴 1 : 윈도우에서 vmware로 QNX
컴 2 : 리눅스
다른 컴퓨터끼리 시리얼통신 할 경우 같은 컴에서 테스트 한것에비해
안정적이지 못한 이유에서 인지
vmware 환경 문제 인지
운영체제 문제 인지
알 수 가 없네요
QNX에서도 기본적인 gcc 나 표준 라이브러리를 사용할 수 있는데 말이죠 .
댓글 달기