0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么你的串口总是丢一些特殊字符?

ZLG致远电子 2025-02-06 13:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

导读

嵌入式开发物联网应用中,Linux系统的串口通信至关重要。本文将简单介绍Linux下串口设备的命名规则和termios结构体,并解析终端的三种工作模式,帮助开发者更好地掌握Linux串口编程

Linux下串口设备名称一般为"/dev/ttySn",n是数字,若串口是 USB 扩展的,则串口设备文件命名多为/dev/ttyUSBn。串口是一个终端设备,在Linux中用 termios结构体来描述:

struct termios { tcflag_t c_cflag; /* 控制标志 */ tcflag_t c_iflag; /* 输入标志 */ tcflag_t c_oflag; /* 输出标志 */ tcflag_t c_lflag; /* 本地标志 */ tcflag_t c_cc[NCCS]; /* 控制字符 */ };

termios是在POSIX规范中定义的标准接口,表示终端设备(包括虚拟终端,串口等)。终端有 3 种工作模式,分别为规范模式(canonical mode)、非规范模式(non-canonical mode)和原始模式(raw mode)。

c_lflag 中设置 ICANNON 标志来定义终端的三种模式:规范模式、非规范模式和原始模式。

1. 规范模式

规范模式下所有的输入都是基于行进行处理的。在用户输入一个行结束符(回车符、EOF等)之前,系统调用read()函数读不到用户输入的任何字符。除了EOF之外的行结束符(回车符等)和普通字符一样都会被read()函数读取到缓冲区之中。在规范模式中,行编辑是可行的,而且一次调用read()函数最多只能读取一行数据。

2. 非规范模式

非规范模式所有的输入是即时有效的,不需要用户另外输入行结束符,而且不可进行行编辑。在非规范模式下,对参数 MIN(c_cc[VMIN])和 TIME(c_cc[VTIME])的设置决定read()函数的调用方式。设置可以有 4 种不同的情况。

  • VMIN=0和VTIME=0:read()函数立即返回。若有可读数据,则读取数据并返回被读取的字节数,否则读取失败并返回0。
  • VMIN >0和 VTIME =0:read()函数会被阻塞直到 VMIN 个字节数据可被读取。
  • VMIN =0和 VTIME >0:只要有数据可读或者经过VTIME 个1/10秒的时间,read()函数则立即返回,返回值为被读取的字节数。如果超时并且未读到数据,则 read()函数返回0。
  • VMIN >0和 VTIME >0:当有VMIN 个字节可读或者两个输入字符之间的时间间隔超过VTIME个1/10秒时,read()函数才返回。因为在输入第一个字符之后系统才会启动定时器,所以在这种情况下,read()函数至少读取一个字节之后才返回。

3. 原始模式

原始模式是一种特殊的非规范模式。在原始模式下,所有的输入数据以字节为单位被处理。在这个模式下,终端是不可回显的,而且所有特定的终端输入/输出控制处理不可用。通过调用 cfmakeraw()函数可以将终端设置为原始模式。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux系统
    +关注

    关注

    4

    文章

    609

    浏览量

    29640
  • 终端
    +关注

    关注

    1

    文章

    1240

    浏览量

    31498
  • 串口
    +关注

    关注

    15

    文章

    1607

    浏览量

    81941
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    labview串口通信的一些心得

    、由于通常情况下LabVIEW串口VI接收或发送的都是字符串(Normal),这里是指串口通信中,如果不是在串口通信,我们可以做个小小的验证,在前面板中,
    发表于 12-27 11:58

    labview串口通信的一些心得

    、由于通常情况下LabVIEW串口VI接收或发送的都是字符串(Normal),这里是指串口通信中,如果不是在串口通信,我们可以做个小小的验证, 在前面板中,
    发表于 11-30 19:47

    CC2540ble 的串口通信总是数,为什么?

    CC2540 ble 的串口通信总是数,为什么?我使用的是ble 1.4.1协议栈。直接使用里面的串口程序,总是
    发表于 03-11 15:07

    关于串口一些分享

    串口是学习单片机重要的项,用来显示数据和一些简单的控制命令非常方便,经过笔者这几天的测试,总结出了一些需要注意的地方:(以下代码全部基于单片机STM32F407实现)1、关于发送除非
    发表于 10-13 10:43

    LABVIEW读取串口返回命令,字符丢失

    各位大神你们好,采用LABVIEW串口与下位机MCU通信,每60sMCU回复个CHARGE_OVER#的字符串,LABVIEW串口接受该字符
    发表于 08-31 17:13

    求助!!LABVIEW读取串口返回命令,字符丢失

    各位大神你们好,采用LABVIEW串口与下位机MCU通信,每60sMCU回复个CHARGE_OVER#的字符串,LABVIEW串口接受该字符
    发表于 09-04 09:10

    GD32F310开发板串口一些特殊功能介绍

    串口主要用于通信和调试信息输出,今天仔细观察GDF310的数据手册发现一些特殊功能:1、自动波特率检测;2、数据发送/接受,高位在前/后;3、数据位反转;4、TX/RX管脚交换。针对以上的5个
    发表于 09-22 15:40

    CH582如果打印一些特殊功能按键应该怎么修改呢?

    使用CH582开发板烧录HostU2Enum代码后,USB2插入键盘,使用串口打印键值,音量加减等一些特殊功能按键没有打印出,请问官方如果打印这些特殊功能按键应该具体怎么修改呢?
    发表于 10-09 07:19

    PCB设计中的一些特殊规则及抗干扰设计的要求概述

    本文通过几个典型的例子分析了各种干扰产生的途径和原因,介绍了PCB(Printing Circuit Board)设计中的一些特殊规则及抗干扰设计的要求。
    的头像 发表于 04-30 19:26 6566次阅读

    51单片机串口通信的一些基础知识免费下载

    本文档的主要内容详细介绍的是51单片机串口通信的一些基础知识免费下载。
    发表于 08-21 17:31 9次下载
    51单片机<b class='flag-5'>串口</b>通信的<b class='flag-5'>一些</b>基础知识免费下载

    关于C语言的一些特殊功能介绍

    C语言之所以那么受欢迎,除了C语言历史悠久之外,还有它具有一些编程语言没有的功能。那么,今年我们就来了解下C语言的一些特殊功能。
    的头像 发表于 08-18 15:31 3148次阅读
    关于C语言的<b class='flag-5'>一些</b><b class='flag-5'>特殊</b>功能介绍

    STM32中遇到的问题--关于串口一些常见问题

    在单片机的开发过程中,最常用的外设就是串口了,是用来进行bug纠错、log输出的常用工具,也是用来与外部通讯的常见协议之。 但是在使用串口的过程中难免会遇到一些问题,下面就我在工作遇
    发表于 12-24 18:51 2次下载
    STM32中遇到的问题--关于<b class='flag-5'>串口</b>的<b class='flag-5'>一些</b>常见问题

    格式化字符串常量f-strings一些不常见的特性

    【导语】:本文介绍了“格式化字符串常量”f-strings一些不常见的特性,包括:格式化日期和时间、同时打印变量名和变量值等,嵌套使用f-strings等,此外与其他格式化字符串的方法相比,f-strings的速度更快,因此,学
    的头像 发表于 08-15 12:00 1679次阅读

    一些封装中没有串口,或者串口已经被用作其他用途,要如何输出log?

    一些封装中没有串口,或者串口已经被用作其他用途,要如何输出log? 在一些封装中,例如在裸机程序或者嵌入式系统中,因为种种原因,可能不存在串口
    的头像 发表于 10-31 14:37 1024次阅读

    字符型LCD显示器的应用和例程

    字符型显示器的应用越来越普遍。熟悉一些字符型显示器的使用显得非常重要。我们还可以使用一些特殊字符
    的头像 发表于 11-09 10:03 2644次阅读
    <b class='flag-5'>字符</b>型LCD显示器的应用和例程