linux操作串口的代码,linux串口通信以及串口初始化代码,linux串口读写方法和代码

ARM 62浏览


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mynameislinduan/article/details/52120451

/////////////RS 232 FUCTIONS RS232 Fucitons //////////linux应用串口编程源,linux操作串口的代码,linux rs232串口例程/////////////
///////////////linux serial sample linux串口例程,linux RS232例程,/////////////linux串口配置,好用的linux串口设置 打开linux串口

设置串口//////////////串口例子,linux ttys编程,linux rs232串口编程例子,linux封装好的串口,2017.06.29编写,串口可以用的封装比较好//////////////////

////原创作品,为经过同意,请勿转载

#include "stdio.h"
#include "stdlib.h"
#include "fcntl.h"
#include "unistd.h"
#include "string.h"
#include "memory.h"
#include "math.h"
#include "pthread.h"
#include "sys/types.h"
#include "sys/ioctl.h"

#include "termios.h" //串口头文件 

#define Lin_Dbg////调试用的打印
#ifdef Lin_Dbg
#define PDBG(fmt, args...)  printf(fmt, ## args)
#else
#define PDBG(fmt, args...) /* empty debug slot */
#endif

#define PHASCAN2_UART_TO_STM32_NODE "/dev/ttymxc2"

int Lin_Open_TtyS(int *tty_fd, char *serial_node_name)
{
*tty_fd = open(serial_node_name, O_RDWR | O_NOCTTY | O_NONBLOCK);////非阻塞,通知,读写方式打串口
if(0 > *tty_fd)
{
PDBG(serial_node_name);
PDBG("    open ttyS ERROR!, tty_fd: %dn", *tty_fd);
return -1;
}
else
{
PDBG(serial_node_name);
PDBG(" Opened, now fd is: %dn", *tty_fd);
}
return *tty_fd;
}

int Lin_Close_TtyS(int tty_fd)//关闭串口
{
close(tty_fd);
PDBG("TTy Closednn");
return 1;
}

void Lin_Config_Tty(int ur_ttys_fd, struct termios Lin_Serial_Opt)
{
////TCSANOW:不等数据传输完毕就立即改变属性。
////TCSADRAIN:等待所有数据传输结束才改变属性。
////TCSAFLUSH:等待所有数据传输结束,清空输入输出缓冲区才改变属性。
if(0 != tcsetattr(ur_ttys_fd,TCSANOW,&Lin_Serial_Opt))
//set the ttys0,let it make effect,now
{
PDBG("set baudrate");
}
tcflush(ur_ttys_fd,TCIOFLUSH);
}

int main(int arvc, char **argv)
{
struct termios My_tst_Serial_Opt;
int pha2_tty_fd=-1;
int r_ret=0;
unsigned char serial_rec_buf[256];

memset(serial_rec_buf, 0x00, sizeof(serial_rec_buf));

if(Lin_Open_TtyS(&pha2_tty_fd, PHASCAN2_UART_TO_STM32_NODE)<0)////打开串口,获得设备描述符号
{
return -1;
}
////获取现在串口结构信息,获取之后以这个为基础进行串口配置
tcgetattr(pha2_tty_fd,&My_tst_Serial_Opt);
tcflush(pha2_tty_fd,TCIOFLUSH);

////设定串口速度////bautes 
cfsetispeed(&My_tst_Serial_Opt,B115200);
cfsetospeed(&My_tst_Serial_Opt,B115200);
////before setting ,cancel all attributes,设定flag
My_tst_Serial_Opt.c_lflag = 0 ;////本地模式标志
My_tst_Serial_Opt.c_oflag = 0 ;////输出模式标志
My_tst_Serial_Opt.c_iflag = 0;////输入模式标志
////消除字符屏蔽规则:
My_tst_Serial_Opt.c_cc[VINTR]=0;
My_tst_Serial_Opt.c_cc[VQUIT]=0;
My_tst_Serial_Opt.c_cc[VERASE]=0;
My_tst_Serial_Opt.c_cc[VKILL]=0;
My_tst_Serial_Opt.c_cc[VEOF]=0;
My_tst_Serial_Opt.c_cc[VTIME]=1;
My_tst_Serial_Opt.c_cc[VMIN]=0;
My_tst_Serial_Opt.c_cc[VSWTC]=0;
My_tst_Serial_Opt.c_cc[VSTART]=0;
My_tst_Serial_Opt.c_cc[VSTOP]=0;
My_tst_Serial_Opt.c_cc[VSUSP]=0;
My_tst_Serial_Opt.c_cc[VEOL]=0;
My_tst_Serial_Opt.c_cc[VREPRINT]=0;
My_tst_Serial_Opt.c_cc[VDISCARD]=0;
My_tst_Serial_Opt.c_cc[VWERASE]=0;
My_tst_Serial_Opt.c_cc[VLNEXT]=0;
My_tst_Serial_Opt.c_cc[VEOL2]=0;
////CLOCAL和CREAD分别用于本地连接和接受使能,通过位掩码的方式激活这两个选项。
My_tst_Serial_Opt.c_cflag &= ~CSIZE;////不需要字符长度掩码
My_tst_Serial_Opt.c_cflag |= CS8;////字符长度掩码是cs8
My_tst_Serial_Opt.c_cflag |= CLOCAL;////忽略clocal
My_tst_Serial_Opt.c_cflag |= CREAD;////打开接受者
My_tst_Serial_Opt.c_cflag &= ~PARENB;////不要奇偶校验,//清除校验位
My_tst_Serial_Opt.c_cflag &= ~CSTOPB;////不要两个停止位,一个, 一个停止位
//////////////////////////////////
My_tst_Serial_Opt.c_iflag &= ~INPCK;//////不启用输入的奇偶监测
My_tst_Serial_Opt.c_iflag |= IGNPAR;///////忽略错误帧和奇偶错误
////软件流控制屏蔽,CR-NL的映射,即串口能把回车和换行当成同一个字符,可以进行如下设置屏蔽之:
My_tst_Serial_Opt.c_iflag &= ~(ICRNL|ISTRIP|IXON|IGNCR);////不要回车,关闭xon流控制,不要忽略回车信息,不要把回车信息翻译成特殊信息
////回车,换行的屏蔽
My_tst_Serial_Opt.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);////non ICANON。取消收到特殊字符的新号和处理,非标准模式
///////////////////////
My_tst_Serial_Opt.c_oflag &= ~(ONLCR|OCRNL);
My_tst_Serial_Opt.c_oflag &= ~OPOST;////Postprocess output (not set = raw output) 
///////////////////////////////////
My_tst_Serial_Opt.c_cc[VTIME] = 1;// wait for 1 ms
My_tst_Serial_Opt.c_cc[VMIN] = 0;//read 8 bytes in,串口读入个数,如果是0,表示一旦亦数据麻纱马上返回

Lin_Config_Tty(pha2_tty_fd, My_tst_Serial_Opt);

while(1)
{
if((r_ret=read(pha2_tty_fd, serial_rec_buf, 1))>0)
{
PDBG("Read data: %02x n", serial_rec_buf[0]);
}
}


return 1;
}