linux 下串口的配置需要注意
常用设置
9.1设置规范模式
规范模式是面向行的输入方式,输入字符被放入用于和用户交互可以编辑的缓冲区内,直接到读入回车或者换行符号时才结束。
可以通过如下方式来设置
option.c_lflag |= (ICANON | ECHO | ECHOE);
9.2设置原始输入模式
原始输入模式是没有处理过的,当接收数据时,输入的字符在它们被接收后立即被传送,使用原始输入模式时候,一般可以选择取消ICANON,ECHO,ECHOE和ISIG选项。
例如:
option.c_lflag &= ~(ICANON | ECHO | ECHOE);
=========================================================================
总结:上面的问题应该比较清楚了,就是在输入模式的设置上出了问题,默认的可能是行缓冲的,导致在接收串口的时候,串口会自行把数据存到缓冲里面,只有接收到回车、换行等结束标志后,才把数据一起送到内存,这样串口的read函数才能读到数据,也就会触发相应的标志(SIGIO)。所以,需要在对串口设置的时候,要设置为原始输入模式。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<termios.h>
#include<errno.h>
#include<string.h>
#define FALSE -1
#define TRUE 0
int bit_recv=0;
int uart_fd;
int speed_arr[] = { B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {57600,38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed){
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {
if (speed == name_arr[i]) {
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0) {
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0) {
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits)
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size\n"); return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
// options.c_cflag &= ~PARENB; /* Clear parity enable */
// options.c_iflag &= ~INPCK; /* Enable parity checking */
options.c_lflag &= ~(ICANON|ECHO|ISIG); /* Clear parity enable */
options.c_oflag &= ~OPOST; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB);
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD;
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;break;
default:
fprintf(stderr,"Unsupported parity\n");
return (FALSE);
}
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
tcflush(fd,TCIFLUSH);
// options.c_cc[VTIME] = 150;
// options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
}
int main(int argc, char *argv[])
{
int ret;
unsigned char Flag,ReadBuf[15];
/*鎵撳紑骞跺垵濮嬪寲涓插彛*/
uart_fd = open("/dev/ttyUSB4",O_RDWR);
if(uart_fd<0)
{
printf("error\n");
}
set_speed(uart_fd,57600);
if (set_Parity(uart_fd,8,1,'N') == FALSE) {
printf("Set Parity Error\n");
exit (0);
}
tcflush(uart_fd, TCIFLUSH) ;
SendDspCmd(Get_Image,uart_fd);
while(1)
linux 下串口的配置需要注意相关推荐
- Linux下串口的配置
一.串口属性 (标题一部分内容摘录自原文地址) 1.termios结构体 串口属于终端设备,其接口属性用termios结构体来描述 struct termios {tcflag_t c_cflag/* ...
- linux练习 串口跟进程6,linux下串口测试程序
linux下串口测试程序 通过简单的参数配置,执行文件+串口号+波特率 #include stdio.h #include stdlib.h #include unistd.h #include sy ...
- Linux 下串口编程(C++ 程序设计)
串口通信是最简单的通信方式.即使在USB 非常流行的今天,依然保留了串行通信的方式.网络上已经有大量关于Linux下 C++ 串口编程的文章,但是我依然要写这篇博文.因为网络上的资料不是内容太多,就是 ...
- Linux下串口编程
文章目录 串口 驱动 安装 设备文件 测试代码 编译运行 引用 串口 电平之类的就不说了,串口使用的一般包括rs232全双工,rs422四线全双工,rs485两线半双工,rs485四线全双工几种模式, ...
- Linux下环境变量配置方法梳理(.bash_profile和.bashrc的区别)
博客园 首页 新随笔 联系 管理 订阅 <div class="blogStats"><!--done--> 随笔- 556 文章- 38 评论- 77 ...
- Linux下安装、配置PHP环境
Linux下安装.启动MySQL :http://blog.csdn.net/wy3552128/article/details/8143686 Linux下安装.配置.启动Apache:http:/ ...
- Linux下svn搭建配置流程
Linux下svn搭建配置流程 一. 源文件编译安装.源文件共两个,为: 1. 下载subversion源文件 subversion-1.6.1.tar.gz http://d136 ...
- Linux下,安装配置Weblogic
Linux下,安装配置Weblogic 2009-03-20 15:03 一.安装配置JDK //如果应用不需要高版本的JDK的话,可以不单独安装JDK 1. 安装JDK # chmod a+x jd ...
- linux实验串行端口程序设计,Linux下串口编程心得(转)
最近一段时间,需要完成项目中关于Linux下使用串口的一个部分,现在开帖记录过程点滴. 项目的要求是这样的,Qt应用程序主要完成数据采集和发送功能,一开始在google中海搜关键字"Qt串口 ...
最新文章
- /etc/profile ,/etc/bashrc ,~/.bash_profile,~/ .bashrc 区别与联系
- Android 获取标题栏的高度
- 程序员注意了!人社部“就业报告”:未来5年,这10个新职业有千万缺口
- java对象深入理解
- javascript二维数组转置_VBA数组拆分及维数的转换
- Julia程序设计3 数组1 创建、初始化、属性与访问
- 免费指纹浏览器破解方法之开源代码
- 开箱即用——用模板快速生成《客户意见反馈表》
- jQuery实现右上角点击后滑下来的竖向菜单
- System进程(pid=4)占用80端口的解决方案
- 第三次学JAVA再学不好就吃翔(part32)--方法重写
- Linux运维系统工程师系列---11
- linux将分区从目录上卸载,Linux CentOS 硬盘分区、格式化、挂载与卸载
- linux dbm数据库,Linux dbm遇到的一些问题
- 固实压缩文件容易损坏_请慎重使用固实压缩文件
- Ubuntu找不到wifi适配器问题及解决办法
- 关于示波器探头的输入容抗问题解决
- 微信群控系统源码的实现原理,核心源码实现,核心框架。
- 神了!有人用一个项目把23种设计模式与六大原则融会贯通了
- Scratch技巧—-使用克隆技术实现菜单按钮