红联Linux门户
Linux帮助

编译linux下c串口程序出现:In file included from serial.c:1:0:

发布时间:2011-07-17 15:35:25来源:红联作者:youxiangtt
串口程序serial.c[code]#include "serial.h"

static struct termios termios_old,termios_new;

//设置串口通信速率
int _BaudRate(int baudrate)
{
switch(baudrate)
{
case B2400:
return (2400);
case B4800:
return (4800);
case B9600:
return (9600);
case B19200:
return (19200);
case B38400:
return (38400);
case B57600:
return (57600);
case B115200:
return (115200);
default:
return (9600);
}

}

int BaudRate( int baudrate)
{
switch(baudrate)
{
case 0:
return (B2400);
case 1:
return (B4800);
case 2:
return (B9600);
case 3:
return (B19200);
case 4:
return (B38400);
case 5:
return (B57600);
case 6:
return (B115200);
default:
return (B9600);
}
}



// 设置串口数据位,停止位,奇偶校验位,速度,超时设置等参数
int setPara(int serialfd,int speed,int databits , int stopbits ,int parity )
{
bzero( &termios_new, sizeof(termios_new));
cfmakeraw(&termios_new);
termios_new.c_cflag=BaudRate(speed);
termios_new.c_cflag |= CLOCAL | CREAD;

termios_new.c_cflag &= ~CSIZE;
switch (databits) //设置数据位
{
case 0:
termios_new.c_cflag |= CS8;
break;
case 1:
termios_new.c_cflag |= CS7;
break;
case 2:
termios_new.c_cflag |= CS6;
break;
case 3:
termios_new.c_cflag |= CS5;
break;
default:
termios_new.c_cflag |= CS8;
break;
}

switch (parity) //设置奇偶位
{
case 0: //as no parity
termios_new.c_cflag &= ~PARENB; //Clear parity enable
break;
case 1:
termios_new.c_cflag |= PARENB; // Enable parity
termios_new.c_cflag &= ~PARODD;
break;
case 2:
termios_new.c_cflag |= PARENB;
termios_new.c_cflag |= ~PARODD;
break;
default:
termios_new.c_cflag &= ~PARENB; // Clear parity enable
break;
}
switch (stopbits)// set Stop Bit
{
case 0:
termios_new.c_cflag &= ~CSTOPB;
break;
case 1:
termios_new.c_cflag |= CSTOPB;
break;
default:
termios_new.c_cflag &= ~CSTOPB;
break;
}
tcflush(serialfd,TCIFLUSH); // Update the termios_new and do it NOW
termios_new.c_cc[VTIME] = 1; /* unit: 1/10 second. */
termios_new.c_cc[VMIN] = 1; /* minimal characters for reading */
tcflush (serialfd, TCIFLUSH);
return tcsetattr(serialfd,TCSANOW,&termios_new);
}

int nwrite (int serialfd, const char *data, int datalength )
{

int len = 0, total_len = 0;//modify8.8
for (total_len = 0 ; total_len < datalength;)
{
len = 0;

len = write(serialfd, &data[total_len], datalength - total_len);
if (len > 0)
total_len += len;
}
return (total_len);
}

int GetBaudRate()
{
return (_BaudRate(cfgetospeed(&termios_new)));
}

void closePort(int serialfd)
{
tcsetattr (serialfd, TCSADRAIN, &termios_old);
close (serialfd);
}

int openPort(int index)
{
char *device;
switch(index)
{
case 0:
device="/dev/ttyS0";
break;
case 1:
device="/dev/ttyS1";
break;
case 2:
device="/dev/ttyS2";
break;
case 3:
device="/dev/ttyS3";
break;
default:
device="/dev/ttyS0";
}

int fd=open( device, O_RDWR | O_NOCTTY | O_NONBLOCK);
if ( fd<0)
{

return -1;
}
tcgetattr(fd , &termios_old);

return fd;
}[/code]串口程序头文件serial.h[code]
#ifndef SERIAL_H
#define SERIAL_H

#include /*标准输入输出定义*/
#include /*标准函数库定义*/
#include /*Unix标准函数定义*/
#include /*linux系统的基本系统数据类型定义*/
#include
#include
#include /*文件控制定义*/
#include /*PPSIX终端控制定义*/
#include /*错误号定义*/
#include
#include


int openPort(int index);
int setPara(int serialfd,int speed=2,int databits=8,int stopbits=1,int parity=0);
int nwrite(int serialfd,const char *data,int datalength);
void closePort(int serialfd);
int BaudRate( int baudrate);
int _BaudRate(int baudrate);
int GetBaudRate();
#endif [/code][root@tian 桌面]# gcc -o serial serial.c
In file included from serial.c:1:0:
serial.h:19:39: 错误:expected ‘;’, ‘,’ or ‘)’ before ‘=’ token


查网上说是头文件重复引用,不会阿。我包含了
#ifndef SERIAL_H
#define SERIAL_H
..........
#endif
应该不会出现这样的问题,不知道出问题的原因在哪里。有没有谁帮忙解决下问题阿。万分感谢阿(6)m:b
文章评论

共有 1 条评论

  1. youxiangtt 于 2011-07-17 16:16:42发表:

    冒失出现了一个低级错误,就是把C++和C语言搞混淆了。上面主要是用c语言编写的,c语言中混用了c++类中的构造函数。int setPara(int serialfd,int speed=2,int databits=8,int stopbits=1,int parity=0);所以总出现serial.h:19:39: 错误:expected ‘;’, ‘,’ or ‘)’ before ‘=’ token
    而且我那样编译也是不行的,没有相应的主函数。