whutwx
驱动牛犊
驱动牛犊
  • 注册日期2001-08-06
  • 最后登录2003-03-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1544回复:1

帮我看看串口操作的代码吧!

楼主#
更多 发布于:2002-08-16 21:19
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include \"uart.h\"

#define BAUDRATE  B115200
struct termios  status;
int FileHandle = -1;

int
UART_Open (char *uartPortName)
{
int bRc = 1;
struct termios termid;

do
{
// Check if the file name is null
if (uartPortName == NULL)
{
bRc = 1;
break;
}

if (FileHandle != -1)
break;

// Open device
FileHandle =open (uartPortName, O_RDWR /*| O_NOCTTY | O_NONBLOCK*/);
if (FileHandle == -1)
{
bRc = 2;
break;
}
else
{
bRc = 0;
if (tcgetattr (FileHandle, &termid) < 0)
{
printf (\"tcgetattr() failed,errno = %d\\n\",
errno);
return;
}

bzero (&termid, sizeof (termid));

// Set the flag
termid.c_cflag|=(CLOCAL|CREAD);
termid.c_cflag&=~PARENB;
termid.c_cflag&=~PARODD;
termid.c_cflag&=~CSTOPB;
termid.c_cflag&=~CSIZE;
termid.c_cflag|=CS8;
termid.c_oflag|=OPOST;
termid.c_iflag&=~(IXON|IXOFF|IXANY);
if(cfsetispeed (&termid, BAUDRATE)<0)
{
printf (\"cfsetispeed() failed, errno=%d\\n\",
errno);
return;
}

if(cfsetospeed (&termid, BAUDRATE)<0)
{
printf (\"cfsetospeed() failed the errno=%d\\n\",
errno);
return;
}
tcflush (FileHandle, TCIFLUSH);
tcflush (FileHandle, TCOFLUSH);
if (tcsetattr (FileHandle, TCSANOW, &termid) < 0)
{
printf (\"tcsetattr() failed the errno=%d\\n\",
errno);
return;
}

}
}
while (0);

return bRc;
}
程序运行到fsetispeed出错,错误代码是22(参数非法),我实在没有办法找到原因,请帮忙吧)现在这个问题现在解决了,可是波特率改变不了,但系统提示改变属性成功。怎么回事情?
whutwx
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-20 15:16
还可以这么做
/*
A example for linux serial port
Compile: #gcc -o test Linux_Serial_Port.c
Run: #./test
Result: Write ****byte to serial port
Show any message received
Author: tianfulei@sina.com
*/

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>
       #include <termios.h>
       #include <stdio.h>

       /* baudrate settings are defined in <asm/termbits.h>, which is
       included by <termios.h> */
       #define BAUDRATE B38400
       /* change this definition for the correct port */
       #define MODEMDEVICE \"/dev/ttyS0\"
       #define _POSIX_SOURCE 1 /* POSIX compliant source */

       #define FALSE 0
       #define TRUE 1

       volatile int STOP=FALSE;

       main()
       {
         int fd,c, res, i;
         struct termios oldtio,newtio;
         char buf[255];
       /*
         Open modem device for reading and writing and not as controlling tty
         because we don\'t want to get killed if linenoise sends CTRL-C.
       */
        fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
        if (fd <0) {perror(MODEMDEVICE); exit(-1); }

        tcgetattr(fd,&oldtio); /* save current serial port settings */
        bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */

       /*
         BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.
         CRTSCTS : output hardware flow control (only used if the cable has
                   all necessary lines. See sect. 7 of Serial-HOWTO)
         CS8     : 8n1 (8bit,no parity,1 stopbit)
         CLOCAL  : local connection, no modem contol
         CREAD   : enable receiving characters
       */
        newtio.c_cflag = BAUDRATE |  CS8 | CLOCAL | CREAD; //CRTSCTS |

       /*
         IGNPAR  : ignore bytes with parity errors
         ICRNL   : map CR to NL (otherwise a CR input on the other computer
                   will not terminate input)
         otherwise make device raw (no other input processing)
       */
        newtio.c_iflag = IGNPAR | ICRNL;

       /*
        Raw output.
       */
        newtio.c_oflag = 0;

       /*
         ICANON  : enable canonical input
         disable all echo functionality, and don\'t send signals to calling program
       */
        newtio.c_lflag = ICANON;

       /*
         initialize all control characters
         default values can be found in /usr/include/termios.h, and are given
         in the comments, but we don\'t need them here
       */
        newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */
        newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\\ */
        newtio.c_cc[VERASE]   = 0;     /* del */
        newtio.c_cc[VKILL]    = 0;     /* @ */
        newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
        newtio.c_cc[VTIME]    = 0;     /* inter-character timer unused */
        newtio.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
        newtio.c_cc[VSWTC]    = 0;     /* \'\\0\' */
        newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */
        newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
        newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
        newtio.c_cc[VEOL]     = 0;     /* \'\\0\' */
        newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
        newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
        newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
        newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
        newtio.c_cc[VEOL2]    = 0;     /* \'\\0\' */

       /*
         now clean the modem line and activate the settings for the port
       */
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);

       /*
         terminal settings done, now handle input
         In this example, inputting a \'z\' at the beginning of a line will
         exit the program.
       */
        while (STOP==FALSE) {     /* loop until we have a terminating condition */
        /* read blocks program execution until a line terminating character is
           input, even if more than 255 chars are input. If the number
           of characters read is smaller than the number of chars available,
           subsequent reads will return the remaining chars. res will be set
           to the actual number of characters actually read */
  buf[0] = \'a\';
  for(i = 1;i<100;i++)
  {
  buf = buf[i-1];
  }
res = 0;
while(1)
{
res += write(fd,buf,100);
  printf(\"\\nWrite %d byte to serial port\\n\",res);
}
           res = read(fd,buf,255);
           buf[res]=0;             /* set end of string, so we can printf */
           printf(\":%s:%d\\n\", buf, res);
           if (buf[0]==\'z\') STOP=TRUE;
        }
        /* restore the old port settings */
        tcsetattr(fd,TCSANOW,&oldtio);
       }
游客

返回顶部