EDN首页   博客首页

日志档案

发表于 2006-9-25 22:44:04

72

标签: vxworks  串口  

开始学串口

串口通信基本原理

   串口在嵌入式系统当中是一类重要的数据通信接口,其本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU经过串行端口发送出去时,字节数据转换为串行的位;在接收数据时,串行的位被转换为字节数据。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

   串口通信的优点是开发简单,在传输数据量不大、要求速度不高而传输距离较大的通信场合得到广泛应用,,在调试程序中被广泛应用。

    在VxWorks中,将I/O系统设计成为任何类型的设备提供一个简单、统一、独立于设备的接口,任何对于串口的操作都可以视为对一个文件的操作,而不必了解串口设备或程序驱动实现的细节。在串口通信软件的设计中,当串口初始化完成后,在使用之前利用open()打开相应串口,然后进行配置。

    VxWorks提供终端和伪终端设备驱动。Tty驱动针对实终端;pty针对仿真终端的程序。Tty设备有两种操作模式:raw模式和line模式。在raw模式下,每个刚从设备输入的字符对读者都是有效的;在line模式下所有输入字符被存储,直到NEWLINE字符输入。设备选项字使用带FIOSETOPTIONS 功能的ioctl()程序来设置。配置完成后,依据串口打开时的读写标志,调用函数write()、read()对串口进行只读操作、只写操作或同时进行读写操作。为提高数据接收的实时性,可采用中断方式,利用VxWorks提供的select函数的事件触发机制,将读串口的任务阻塞使其一直等待数据,当有数据来到的时候该任务会立刻自动响应,提高系统的实时性。

系统分类: 嵌入式   |   用户分类: 串口   |   来源: 无分类   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(2975)    回复(9)  

投一票您将和博主都有获奖机会!

  • ctx22

    2007-1-3 21:25:37

    写的不错

  • yanshen

    2006-9-25 23:35:52

    如果在config.h和组件里配置好串口后,客直接用sysOutByte(0x3F8
    ,数据)写。但是这种方法是不可靠的。我个人就是我们为什么驱邪驱动的原因之一。

  • yanshen

    2006-9-25 23:04:29

    刚才说的那些也许还有很多不清楚的,详细可以看安装目录下的doc文件夹里面有所有vxworks的函数,还有一些解释。(用windows自带的搜索查找你可能用到的函数就会有好多新的发现)但是这些解释也不能满足我们。那就让我们慢慢的来积累吧。

  • yanshen

    2006-9-25 23:13:05

    在串口满足实时行要求时,就要用非阻塞模式(在读写串口时如果不能读写任务也不会被阻塞)。可以设置超时,将串口的文件描述符加入到select中取查询
    ioctl(fd,FIONREAD,(int)&iNum);
    if(iNum>0){read();...}

  • yanshen

    2006-9-25 23:20:24

    再深入的了解一下串口的初始化,这里是串口最简单的初始化,如果以后写串口驱动可以从这里入手
    #include "vxWorks.h"
    #include "tffs/flsocket.h"
    #include "tffs/pcic.h"

    #define COM1_PORT   0x3F8

    void com1_init(void)
     {
      int data;
        sysOutByte(COM1_PORT+3,0x80);   /* DLAB=1, set baud*/

    sysOutByte(COM1_PORT,0x0c);     /* 波特率 0x30:2400 0x18:4800 0x0c:9600*/
       
    sysOutByte(COM1_PORT+2,0x87);
    sysOutByte(COM1_PORT+2,0x81);

    sysOutByte(COM1_PORT+1,0x00);

    sysOutByte(COM1_PORT+3,0x03);   /*data length: 8 , stop bits: 1*/

    sysOutByte(COM1_PORT+4,0x0b);

    /*outportb(COM1_PORT+1,0x01);   // receive interrupt enable*/
    sysInByte(COM1_PORT);
     }
    再加上些中断处理函数就是完整的驱动了。

  • yanshen

    2006-9-25 23:53:54

    vxowrks应用串口在程序中加入下列头文件

    #include <vxWorks.h>

    #include "strLib.h"

    #include <string.h>

    #include <sioLib.h>

    #include <ioLib.h>

    #include <stdio.h>

    #include <ioctl.h>

    #include <selectLib.h>

    #include "types/vxTypesOld.h"

    打开串口

    int open_com1(void) //打开串口1函数

    {    int sfd;//串口设备文件描述符

    sfd =open(”/tyCo/0”,0_RDWR,0);//打开串口并返回串口设备文件描述符

    if(sfd ==ERROR)  //如果不能打开串口1则打印出错信息

    printf("You can’t open port com1 !");

     } 

     配置串口

    int config_com1(void)                               //串口1配置函数

    { ioctl(sfd,FIOSETOPTIONS,OPT_LINE);  //设置串口工作模式为行模式:LINE_MODE

    ioctl(sfd,FIOBAUDRATE,9600);        //设置串口波特率为9600bps

    ioctl(sfd,FIOFLUSH,0);                                 //清空输入输出缓冲

    ioctl(sfd,SIO_HW_OPTS_SET,CS8|STOPB|PARENB|PARODD);

    //设置 8 位数据位,2位停止位,带校验位,奇校验

    }

     串口接收数据

    int accept _com1(void) //从串口1接收数据函数

    {  while(1)

       {  char * accept _buf;

    FD_ZERO(&fds_data);//位码置零 

    FD_SET(sfd,&fds_data);//初始化位码

    width=sfd +1; 

    //任务阻塞等待读串口准备完毕;

    if(select(width,&fds_data,NULL,NULL,NULL)==ERROR)

      return(ERROR);

    read(sfd, accept _buf,sizeof(accept _buf));  //从串口读字符

    printf("accept message is : %s \n\n", accept _buf);   //输出接收到的信息

     }

    }

    串口发送数据

    int send_com1(void) //向串口1发送数据函数

       {              char *send_buf =" Data had accept!";  //待发送数据

                  //任务阻塞等待写串口准备完毕

    if(select(width,NULL,&data_fds,NULL,NULL==ERROR)

       return(ERROR) ;

    if(FD_ISSET(sfd,&fds_data))  //检查串口准备好就向串口写数据

    write(sfd,send_buf,sizeof(send_buf)) ;

    }

    关闭串口

    close(sfd);

  • yyg

    2007-5-9 17:46:09

    学习学习

  • cocappjj

    2006-9-26 14:00:43

    呵呵,好认真的博主

  • litterfairy

    2006-10-10 20:39:34

    确实很认真啊