一个linux 下C的串口程序 用别人的例子修改
/****************************************************************
gcc maintest.c -o maintest -lc -lm //编译程序
gcc main.c -o main.so -shared -lc -lm //编译so文件
****************************************************************/
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix标准函数定义*/
#include <sys/types.h> /**/
#include <sys/stat.h> /**/
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX终端控制定义*/
#include <errno.h> /*错误号定义*/
#define FALSE 0
#define TRUE 1
/***@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void*/
int speed_arr[] = {B57600,B38400, B19200, B9600, B4800, B2400, B1200, B300};
int name_arr[] = {57600,38400, 19200, 9600, 4800, 2400, 1200, 300};
/**
*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄*
*@param speed 类型 int 波特率
*@param databits 类型 int 数据位 取值 为 7 或者8*
*@param stopbits 类型 int 停止位 取值为 1 或者2*
*@param parity 类型 int 效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int speed,int databits,int stopbits,int parity)
{
int i;
struct termios options;
tcgetattr(fd, &options );
bzero( &options, sizeof(struct termios ) );
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
options.c_cflag = speed_arr[i] | CRTSCTS | CS8 | CLOCAL | CREAD;
}
}
options.c_oflag &= ~OPOST;
//options.c_oflag = 0;
//超时时间
options.c_cc[VTIME] =20;
//超时设置
options.c_cc[VMIN] =0;
tcflush( fd, TCIFLUSH );
tcsetattr( fd, TCSANOW,&options);
}
/**
*@breif 打开串口
*/
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
if (-1 == fd)
{ /*设置数据位数*/
perror("Can't Open Serial Port");
return -1;
}
else
return fd;
}
/**
*@breif 关闭串口
*/
int CloseDev(int Anfd)
{
if (-1 != Anfd)
{
return close(Anfd);
}
}
/**
*@breif 发送数据
*@parma Buff Buffer
*/
int SendByte(int Anfd,char* Buff,int AnSize)
{
/*write(fd,buff,1 );*/
return write(Anfd,Buff,AnSize);
}
/**
*@breif 读取数据
*@param Anfd Handle
*@param Buff ReceBuffer
*@parma AnSize
*/
int ReadByte(int Anfd,char* Buff,int AnSize)
{
int nread;
nread = read(Anfd,Buff,AnSize);
return nread;
}
/**
*@breif main()
*/
int main(int argc, char **argv)
{
int fd;
int nread;
//缓冲区
char buff[512];
char *dev ="/dev/ttyS1";
//打开串口
fd = OpenDev(dev);
printf("%d/n",fd);
if (fd>0)
{
set_Parity(fd,57600,8,1,'N');
}
else
{
printf("Can't Open Serial Port!/n");
exit(0);
}
printf("Open com OK!/n");
SendByte(fd,buff,6);
ReadByte(fd,&(buff[0]),9);
printf("%d/n",buff[3]);
printf("CLOSECOM NOW!/n");
CloseDev(fd);
printf("CLOSECOM OK!/n");
exit(0);
}