串口读写程序

 

 //uart_api.c接口函数

//串口设置函数
int set_com_config(int fd,int baud_rate,int data_bits,char parity,int stop_bits)
{
    struct termios new_cfg,old_cfg;
    int speed;
     
    /*保存并测试现有的串口参数设置*/
    if(tcgetattr(fd,&old_cfg)!=0){
        perror("tcgetattr");
        return -1;
    }
 
    /*设置字符大小*/
    new_cfg = old_cfg;
    cfmakeraw(&new_cfg);
    new_cfg.c_cflag &= ~CSIZE;
     
    /**/
     
     
     
     
    switch(baud_rate)
    {
        case 2400:
        {
            speed = B2400;
        }
        break;
        case 4800:
        {
            speed = B4800;
        }
        break;
        case 9600:
        {
            speed = B9600;
        }
        break;
        case 19200:
        {
            speed = B19200;
        }
        break;
        case 38400:
        {
            speed = B38400;
        }
        break;
        case 115200:
        {
            speed = B115200;
        }
        break;
    }
    cfsetispeed(&new_cfg,speed);
    cfsetospeed(&new_cfg,speed);
     
    /*数据位*/
    switch(data_bits)
    {
        case 7:
        {
            new_cfg.c_cflag |=CS7;
        }
        break;
         
        default:
        case 8:
        {
            new_cfg.c_cflag |=CS8;
        }
        break;
    }
     
    /*奇偶校验*/
    switch(parity)
    {
        default:
        case 'n':
        case 'N':
        {
            new_cfg.c_cflag &=~PARENB;
            new_cfg.c_iflag &=~INPCK;
        }
        break;
         
        case 'o':
        case 'O':
        {
            new_cfg.c_cflag |= (PARODD | PARENB);
            new_cfg.c_iflag |= INPCK;
        }
        break;
         
        case 'e':
        case 'E':
        {
            new_cfg.c_cflag |= PARENB;
            new_cfg.c_cflag    &= ~PARODD;
            new_cfg.c_iflag |= INPCK;
        }
        break;
         
        case 's':
        case 'S':
        {
            new_cfg.c_cflag &= ~PARENB;
            new_cfg.c_cflag &= ~CSTOPB;
        }
        break;
    }
     
    /*设置停止位*/
    switch(stop_bits)
    {
        default:
        case 1:
        {
            new_cfg.c_cflag &= ~CSTOPB;
        }
        break;
         
        case 2:
        {
        new_cfg.c_cflag |= CSTOPB;
        }
    } 
    new_cfg.c_cc[VTIME] = 0;
    new_cfg.c_cc[VMIN] = 1;
     
    /*处理未接受字符*/
    tcflush(fd,TCIFLUSH);
    /*激活新配置*/
    if((tcsetattr(fd,TCSANOW,&new_cfg))!=0){
        perror("tcsetattr");
        return -1;
    }
    return 0;

 
//打开串口函数
int open_port(int com_port)
{
 int fd = 0;
 
#if(COM_TYPE == GNR_COM)  //使用普通串口
 char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2","/dev/ttyS3"};
#else      //使用USB转串口
 char *dev[]={"/dev/ttyUSB0","/dev/ttyUSB1","/dev/ttyUSB2","/dev/ttyUSB3"};
#endif
    if(com_port < 0 || com_port >MAX_COM_MUM)
    {
  return -1;
    }
 //打开串口
 fd = open(dev[com_port -1],O_RDWR|O_NOCTTY|O_NDELAY);
    if(fd < 1)
    {  
  perror("open serial port");
  return(-1);
    }
 //恢复串口阻塞状态
    if(fcntl(fd,F_SETFL,0)<0)
    {
            perror("fcntl F_SETFL\n");
        }
    //测试是否为终端设备
    if(isatty(STDIN_FILENO)==0)
 {
 printf("standard input is not a termina device\n");
 }

    printf("fd=%d\n",fd);
    return fd;
}

 

//com_writer.c

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

#include "uart_api.h"
#include "define.h"

int main()
{
 int fd =0;
 char buffer[BUFFER_SIZE];

 //fd = open_port(HOST_COM_POST);    //打开串口
 fd = open_port(2);
 if( fd < 0)
 {
  perror("open_port");
 }

 if(set_com_config(fd, 9600, 8, 'N', 1) < 0)  //配置串口
 {
  perror("set_com_config");
  return 1;
 }
 do
 {
  printf("input some words(enter 'quit' to exit):");
  memset(buffer, 0, BUFFER_SIZE);
  if(fgets(buffer,BUFFER_SIZE,stdin) == NULL)
  {
   perror("fgets");
   break;
  }
  write(fd, buffer, strlen(buffer));
 }while(strncmp(buffer, "quit", 4));
 close(fd);
 return 0;
}


//com_reader.c

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

#include "uart_api.h"
#include "define.h"

int main(void)
{
int fd;
char buff[BUFFER_SIZE];
fd = open_port(2);
if( fd < 0  ) /* 打开串口 */
{
    perror("open_port");
    return 1;
}
if(set_com_config(fd, 115200, 8, 'N', 1) < 0) /* 配置串口 */
{
    perror("set_com_config");
    return 1;
}

do
{
    memset(buff, 0, BUFFER_SIZE);
    if (read(fd, buff, BUFFER_SIZE) > 0)
    {
        printf("The received words are : %s", buff);
    }
} while(strncmp(buff, "quit", 4));
close(fd);
return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值