Chinaunix首页 | 论坛 | 博客
  • 博客访问: 43366
  • 博文数量: 24
  • 博客积分: 920
  • 博客等级: 准尉
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-05 11:10
文章分类
文章存档

2011年(1)

2010年(3)

2009年(20)

我的朋友
最近访客

分类: LINUX

2009-09-24 16:07:17

简单串口读写程序的实现过程:
(1)在 Linux 下串口文件是位于 /dev 下的
串口一 为 /dev/ttyS0
串口二 为 /dev/ttyS1
(2)打开串口是通过使用标准的文件打开函数操作:
int fd;
fd=open("/dev/ttyS0",O_RDWR);
if(fd==-1)
{
    printf("can't open ttyS0!\n");
        exit(0);
}
(3)设置串口
串口的设置主要是设置 struct termios 结构体的各成员值。
struct termio
{    unsigned short  c_iflag;    /* 输入模式标志 */    
    unsigned short  c_oflag;    /* 输出模式标志 */    
    unsigned short  c_cflag;    /* 控制模式标志*/    
    unsigned short  c_lflag;    /* 区域模式标志 */    
    unsigned char  c_line;        /* 行控制 */    
    unsigned char  c_cc[NCC];       /* 控制特性 */
};
最基本的设置串口包括波特率设置,效验位和停止位设置。
new.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD;
      /* BAUDRATE:波特率
       CS8     : 8n1 (8 位元, 不做同位元检查,1 个终止位元)
           CLOCAL  : 本地连线, 不具数据机控制功能
           CREAD   : 致能接收字元
        */
new.c_iflag=IGNPAR|ICRNL;
        /*
          IGNPAR  : 忽略经同位元检查後, 错误的位元组
          ICRNL   : 比 CR 对应成 NL (否则当输入讯号有 CR 时不会终止输入)
                 在不然把装置设定成 raw 模式(没有其它的输入处理)
        */
        new.c_oflag=0;
        new.c_lflag = 0;
        new.c_cc[VTIME] = 0;/* 不使用分割字元组计时器 */
        new.c_cc[VMIN] = 5;/* 在读取到 5 个字元前先停止 */
(4)读写串口
设置好串口之后,读写串口就很容易了,把串口当作文件读写就是。
读串口显示在屏幕:
tmp=read(fd,str,50);
write(1,str,tmp);/*这里的1是标准的屏幕输出*/
写串口从键盘读:
tmp=read(0,str,50);/*这里的0是标准的键盘读*/
write(fd,str,tmp);
(5)关闭串口
关闭串口就像关闭文件一样。 close(fd);
******************************实例********************************
下面是一个简单的读写串口的例子。
#include
#include
#include
#include
#include
#include
#include
#include

#define BAUDRATE B115200    /*波特率为B115200*/

int main()
{
    int fd,pid,tmp;
    char str[255];
    struct termios new;
    fd=open("/dev/ttyS0",O_RDWR);/*打开串口*/
    if(fd==-1)
    {
        printf("can't open ttyS0!\n");    
        exit(0);
    }

    bzero(&new, sizeof(new));/* 清除结构体以放入新的序列埠设定值 */
    
    new.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD;
    /* CS8     : 8n1 (8 位元, 不做同位元检查,1 个终止位元)
       CLOCAL  : 本地连线, 不具数据机控制功能
       CREAD   : 致能接收字元
    */
    new.c_iflag=IGNPAR|ICRNL;
    /*
      IGNPAR  : 忽略经同位元检查後, 错误的位元组
      ICRNL   : 比 CR 对应成 NL (否则当输入讯号有 CR 时不会终止输入)
      在不然把装置设定成 raw 模式(没有其它的输入处理)
     */
    new.c_oflag=0;
    new.c_lflag = 0;
    new.c_cc[VTIME] = 0;/* 不使用分割字元组计时器 */       
    new.c_cc[VMIN] = 5;/* 在读取到 5 个字元前先停止 */

    /*现在清除数据机线并启动序列埠的设定*/
    tcflush(fd, TCIFLUSH);
    tcsetattr(fd,TCSANOW,&new);
   
    pid=fork();
    if(pid<0)
        printf("error\n");
    else if(pid==0)
    {    /*从串口读数据然后在屏幕显示出来*/
        while((tmp=read(fd,str,50))>0)
        {
            write(1,str,tmp);
        }
    }
    else
    {    /*从键盘读数据然后写进串口*/
        while((tmp=read(0,str,50))>0)
         {
            write(fd,str,tmp);
         }
    }

    close(fd);/*关闭串口*/
    return 0;
}
阅读(1742) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~