Linux下串口通信
更新时间:2024-06-02 10:54:01 阅读量: 综合文库 文档下载
- linux 串口推荐度:
- 相关推荐
Linux下串口编程
Linux 系统下,诸如串口、触摸屏、GPIO、ADC 等等各种设备的操作,都是通过访问其对应的设备节点进行控制。相应地,串口通过访问/dev/ttyS0、/dev/ttyS1、/dev/ttyS2...对其进行配置与控制。
串口配置的参数包括:波特率,数据位,校验位,停止位与流控。 串口的配置主要是通过配置struct termios结构体,其原型如下: #include
unsigned short c_iflag; /*输入模式标志*/ unsigned short c_oflag; /*输出模式标志*/ unsigned short c_cflag; /*控制模式标志*/ unsigned short c_lfag; /*本地模式标志*/ unsigned short c_line; /*line discipline*/ unsigned short c_cc[NCC]; /*control characters*/ };
其中,通过对c_cflag与c_iflag的赋值,可以设置波特率、数据位、奇偶校验位、停止位、流控。
1、波特率配置
串口通过函数cfsetispeed和cfsetospeed设置端口的输入/输出波特率:
int cfsetispeed(struct termios *termios_p, speed_t speed); int cfsetospeed(struct termios *termios_p, speed_t speed); 其中termios_p为串口结构体termios指针变量;speed 为需要设置的串口传输速率,取值与波特率对应关系见表一:
表一
2、数据位配置
串口数据位的配置通过修改termios结构体成员c_cflag实现,CS5、CS6、CS7和CS8分别表示数据位为5、6、7和8。在设置数据位前,先使用CSIZE 做位屏蔽: termios_p.c_cflag&= ~CSIZE;
termios_p.c_cflag |= CS5; /*配置为5数据位*/
3、校验位配置
校验位包括:无校验、奇校验、偶校验、空格等: 无校验:
termios_p.c_cflag&= ~PARENB; termios_p.c_iflag&= ~INPCK; 奇校验:
termios_p.c_cflag|= (PARODD | PARENB); termios_p.c_iflag|= INPCK; 偶校验:
termios_p.c_cflag |= PARENB; termios_p.c_cflag&= ~PARODD; termios_p.c_iflag|= INPCK; 空格:
termios_p.c_cflag&= ~PARENB; termios_p.c_cflag&= ~CSTOPB;
4、停止位配置
串口停止位通过激活c_cflag的CSTOPB 控制,具体方法如下:1个停止位:
termios_p.c_cflag&= ~CSTOPB; 2个停止位:
termios_p.c_cflag |= CSTOPB;
5、流控配置
流控用于标识数据的开始与结束,流控的种类包括硬件流、软件流与不使用流控。 不使用流控:
termios_p.c_cflag&= ~CRTSCTS; 硬件流:
termios_p.c_cflag |= CRTSCTS; 软件流:
termios_p.c_cfalg |= IXON | IXOFF | IXANY;
6.串口编程中常用的函数原型:
1)tcgetattr()函数用于获取与终端相关的参数。 int tcgetattr(intfd, structtermios *termios_p);
参数fd为终端的文件描述符,返回的结果保存在termios结构体中。
2)tcsetattr()函数用于设置终端参数。 int
tcsetattr(intfd,
intoptional_actions,
conststructtermios
*termios_p);
函数在成功的时候返回0,失败的时候返回-1,并设置errno的值。参数fd为打开的终端文件描述符,参数optional_actions用于控
制修改起作用的时间,而结构体termios_p中保存了要修改的参数。optional_actions可以取如下的值。
TCSANOW:不等数据传输完毕就立即改变属性。 TCSADRAIN:等待所有数据传输结束才改变属性。 TCSAFLUSH:清空输入输出缓冲区才改变属性。 错误信息:
EBADF:非法的文件描述符。
EINTR:tcsetattr函数调用被信号中断。
EINVAL:参数optional_actions使用了非法值,或参数termios中使用了非法值。
ENCTTY:非终端的文件描述符。
3)tcflush()函数用于刷清(扔掉)输入缓存(终端驱动法度已接管到,但用户法度尚未读)或输出缓存(用户法度已经写,但尚未发送).
int tcflush(intfd,intquene) 参数fd为打开的终端文件描述符; quene数该当是下列三个常数之一: *TCIFLUSH 刷清输入队列 *TCOFLUSH 刷清输出队列
*TCIOFLUSH 同时刷清收到的数据但是不读,并且刷清写入的数据但是不传送。
通俗地说就是将输出缓冲器清空,把输入缓冲区清空。缓冲区里的数据都废弃。
4)波特率配置
串口通过函数cfsetispeed和cfsetospeed设置端口的输入/输出波特率:
int cfsetispeed(structtermios *termios_p, speed_t speed); int cfsetospeed(structtermios *termios_p, speed_t speed);
其中termios_p为串口结构体termios指针变量;speed 为需要设置的串口传输速率,取值与波特率对应关系见表一。
7.例子程序:
程序实现了配置串口0参数与向串口0输出数据 #include
voidSet_uart(intfd, intdatabits, intstopbit, char parity, char datastream) { int ret;
structtermiostermios_opt; if(tcgetattr(fd, &termios_opt)) {
perror(\return; }
/*flush memory*/ tcflush(fd,TCIOFLUSH); /*Set i/o speed*/
cfsetispeed(&termios_opt, B115200); cfsetospeed(&termios_opt, B115200); /*set databits,default is 8 databits*/ termios_opt.c_cflag&= ~CSIZE; switch (databits) { case 5:
termios_opt.c_cflag |= CS5; break; case 6:
termios_opt.c_cflag |= CS6; break; case 7:
termios_opt.c_cflag |= CS7; break; case 8:
termios_opt.c_cflag |= CS8; break; default:
termios_opt.c_cflag |= CS8; break; }
/*Set Parity, default is no vertify*/ switch (parity) {
case 'N': /*no vertify*/
termios_opt.c_cflag&= ~PARENB; termios_opt.c_iflag&= ~INPCK; break;
case 'O': /*odd vertify*/
termios_opt.c_cflag |= (PARODD | PARENB); termios_opt.c_iflag |= INPCK;
break;
case 'E': /*even vertify*/ termios_opt.c_cflag |= PARENB; termios_opt.c_cflag&= ~PARODD; termios_opt.c_iflag |= INPCK; break;
case 'S': /*space vertify*/ termios_opt.c_cflag&= ~PARENB; termios_opt.c_cflag&= ~CSTOPB; termios_opt.c_iflag |= INPCK; break; default:
termios_opt.c_cflag&= ~PARENB; termios_opt.c_iflag&= ~INPCK; break; }
/*Set stop bits, default is 1 stopbit*/ switch (stopbit) { case 1:
termios_opt.c_cflag&= ~CSTOPB; break;
case 2:
termios_opt.c_cflag |= CSTOPB; break; default:
termios_opt.c_cflag&= ~CSTOPB; break; }
/*set data stream,default is no data stream control*/ switch (datastream) {
case 'N': /*no data stream control*/ termios_opt.c_cflag&= ~CRTSCTS; break;
case 'H': /*hardware data stream control*/ termios_opt.c_cflag |= CRTSCTS; break;
case 'S': /*software data stream control*/ termios_opt.c_cflag |= IXON | IXOFF | IXANY; break; default:
termios_opt.c_cflag&= ~CRTSCTS; break;
}
/*oputmodle,initial data output*/ termios_opt.c_oflag&= ~OPOST;
/*set waiting time and recv min character*/ termios_opt.c_cc[VTIME] = 0; termios_opt.c_cc[VMIN] = 0; /*flush memory*/ tcflush(fd,TCIFLUSH); /*start using new options*/
if((tcsetattr(fd,TCSANOW,&termios_opt)) != 0) {
perror(\return; }
printf(\return ; }
int main(void) {
intserial_fd;
unsigned char data[14] = {0}; memset(data,'a',sizeof(data));
printf(\
serial_fd = open(\if (serial_fd == -1) {
perror(\return -1; }
/*Set uart*/
Set_uart(serial_fd, 8, 1, 'N', 'N'); //8 databits, 1 stopbit, No vertify, No data stream control while(1) {
write(serial_fd, data, sizeof(data)); tcdrain(serial_fd); sleep(2); }
close(serial_fd); return 0; }
正在阅读:
Linux下串口通信06-02
鲸的自述作文500字07-13
复旦MBA提前批面试流程及内容06-11
2022-2022年小学语文安徽小升初冲刺拔高试卷【42】含答案考点及04-08
谢谢您老师作文700字06-16
上海大学机械设计(2)模拟试题集及答案20130506-02
中国体育用品市场评估报告目录05-22
高考作文六种审题立意的方法01-26
平足康复的基本原理和误区 - 图文05-01
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 串口
- 通信
- Linux
- 武威市餐厨垃圾处理管理实施方案
- 关于发布《工程建设标准强制性条文》
- 作文教学存在的问题及对策
- SFJ-261 型氦质谱检漏仪使用说明书
- 计算数学专业攻读硕士学位研究生培养方案
- 漂亮的淘宝店铺全屏背景大图制作详细图解
- 产业链金融视角下财务公司融资产品定价研究基于模糊B―S欧式看跌
- 留学知识-日本留学干货在日本租房注意事项 精品
- 马商县交规模拟考试精选第1套试题
- 二期凤岭地上室钢筋工程施工方案 - 图文
- “十三五”智慧城市总体规划(2016-2020年)
- 2017届湖南省十三校高三第二次联考地理试题及答案
- 屋面工程施工工艺标准 - 图文
- 都匀市水稻白背飞虱综合防治技术
- 电工学题库
- 商务谈判 习题库 许志锋整理
- 助你苗条的九种食物 docx
- 广东省汕头市金山中学2013届高三上学期期中考试 数学文试题
- 初三英语复习单元练习卷8A Unit4-6
- 临床医学概要外科复习题