免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1537 | 回复: 1
打印 上一主题 下一主题

简单的串口读写操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-24 16:07 |只看该作者 |倒序浏览
简单串口读写程序的实现过程:
(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(pid0)
        {
            write(1,str,tmp);
        }
    }
    else
    {    /*从键盘读数据然后写进串口*/
        while((tmp=read(0,str,50))>0)
         {
            write(fd,str,tmp);
         }
    }
    close(fd);/*关闭串口*/
    return 0;
}
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103858/showart_2059278.html

论坛徽章:
0
2 [报告]
发表于 2012-03-13 17:47 |只看该作者
先顶在说
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP