linux串口收发数据不对(由于流控等设置不对导致)
2015-05-25 16:56
1086 查看
最近一个项目使用了嵌入式linxu串口通信,由于通信使用的是2进制数据,经常出现通信校验失败,数据帧大小没问题,就是校验出错
c_iflag参数表
c_oflag:输出模式标志,控制终端输出方式,具体参数如表2所示。 表2 c_oflag参数
c_cflag:控制模式标志,指定终端硬件控制信息,具体参数如表3所示。 表3 c_cflag参数
c_lflag:本地模式标志,控制终端编辑功能,具体参数如表4所示。 表4 c_lflag参数
c_cc[NCCS]:控制字符,用于保存终端驱动程序中的特殊字符,如输入结束符等。c_cc中定义了如表5所示的控制字符。 表5 c_cc支持的控制字符
tcsetattr函数用于设置终端的相关参数。参数fd为打开的终端文件描述符,参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数。 optional_actions可以取如下的值: TCSANOW:不等数据传输完毕就立即改变属性。 TCSADRAIN:等待所有数据传输结束才改变属性。 TCSAFLUSH:清空输入输出缓冲区才改变属性。
错误信息: EBADF:非法的文件描述符。 EINTR:tcsetattr函数调用被信号中断。 EINVAL:参数optional_actions使用了非法值,或参数termios中使用了非法值。 ENCTTY:非终端的文件描述符。
c_iflag参数表
键 值 | 说 明 |
IGNBRK | 忽略BREAK键输入 |
BRKINT | 如果设置了IGNBRK,BREAK键输入将被忽略 |
IGNPAR | 忽略奇偶校验错误 |
PARMRK | 标识奇偶校验错误 |
INPCK | 允许输入奇偶校验 |
ISTRIP | 去除字符的第8个比特 |
INLCR | 将输入的NL(换行)转换成CR(回车) |
IGNCR | 忽略输入的回车 |
ICRNL | 将输入的回车转化成换行(如果IGNCR未设置的情况下) |
IUCLC | 将输入的大写字符转换成小写字符(非POSIX) |
IXON | 允许输出时对XON/XOFF流进行控制 |
IXANY | 输入任何字符将重启停止的输出 |
IXOFF | 允许输入时对XON/XOFF流进行控制 |
IMAXBEL | 当输入队列满的时候开始响铃 |
键 值 | 说 明 |
OPOST | 处理后输出 |
OLCUC | 将输入的小写字符转换成大写字符(非POSIX) |
ONLCR | 将输入的NL(换行)转换成CR(回车)及NL(换行) |
OCRNL | 将输入的CR(回车)转换成NL(换行) |
ONOCR | 第一行不输出回车符 |
ONLRET | 不输出回车符 |
OFILL | 发送填充字符以延迟终端输出 |
OFDEL | 以ASCII码的DEL作为填充字符,如果未设置该参数,填充字符为NUL |
NLDLY | 换行输出延时,可以取NL0(不延迟)或NL1(延迟0.1s) |
CRDLY | 回车延迟,取值范围为:CR0、CR1、CR2和 CR3 |
TABDLY | 水平制表符输出延迟,取值范围为:TAB0、TAB1、TAB2和TAB3 |
BSDLY | 空格输出延迟,可以取BS0或BS1 |
VTDLY | 垂直制表符输出延迟,可以取VT0或VT1 |
FFDLY | 换页延迟,可以取FF0或FF1 |
键 值 | 说 明 |
CBAUD | 波特率(4+1位)(非POSIX) |
CBAUDEX | 附加波特率(1位)(非POSIX) |
CSIZE | 字符长度,取值范围为CS5、CS6、CS7或CS8 |
CSTOPB | 设置两个停止位 |
CREAD | 使用*** |
PARENB | 使用奇偶校验 |
PARODD | 对输入使用奇偶校验,对输出使用偶校验 |
HUPCL | 关闭设备时挂起 |
CLOCAL | 忽略调制解调器线路状态 |
CRTSCTS | 使用RTS/CTS流控制 |
键 值 | 说 明 |
ISIG | 当输入INTR、QUIT、SUSP或DSUSP时,产生相应的信号 |
ICANON | 使用标准输入模式 |
XCASE | 在ICANON和XCASE同时设置的情况下,终端只使用大写。 |
ECHO | 显示输入字符 |
ECHOE | 如果ICANON同时设置,ERASE将删除输入的字符 |
ECHOK | 如果ICANON同时设置,KILL将删除当前行 |
ECHONL | 如果ICANON同时设置,即使ECHO没有设置依然显示换行符 |
ECHOPRT | 如果ECHO和ICANON同时设置,将删除打印出的字符(非POSIX) |
TOSTOP | 向后台输出发送SIGTTOU信号 |
宏 | 说 明 | 宏 | 说 明 |
VINTR | Interrupt字符 | VEOL | 附加的End-of-file字符 |
VQUIT | Quit字符 | VTIME | 非规范模式读取时的超时时间 |
VERASE | Erase字符 | VSTOP | Stop字符 |
VKILL | Kill字符 | VSTART | Start字符 |
VEOF | End-of-file字符 | VSUSP | Suspend字符 |
VMIN | 非规范模式读取时的最小字符数 |
错误信息: EBADF:非法的文件描述符。 EINTR:tcsetattr函数调用被信号中断。 EINVAL:参数optional_actions使用了非法值,或参数termios中使用了非法值。 ENCTTY:非终端的文件描述符。
相关文章推荐
- Linux下使用jpnevulator监听串口收发数据
- Linux串口程序收发16进制数据错误
- 【DataGuard】由于备库参数设置不当导致数据文件无法添加的故障分析
- linux网络编程:设置非阻塞socket收发数据
- linux网络编程:设置非阻塞socket收发数据
- linux中如何读取串口收发数据
- 数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
- 这个当单片机程序怎么会不停的通过串口发数据,设置波特率为9600,但是串口软件接受数据不对(初学者,请高手指教)
- 今天 重装 mindmanager9 的时候,由于语言设置后, 导致eclipse编码不对而产生乱码
- 串口通讯奇偶校验位的设置导致数据错误
- 解决 linux 由于修改 /etc/inittab 文件,导致 设置开机启动级别为 6 (重启)
- linux上面运行python抓取数据时由于chromedriver和chromium没有关闭导致的内存泄漏的问题解决方案
- Linux下QT串口通过无线模块收发十六进制数据
- 在串口中收发浮点型数据的一种方法
- Android(Linux)实时监测串口数据
- 由于mysql运行权限导致无法找到 Discuz! 论坛数据表! 的解决方法
- Linux rescue模式修复由于libc.so.6错误导致系统所有命令不可用的问题
- linux下多线程多串口数据转发程序
- 因没有设置文件夹权限导致的发布的页面不能在文本中写人数据
- java 串口编程----设置缓冲屈来读取串口数据