using this code, i am trying for sending file to CC430f5137 and receive back from it. I am using 2 programs, one is the below program( it is for sending and receiving back file to my linux VM and other one is program for the CC430f5137(it contains rx, tx code for my device which is in windows). I could able to send a single byte(for ex,A) from a file to my device but not multiple bytes.
//sample1.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/signal.h>
#include <sys/ioctl.h>
#include <sys/poll.h>
#include <termios.h>
#define BUFSIZE 1300 //1
int open_serial( char *dev_name, int baud, int vtime, int vmin )
{
int fd;
struct termios newtio;
fd = open( dev_name, O_RDWR | O_NOCTTY );
if ( fd < 0 )
{
printf( "Device OPEN FAIL %s\n", dev_name );
return -1;
}
memset(&newtio, 0, sizeof(newtio));
newtio.c_iflag = IGNPAR|INLCR; // non-parity void UARTHandler(int fd);
newtio.c_oflag = 0;
newtio.c_cflag = CS8 | CLOCAL | CREAD; // NO-rts/cts
switch( baud )
{
case 115200 : newtio.c_cflag |= B115200; break;
case 57600 : newtio.c_cflag |= B57600; break;
case 38400 : newtio.c_cflag |= B38400; break;
case 19200 : newtio.c_cflag |= B19200; break;
case 9600 : newtio.c_cflag |= B9600; break;
case 4800 : newtio.c_cflag |= B4800; break;
case 2400 : newtio.c_cflag |= B2400; break;
default : newtio.c_cflag |= B115200; break;
}
//set input mode (non-canonical, no echo,.....)
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = vtime;
newtio.c_cc[VMIN] = vmin;
tcflush ( fd, TCIFLUSH );
tcsetattr( fd, TCSANOW, &newtio );
return fd;
}
int sendfile(int fd) //void sendfile(int fd)
{
int fd1,readc;
unsigned short fileLength;
unsigned char buf[BUFSIZE];
fd1=open("cert.pem",O_RDONLY);
fileLength=lseek(fd1,0,SEEK_END);
printf("file length is %d bytes\n",fileLength);
lseek(fd1,0,SEEK_SET);
write(fd,(unsigned char*)&fileLength, 2);
while(fileLength>0)
{
if(fileLength>=BUFSIZE)
{
readc=read(fd1,buf,BUFSIZE);
if(readc==-1)
{
printf("read failed!!\n");
}
if(read>0)
{
buf[BUFSIZE]='\0';
printf("%s\n",buf);
if(write(fd,buf,BUFSIZE))
fileLength -= BUFSIZE;
}
}
else
{
readc=read(fd1,buf,fileLength);
if(readc==-1)
{
printf("read failed!!\n");
}
if(readc>0)
{
buf[fileLength]='\0';
printf("%s\n",buf);
if(write(fd, buf, fileLength))
fileLength=0;
}
}
}
printf("%s\n",fd);
printf("file sent succssfully\n");
return fd1;//close(fd1);
close(fd);
}
void receivefile(int fd)
{
char buf[1300],read_byte,buf2[1300];
int fd2,readc;
unsigned short fileLength;
fd2=open("test.pem", O_WRONLY|O_CREAT);
if(fd2<0)
{
printf("file open failed!!\n");
}
while(!(read(fd,(unsigned char*)&fileLength,2)>0));
printf("i am in receive file\n");
while(fileLength>0)
{
readc = read(fd, buf, BUFSIZE);
if(readc==-1)
{
printf("read failed!!\n");
}
printf("read %d bytes, value is %s\n",readc,buf);
if(readc >0)
{
buf[readc]='\0';
printf("buf value is%s\n", buf);
write(fd2,buf,readc);
fileLength -= readc;
}
}
close(fd2);
close(fd);
}
void close_serial( int fd )
{
close( fd );
printf("ClosePort!!\n");
}
int main( int argc, char **argv )
{
int fd;
int baud;
char dev_name[128];
if ( argc != 3)
{
printf( " sample_serial [device] [baud]\n" \
" device : /dev/ttySAC0 ...\n" \
" baud : 2400 ... 115200\n" );
return -1;
}
printf( " Serial test start... (%s)\n", __DATE__ );
strcpy( dev_name, argv[1] );
baud = strtoul( argv[2], NULL, 10 );
fd = open_serial( dev_name, baud, 4, 1);
sendfile(fd);
receivefile(fd);
close_serial( fd );
printf( " Serial test end\n" );
return 0;
}
this is output of sending 1 byte from the file to serial port
[root@localhost ~]# gcc -std=c99 -std=gnu99 sample1.c -o out1
sample1.c:151:50: warning: backslash and newline separated by space
sample1.c:152:45: warning: backslash and newline separated by space
[root@localhost ~]# ./out1 /dev/ttyUSB20 115200
Serial test start... (Mar 6 2013)
file length is 2 bytes
A
wrote 3 bytes
file sent succssfully
i am in receive file
read 1 bytes, value is A
buf value isA
read 1 bytes, value is A
buf value isA
read 1 bytes, value is A
buf value isA
read 1 bytes, value is A
buf value isA
this is output of sending multiple bytes from the file to serial port
[root@localhost ~]# gcc -std=c99 -std=gnu99 sample1.c -o out1
sample1.c:151:50: warning: backslash and newline separated by space
sample1.c:152:45: warning: backslash and newline separated by space
[root@localhost ~]# ./out1 /dev/ttyUSB20 115200
Serial test start... (Mar 6 2013)
file length is 2 bytes
i am doing well today
wrote 3 bytes
file sent succssfully
i am in receive file
read 1 bytes, value is
buf value is
read 1 bytes, value is
buf value is
read 1 bytes, value is
buf value is
read 1 bytes, value is
buf value is
As you see here, i am not getting file contents, i am receving null characters back from my device, even though i sent multiple bytes to my device.
sendfile() is working properly,i can able to write "cert.pem" to port.I have a problem with reading file from port and writing back to "test.pem".I am getting output of some print statement given in the receiver program, but getting data continuously.flagsettings are in a proper way. I have reset all connections also.
You are doing it wrong - instead of re-inventing a solution to the problem of sending binary file over serial links, use the already existing standard solutions, such as ZMODEM
When you do, you wont have to write the Linux side program, since a free program to this already exists and you would be able to port an existing program to your CC430f5137, whatever that is.
Let's start with the obvious.
a : Sendfile
doesn't have any looping construct in it...
b: buffer overruns, like this:
unsigned char buf[BUFSIZE];
...
buf[BUFSIZE]=0
c: You have debug like this 'read 1 bytes, value is A' but it's not in the code. Difficult to fix code you haven't posted...
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.