도와주세요!!
글 수 15,339
2007.10.17 16:32:24 (*.238.1.157)
7132
시리얼로 파일을 주고 받기위해서 일단 테스트 삼아 만들어본건데 문제가 많습니다.
깨진 문자가 들어가고
파일이 전부 다 전송되지 않고
원본 파일과 줄바꿈 위치가 다릅니다.
받는 쪽에서 일단 동작하고 보내는 쪽에서 파일을 오픈하여 전송하는 방식입니다.
한번 확인 해주셨으면 합니다.
받는 쪽 소스
========================================
#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 lFilesize = 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("%snn %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;
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);
}
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;
}
===========================================
깨진 문자가 들어가고
파일이 전부 다 전송되지 않고
원본 파일과 줄바꿈 위치가 다릅니다.
받는 쪽에서 일단 동작하고 보내는 쪽에서 파일을 오픈하여 전송하는 방식입니다.
한번 확인 해주셨으면 합니다.
받는 쪽 소스
========================================
#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 lFilesize = 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("%snn %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;
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);
}
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;
}
===========================================
2007.10.18 13:03:12 (*.163.173.201)
fread(serial_buf, sizeof(char), buffsize, fd);
형식으로 바꾸니 문제가 어느 정도 해결되었습니다.
테스트를 할때 한개의 컴퓨터에서 시리얼 포트 1 과 시리얼 포트 2를 서로 연결해서 테스트 했습니다. 정상적으로 파일이 전송이 이루어졌습니다.
그런데 QNX ( 리눅스 / 유닉스 계열의 RTOS )와 리눅스가 각각 설치된 다른 컴퓨터에서 시리얼 통신을 했더니 똑같은 프로그램이 다 전송이 안되는 군요
컴 1 : 윈도우에서 vmware로 QNX
컴 2 : 리눅스
다른 컴퓨터끼리 시리얼통신 할 경우 같은 컴에서 테스트 한것에비해
안정적이지 못한 이유에서 인지
vmware 환경 문제 인지
운영체제 문제 인지
알 수 가 없네요
QNX에서도 기본적인 gcc 나 표준 라이브러리를 사용할 수 있는데 말이죠 .
형식으로 바꾸니 문제가 어느 정도 해결되었습니다.
테스트를 할때 한개의 컴퓨터에서 시리얼 포트 1 과 시리얼 포트 2를 서로 연결해서 테스트 했습니다. 정상적으로 파일이 전송이 이루어졌습니다.
그런데 QNX ( 리눅스 / 유닉스 계열의 RTOS )와 리눅스가 각각 설치된 다른 컴퓨터에서 시리얼 통신을 했더니 똑같은 프로그램이 다 전송이 안되는 군요
컴 1 : 윈도우에서 vmware로 QNX
컴 2 : 리눅스
다른 컴퓨터끼리 시리얼통신 할 경우 같은 컴에서 테스트 한것에비해
안정적이지 못한 이유에서 인지
vmware 환경 문제 인지
운영체제 문제 인지
알 수 가 없네요
QNX에서도 기본적인 gcc 나 표준 라이브러리를 사용할 수 있는데 말이죠 .
vi 로 열었을 때 위와 같이 저장된것을 볼 수 있습니다.
#include <stdio.h>
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@#include <stdlib.h>
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@#include <unistd.h>
......
생략
.....
bzero(serial_buf,MA^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
~
more 로 열었을 때 위와 같이 저장된것을 볼 수 있습니다.
#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 B11
5200
#define MODEMDEVICE
"/dev/ttyUSB0"
#define _POSIX_SOURC
E 1
....( 생략 )
cat 으로 열었을 때 위와 같이 저장된것을 볼 수 있습니다.
#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/ttyUSB0"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1
#define CRTSCTS 020000000000
#define MAX 255
#define DATA_MAX 20
#define GET_DONE 0
.... (생략 )
다 저장되지 않습니다.
zmodem을 사용하는 방법은 어렵나요?
참고할 만한 소스나 자료있으면 알려주시면 감사하겠습니다.