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

/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: %d\n", *tty_fd);
return -1;
}
else
{
PDBG(serial_node_name);
PDBG(" Opened, now fd is: %d\n", *tty_fd);
}
return *tty_fd;
}


int Lin_Close_TtyS(int tty_fd)//关闭串口
{
close(tty_fd);
PDBG("TTy Closed\n\n");
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mynameislinduan

你的鼓励是我最大动力写博客不易

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值