C程序到Linux串口读写 [英] C program to Linux Serial port read write

查看:111
本文介绍了C程序到Linux串口读写的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,

我是C和Linux的新手

我在linux上写了一个C串口程序,从ttyusb读取.txt文件并保存到另一个.txt文件。我的程序没有按预期工作



有一个名为sample.txt的文本文件,其中包含以下文本



sample.txt



欢迎

to

oviya技术

bangalore



我想通过ttyUSB0将此文件发送到另一台PC,我有一个接收器程序接收此数据并将其写入名为zname.txt的文件。在接收方,我无法完全接收数据



为了您的参考,我附上了 send.c和receive.c 代码而且我得到的输出,任何人都可以告诉我这有什么问题吗?



输出



hi all,
I am new to C and linux
I wrote a C serial port program in linux to read the .txt file from ttyusb and to save this to a another .txt file. My program doesn't work as i expected

There is a text file named "sample.txt" which contains the following text

sample.txt
hi
welcome
to
oviya technologies
bangalore

I want to send this file through ttyUSB0, to another PC, there i am having a receiver program to receive this data and write it to a file called "zname.txt". In the receiver side i cant able to receive the data fully

For your reference i have attached the send.c and receive.c code and also the output i am getting, can any one tell me what is wrong in this?

OUTPUT

./send

root@oviserver-desktop:/home/oviserver/shanmugam# ./send 
Oviya 3
enter write
Start send
FIle sent successfully 44 bytes

./receive

oviserver@oviserver-System-Product-Name:/home/sathish$ ./receive
oviya :3
1 h
1 i
1

1 w
1 e
1 l
1 c
1 o
1 m
1 e
1

1 t
1 o
1









SEND.C







SEND.C

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>



        
#define BAUDRATE B115200 
#define MODEMDEVICE "/dev/ttyUSB0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1

FILE *file;
int fileLen;
char *tmpbuffer;
void openport(void);
void readport(void);
void sendport(void);
int fd=0;
struct termios oldtp, newtp;
//char sendcmd1[256]="\0";
char buffer[512];

void main()
{


	openport();
	sleep(1);
//	readport();
	sendport();




}

void sendport(void)
{
        printf("enter write\n");
        int n;
     //   sem_wait(&len);
                file = fopen("sample.txt", "r");

                //get file size

                fseek(file, 0, SEEK_END);
                fileLen = ftell(file);
                fseek(file, 0, SEEK_SET);

                tmpbuffer = (char *)malloc(fileLen + 1);

                //read file contents
                printf("Start send\n");
                fread(tmpbuffer, fileLen, 1, file);
                fclose(file);

                n = write(fd, tmpbuffer, fileLen + 1);

                if (n < 0)
                {
                        fputs("write() of bytes failed!\n", stderr);
                }
                else
                {
                        printf("Image sent successfully %d\n",n);
                }
                close(fd);

}

void openport(void)
{
         fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY |O_NDELAY );
	printf("Oviya %d\n",fd);
         if (fd <0)
         {
         perror(MODEMDEVICE);         }
                                                                                
         fcntl(fd,F_SETFL,0);
        tcgetattr(fd,&oldtp); /* save current serial port settings */
        // tcgetattr(fd,&newtp); /* save current serial port settings */
         bzero(&newtp, sizeof(newtp));
        // bzero(&oldtp, sizeof(oldtp));
                                                                                
         newtp.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
                                                                                
         newtp.c_iflag = IGNPAR | ICRNL;
                                                                                
         newtp.c_oflag = 0;
                                                                                
         newtp.c_lflag = ICANON;
                                                                                
         newtp.c_cc[VINTR]    = 0;     /* Ctrl-c */
         newtp.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
         newtp.c_cc[VERASE]   = 0;     /* del */
         newtp.c_cc[VKILL]    = 0;     /* @ */
         //newtp.c_cc[VEOF]     = 4;     /* Ctrl-d */
         newtp.c_cc[VEOF]     = 0;     /* Ctrl-d */
         newtp.c_cc[VTIME]    = 0;     /* inter-character timer unused */
         newtp.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
         newtp.c_cc[VSWTC]    = 0;     /* '\0' */
         newtp.c_cc[VSTART]   = 0;     /* Ctrl-q */
         newtp.c_cc[VSTOP]    = 0;     /* Ctrl-s */
         newtp.c_cc[VSUSP]    = 0;     /* Ctrl-z */
         newtp.c_cc[VEOL]     = 0;     /* '\0' */
         newtp.c_cc[VREPRINT] = 0;     /* Ctrl-r */
         newtp.c_cc[VDISCARD] = 0;     /* Ctrl-u */
         newtp.c_cc[VWERASE]  = 0;     /* Ctrl-w */
         newtp.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
         newtp.c_cc[VEOL2]    = 0;     /* '\0' */
                                                                                
                                                                                
   //     tcflush(fd, TCIFLUSH);
//	tcsetattr(fd,TCSANOW,&newtp);
}





RECEIVE.c





RECEIVE.c

#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>        
#include <stdlib.h> 
#define BAUDRATE B115200 
#define MODEMDEVICE "/dev/ttyUSB0"/*UART NAME IN PROCESSOR*/
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
void openport(void);
void sendport(void);
void readport(void);
int fd=0, n;
static int cnt, size, s_cnt;
unsigned char *var;
struct termios oldtp, newtp;
char sendcmd1[10]="\0";
FILE *file;

void  readport(void)
{
	unsigned char buff;
	file = fopen( "zname.txt", "w+" );
while (1) { 
  n = read(fd, &buff, 1);
//	fcntl(fd,F_SETFL,0);
  if (n == -1) switch(errno) {
         case EAGAIN: /* sleep() */ 
            continue;
          
         default: goto quit;
         }
  if (n ==0) break;
  fputc(buff, file);
  printf("%d %c\n", n,buff);
  }
quit:
   fclose (file);
}
void openport(void)
{
         
	 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY |O_NDELAY );
	 printf("oviya :%d\n",fd);
         if (fd <0)
         {
         	perror(MODEMDEVICE);

         }
                                                                                
         fcntl(fd,F_SETFL,0);
         tcgetattr(fd,&oldtp); /* save current serial port settings */
    //     tcgetattr(fd,&newtp); /* save current serial port settings */
         bzero(&newtp, sizeof(newtp));
  //       bzero(&oldtp, sizeof(oldtp));
                                                                                
         newtp.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
                                                                                
         newtp.c_iflag = IGNPAR | ICRNL;
                                                                                
         newtp.c_oflag = 0;                                                                        
         newtp.c_lflag = ICANON;                                                                    
         newtp.c_cc[VINTR]    = 0;     /* Ctrl-c */
         newtp.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
         newtp.c_cc[VERASE]   = 0;     /* del */
         newtp.c_cc[VKILL]    = 0;     /* @ */
        // newtp.c_cc[VEOF]     = 4;     /* Ctrl-d */
         newtp.c_cc[VTIME]    = 0;     /* inter-character timer unused */
         newtp.c_cc[VMIN]     = 0;     /* blocking read until 1 character arrives */
         newtp.c_cc[VSWTC]    = 0;     /* '\0' */
         newtp.c_cc[VSTART]   = 0;     /* Ctrl-q */
         newtp.c_cc[VSTOP]    = 0;     /* Ctrl-s */
         newtp.c_cc[VSUSP]    = 0;     /* Ctrl-z */
         newtp.c_cc[VEOL]     = 0;     /* '\0' */
         newtp.c_cc[VREPRINT] = 0;     /* Ctrl-r */
         newtp.c_cc[VDISCARD] = 0;     /* Ctrl-u */
         newtp.c_cc[VWERASE]  = 0;     /* Ctrl-w */
         newtp.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
         newtp.c_cc[VEOL2]    = 0;     /* '\0' */
   	                                                                                                                                             
//	  tcflush(fd, TCIFLUSH);
//	 tcsetattr(fd,TCSANOW,&newtp);

}

int  main()
{

	openport();
	readport();
        return 0;
}







谢谢

shan




Thanks
shan

推荐答案

./ receive
oviya: 3
1 h
1 i
1

1 w
1 e
1 l
1 c
1 o
1 m
1 e
1

1 t
1 o
1
./receive oviya :3 1 h 1 i 1 1 w 1 e 1 l 1 c 1 o 1 m 1 e 1 1 t 1 o 1









SEND.C







SEND.C

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>



        
#define BAUDRATE B115200 
#define MODEMDEVICE "/dev/ttyUSB0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1

FILE *file;
int fileLen;
char *tmpbuffer;
void openport(void);
void readport(void);
void sendport(void);
int fd=0;
struct termios oldtp, newtp;
//char sendcmd1[256]="\0";
char buffer[512];

void main()
{


	openport();
	sleep(1);
//	readport();
	sendport();




}

void sendport(void)
{
        printf("enter write\n");
        int n;
     //   sem_wait(&len);
                file = fopen("sample.txt", "r");

                //get file size

                fseek(file, 0, SEEK_END);
                fileLen = ftell(file);
                fseek(file, 0, SEEK_SET);

                tmpbuffer = (char *)malloc(fileLen + 1);

                //read file contents
                printf("Start send\n");
                fread(tmpbuffer, fileLen, 1, file);
                fclose(file);

                n = write(fd, tmpbuffer, fileLen + 1);

                if (n < 0)
                {
                        fputs("write() of bytes failed!\n", stderr);
                }
                else
                {
                        printf("Image sent successfully %d\n",n);
                }
                close(fd);

}

void openport(void)
{
         fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY |O_NDELAY );
	printf("Oviya %d\n",fd);
         if (fd <0)
         {
         perror(MODEMDEVICE);         }
                                                                                
         fcntl(fd,F_SETFL,0);
        tcgetattr(fd,&oldtp); /* save current serial port settings */
        // tcgetattr(fd,&newtp); /* save current serial port settings */
         bzero(&newtp, sizeof(newtp));
        // bzero(&oldtp, sizeof(oldtp));
                                                                                
         newtp.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
                                                                                
         newtp.c_iflag = IGNPAR | ICRNL;
                                                                                
         newtp.c_oflag = 0;
                                                                                
         newtp.c_lflag = ICANON;
                                                                                
         newtp.c_cc[VINTR]    = 0;     /* Ctrl-c */
         newtp.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
         newtp.c_cc[VERASE]   = 0;     /* del */
         newtp.c_cc[VKILL]    = 0;     /* @ */
         //newtp.c_cc[VEOF]     = 4;     /* Ctrl-d */
         newtp.c_cc[VEOF]     = 0;     /* Ctrl-d */
         newtp.c_cc[VTIME]    = 0;     /* inter-character timer unused */
         newtp.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
         newtp.c_cc[VSWTC]    = 0;     /* '\0' */
         newtp.c_cc[VSTART]   = 0;     /* Ctrl-q */
         newtp.c_cc[VSTOP]    = 0;     /* Ctrl-s */
         newtp.c_cc[VSUSP]    = 0;     /* Ctrl-z */
         newtp.c_cc[VEOL]     = 0;     /* '\0' */
         newtp.c_cc[VREPRINT] = 0;     /* Ctrl-r */
         newtp.c_cc[VDISCARD] = 0;     /* Ctrl-u */
         newtp.c_cc[VWERASE]  = 0;     /* Ctrl-w */
         newtp.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
         newtp.c_cc[VEOL2]    = 0;     /* '\0' */
                                                                                
                                                                                
   //     tcflush(fd, TCIFLUSH);
//	tcsetattr(fd,TCSANOW,&newtp);
}





RECEIVE.c





RECEIVE.c

#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>        
#include <stdlib.h> 
#define BAUDRATE B115200 
#define MODEMDEVICE "/dev/ttyUSB0"/*UART NAME IN PROCESSOR*/
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
void openport(void);
void sendport(void);
void readport(void);
int fd=0, n;
static int cnt, size, s_cnt;
unsigned char *var;
struct termios oldtp, newtp;
char sendcmd1[10]="\0";
FILE *file;

void  readport(void)
{
	unsigned char buff;
	file = fopen( "zname.txt", "w+" );
while (1) { 
  n = read(fd, &buff, 1);
//	fcntl(fd,F_SETFL,0);
  if (n == -1) switch(errno) {
         case EAGAIN: /* sleep() */ 
            continue;
          
         default: goto quit;
         }
  if (n ==0) break;
  fputc(buff, file);
  printf("%d %c\n", n,buff);
  }
quit:
   fclose (file);
}
void openport(void)
{
         
	 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY |O_NDELAY );
	 printf("oviya :%d\n",fd);
         if (fd <0)
         {
         	perror(MODEMDEVICE);

         }
                                                                                
         fcntl(fd,F_SETFL,0);
         tcgetattr(fd,&oldtp); /* save current serial port settings */
    //     tcgetattr(fd,&newtp); /* save current serial port settings */
         bzero(&newtp, sizeof(newtp));
  //       bzero(&oldtp, sizeof(oldtp));
                                                                                
         newtp.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
                                                                                
         newtp.c_iflag = IGNPAR | ICRNL;
                                                                                
         newtp.c_oflag = 0;                                                                        
         newtp.c_lflag = ICANON;                                                                    
         newtp.c_cc[VINTR]    = 0;     /* Ctrl-c */
         newtp.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
         newtp.c_cc[VERASE]   = 0;     /* del */
         newtp.c_cc[VKILL]    = 0;     /* @ */
        // newtp.c_cc[VEOF]     = 4;     /* Ctrl-d */
         newtp.c_cc[VTIME]    = 0;     /* inter-character timer unused */
         newtp.c_cc[VMIN]     = 0;     /* blocking read until 1 character arrives */
         newtp.c_cc[VSWTC]    = 0;     /* '\0' */
         newtp.c_cc[VSTART]   = 0;     /* Ctrl-q */
         newtp.c_cc[VSTOP]    = 0;     /* Ctrl-s */
         newtp.c_cc[VSUSP]    = 0;     /* Ctrl-z */
         newtp.c_cc[VEOL]     = 0;     /* '\0' */
         newtp.c_cc[VREPRINT] = 0;     /* Ctrl-r */
         newtp.c_cc[VDISCARD] = 0;     /* Ctrl-u */
         newtp.c_cc[VWERASE]  = 0;     /* Ctrl-w */
         newtp.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
         newtp.c_cc[VEOL2]    = 0;     /* '\0' */
   	                                                                                                                                             
//	  tcflush(fd, TCIFLUSH);
//	 tcsetattr(fd,TCSANOW,&newtp);

}

int  main()
{

	openport();
	readport();
        return 0;
}







Thanks

shan




Thanks
shan


I’m guessing your serial port’s FIFO is limited to 16 bytes.



1. Run receive before running send (perhaps you are - I can’t tell).

2. Modify receive to read more than one character (suggest 16 characters) at a time.

3. Modify receive to linger after the last character for some small amount of time.

4. Define an end-of-transmission mechanism. This could be a special byte value or one of the modem status pins (like DSR/DTR) so that receiver knows when to exit.
I'm guessing your serial port's FIFO is limited to 16 bytes.

1. Run receive before running send (perhaps you are - I can't tell).
2. Modify receive to read more than one character (suggest 16 characters) at a time.
3. Modify receive to linger after the last character for some small amount of time.
4. Define an end-of-transmission mechanism. This could be a special byte value or one of the modem status pins (like DSR/DTR) so that receiver knows when to exit.


这篇关于C程序到Linux串口读写的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆