Linux下串口编程需要注意哪些,Linux下串口编程总结

本文详细介绍了在Linux环境下进行串口编程的方法,包括打开、关闭串口,设置波特率、数据位、停止位和校验位等功能。通过示例代码展示了发送和接收数据的过程,并提醒读者注意波特率匹配及可能的乱码问题。此外,作者还计划后续加入TCP网络编程,以实现远程通信。
摘要由CSDN通过智能技术生成

Linux下串口编程总结

转自: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;i0)

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

0555d86ba66600b4570440b579079241.png

后续还会加上tcp网络编程,最终实现远程服务器和终端设备的交互。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值