Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1217529
  • 博文数量: 261
  • 博客积分: 4196
  • 博客等级: 上校
  • 技术积分: 3410
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-17 17:05
文章分类

全部博文(261)

文章存档

2018年(1)

2017年(22)

2016年(2)

2015年(8)

2014年(27)

2013年(40)

2012年(161)

分类: LINUX

2013-12-04 09:52:58

#include  
#include
#include
#include  /*文件控制定义*/
#include   /*PPSIX 终端控制定义*/


void set_speed(int, int);
int main()
{
    int fd,flag,wr_num=0,rd_num=0;
    struct termios term;
    speed_t baud_rate_i,baud_rate_o;
    char send_buf[]="hello,serial!",recv_buf[20];
    fd=open("/dev/ttyS0",O_RDWR|O_NONBLOCK);    /*要用O_NOBLOCK 否则读数据时会出问题*/
    if(fd==-1)
        printf("can not open the COM1!\n");
    else
        printf("open COM1 ok!\n");
    flag=tcgetattr(fd,&term);/*取得终端设备fd的属性,存放在termios类型的结构体term中*/
    baud_rate_i=cfgetispeed(&term);/*从term中读取输入波特率*/
    baud_rate_o=cfgetospeed(&term);/*从term中读取输出波特率*/
    printf("输入波特率是%d,输出波特率是%d,文件描述符是%d\n",baud_rate_i,baud_rate_o,fd);
    set_speed(fd,9600);/*设置波特率*/
    flag=tcgetattr(fd,&term);
/*以下三行读取设置之后的波特率,用cfgetispeed和cfgetospeed得到的波特率是一个序号,可以通过查表(表见程序后面)得到真正的波特率,比如返回13,对应的实际波特率是9600。我这里没有做转换,直接把13输出了。*/

    baud_rate_i=cfgetispeed(&term);
    baud_rate_o=cfgetospeed(&term);
    printf("输入波特率是%d,输出波特率是%d,文件描述符是%d\n",baud_rate_i,baud_rate_o,fd);
    while(1)
    {
        wr_num=write(fd,send_buf,sizeof(send_buf));/*先写入*/
        if(wr_num>0)
            printf("write success!\n");
        else
            printf("write fail!\n");
        sleep(1);
        rd_num=read(fd,recv_buf,sizeof(recv_buf));/*再读出*/
        if(rd_num>0)
            printf("we can read \"%s\" from the COM1.total:%d characters\n",recv_buf,rd_num);
        else
            printf("read fail!\n");
        sleep(2);
    }
}

/***下面这个set_speed的子程序是在网上别的文章中摘抄过来的,就直接调用了,省了自己编写的麻烦***/

    int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300,
                        B38400, B19200, B9600, B4800, B2400, B1200, B300, };
    int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 
                    19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed){
    int   i; 
    int   status; 
    struct termios   Opt;
    tcgetattr(fd, &Opt); 
    for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) { 
        if (speed == name_arr[i]) {     
            tcflush(fd, TCIOFLUSH);     
            cfsetispeed(&Opt, speed_arr[i]); 
            cfsetospeed(&Opt, speed_arr[i]);   
            status = tcsetattr(fd, TCSANOW, &Opt); 
            if (status != 0) {    
                perror("tcsetattr fd1"); 
                return;     
            }    
            tcflush(fd,TCIOFLUSH);   
         } 
    }
}
阅读(703) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~