转自:http://blog.csdn.net/wcl719236538/article/details/55251368
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define FALSE -1
#define TRUE 0
/*******************************************
*函数名 :UART0_Open
*函数功能:打开串口并返回串口设备文件描述符
*参数 :fd:文件描述符
port:串口号(ttyS0,ttyS1,ttyS2)
*返回值 :正确返回1,错误返回0
********************************************/
int UART0_Open(int fd,char* port)
{
fd = open(port,O_RDWR|O_NOCTTY|O_NDELAY);
if(FALSE == fd)
{
perror("Can't Open Serial Port");
return (FALSE);
}
//恢复串口为阻塞状态
if(fcntl(fd,F_SETFL,0) < 0)
{
printf("fcntl failed!\n");
return (FALSE);
}
else
{
printf("fcntl=%d\n",fcntl(fd,F_SETFL,0));
}
//测试是否为终端设备
if(0 == isatty(STDIN_FILENO))
{
printf("standard input is not a terminal device\n");
return (FALSE);
}
else
{
printf("isatty success!\n");
}
printf("fd->open=%d\n",fd);
return fd;
}
/**************************************************
*函数名称:UART0_Close
*函数功能:关闭串口并返回串口设备的文件描述
*参数 :fd:文件描述符
port:串口号(ttys0,ttys1,ttys2)
*返回值 :void
* ************************************************/
void UART0_Close(int fd)
{
close(fd);
}
/**************************************************
*函数名称:UART0_Set
*函数功能:设置串口数据位,停止位和校验位
*参数 :fd串口文件描述符
speed串口速度
flow_ctrl:数据流控制
databits:数据位取值为7或者8
stopbits:停止位取值为1或者2
parity:效验类型取值为N,E,O,S
*返回值 :正确返回1,错误返回0
* ************************************************/
int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)
{
int i;
int status;
int speed_arr[]={B115200,B19200,B9600,B4800,B2400,B1200,B300};
int name_arr[]={115200,19200,9600,4800,2400,1200,300};
struct termios options;
/*tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,该函数还可以测试配置是否正确,该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为1.
*/
if(tcgetattr(fd,&options)!=0)
{
perror("SetupSerial 1");
return (FALSE);
}
//设置串口输入波特率和输出波特率
for(i=0;i 0)
printf("send data successful\n");
else
printf("send data failed or nothing to send!\n");
len = UART0_Recv(fd, rcv_buf,sizeof(rcv_buf)-1);
if(len > 0)
{
rcv_buf[len] = '\0';
printf("receive data is %s\n",rcv_buf);
}
else
{
printf("cannot receive data or data is null.\n");
}
memset(rcv_buf,'\0',sizeof(rcv_buf));
}
UART0_Close(fd);
}
memset(rcv_buf,'\0',sizeof(rcv_buf));
}
UART0_Close(fd);
}
我作了部分修改,注意一点,如果在在外部串口终端上显示乱码的话一般是波特率的问题,要保证波特率一致,如果确认一致了的话还是乱码,那么有可能是你程序写的有问题,好好检查一下,其它问题的话暂时没有遇到过。
运行命令:(可执行程序为test,转载网址上的代码运行命令为“./test /dev/ttySn n”,ttySn是你的设备号,n的话是0或者其它。运行命令牵扯到main函数的参数int argc和char* argv[],不明白的可以去百度相关的知识。)
./test
后续还会加上tcp网络编程,最终实现远程服务器和终端设备的交互。