串口通讯

源程序:

#include     <stdio.h>      /*标准输入输出定义*/
#include     <stdlib.h>     /*标准函数库定义*/
#include     <unistd.h>     /*Unix标准函数定义*/
#include     <sys/types.h>  /**/
#include     <sys/stat.h>   /**/
#include     <fcntl.h>      /*文件控制定义*/
#include     <termios.h>    /*PPSIX终端控制定义*/
#include     <errno.h>      /*错误号定义*/
#include     <time.h>
#include     <memory.h> 

#define BAUDRATE B9600
#define DEVICE "/dev/ttyS0"

/*打开串口*/
int OpenDev(char *Dev) {
    int fd = open(Dev, O_RDWR); //| O_NOCTTY | O_NDELAY
    if (-1 == fd) { 
        perror("Can't Open Serial Port");
        return -1;
    } else
        return fd;

}
/*串口设置*/
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
	struct termios newtio,oldtio;
        /*保存原先配置,以测试配置是否正确、该串口是否可用等。调试成功,函数返回0,失败,函数返回-1*/
	if  ( tcgetattr( fd,&oldtio)  !=  0) { 
		perror("SetupSerial 1");
		return -1;
	}
	//bzero( &newtio, sizeof( newtio ) );
        memset(&newtio,0,sizeof(newtio));
        /*忽略一切调制解调器状态行,激活字符接受回执功能,CLOCAL用于本地链接,CREAD用于接受使能*/
	newtio.c_cflag  |=  CLOCAL | CREAD;
        /*设置字符大小,没有现成可用函数,需要位掩码。一般先去除数据位中的位掩码,再重新按要求设置。*/
	newtio.c_cflag &= ~CSIZE;
	switch( nBits )
	{
	case 7:  /*在发送和接收字符时使用7个二进制位*/
		newtio.c_cflag |= CS7;
		break;
	case 8: /*在发送和接收字符时使用8个二进制位*/
		newtio.c_cflag |= CS8;
		break;
	}
        /*设置奇偶校验位*/
	switch( nEvent )
	{
	case 'O':/*使能奇校验*/
		newtio.c_cflag |= PARENB;//激活校验码的生成和检测功能
		newtio.c_cflag |= PARODD;//使用奇校验而不是偶校验
		newtio.c_iflag |= (INPCK | ISTRIP);//INPCK对接收到的字符进行奇偶校验,ISTRIP把所有接收到的字符都设为7位二进制位
		break;
	case 'E': 
		newtio.c_iflag |= (INPCK | ISTRIP);
		newtio.c_cflag |= PARENB;
		newtio.c_cflag &= ~PARODD;//使用偶校验
		break;
	case 'N':  
		newtio.c_cflag &= ~PARENB;//无校验位
		break;
	}
        /*设置波特率*/
	switch( nSpeed )
	{
	case 2400:/*成功时返回0,失败-1*,进出波特率一样*/
		cfsetispeed(&newtio, B2400);
		cfsetospeed(&newtio, B2400);
		break;
	case 4800:
		cfsetispeed(&newtio, B4800);
		cfsetospeed(&newtio, B4800);
		break;
	case 9600:
		cfsetispeed(&newtio, B9600);
		cfsetospeed(&newtio, B9600);
		break;
	case 115200:
		cfsetispeed(&newtio, B115200);
		cfsetospeed(&newtio, B115200);
		break;
	case 460800:
		cfsetispeed(&newtio, B460800);
		cfsetospeed(&newtio, B460800);
		break;
	default:
		cfsetispeed(&newtio, B9600);
		cfsetospeed(&newtio, B9600);
		break;
	}
        /*设置停止位,CSTOPB每个字符使用两个停止位而不是一个*/
	if( nStop == 1 )
		newtio.c_cflag &=  ~CSTOPB;//使用一个停止位
	else if ( nStop == 2 )
	newtio.c_cflag |=  CSTOPB;
        /*设置等待时间和最小接收字符*/
	newtio.c_cc[VTIME] =0;
	newtio.c_cc[VMIN] =100;
        /*处理要写入的引用对象,刷新收到的数据不读取*/
	tcflush(fd,TCIFLUSH);
        /*激活配置,激活的配置立即生效*/
	if((tcsetattr(fd,TCSANOW,&newtio))!=0)
	{
		perror("com set error");
		return -1;
	}
	printf("set done!\n");
	return 0;
}

int main()
{
  int fd1,fd2,nread,nset;
  char buf[100];
  char buf1[1];
  fd1=open("/dev/ttyUSB0",O_RDWR);
  if(fd1==-1)
  {
     printf("Open serial fasiled!\n");
     exit(1);
   }
  else
   {
   printf("Open serial successful!\n");
             
   }
  fd2=open("1.txt",O_RDWR);
        if(fd2==-1)
               {
                printf("Open 1.txt failed!\n");
                exit(1);
                }
  nset=set_opt(fd1,9600,8,'N',1);
	if(nset==-1)
		exit(1);
  
 while(1)
{
   nread=read(fd1,buf,100);
   printf("字节个数为%d \n",nread);
   printf("读取字节为%s \n",buf);
   
   if(nread>0)
	write(fd2,buf,nread);
   
 }
 
   close(fd1);
   close(fd2);
   return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值