怎样同时对串口进行收和发的操作?

sh/bash/dash/ksh/zsh等Shell脚本
回复
cnxk
帖子: 9
注册时间: 2020-01-08 14:43
系统: Linux version 3.2.40
送出感谢: 1 次
接收感谢: 0

怎样同时对串口进行收和发的操作?

#1

帖子 cnxk » 2020-04-29 13:50

一个shell正在对串口读出(cat)的同时下能不能再对串口进行写(echo)操作,怎样实现?

不知道是串口设置的原因还是其它原因,现在接收串口数据正常,如果开始不接收数据,直接发数据可以。只要执行过接收命令后就不能发送命令了,除非重启前端设备,我第一次弄LINUX串口,是不是有什么清除串口缓存的命令或者初始货串口命令不对?希望有相关经验的高手指点指点。
我串口的初始化命令是:
stty -F /dev/ttyS1 9600 raw
上次由 cnxk 在 2020-04-30 10:16,总共编辑 1 次。
头像
astolia
论坛版主
帖子: 4629
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 775 次

Re: 怎样同时对串口进行收和发的操作?

#2

帖子 astolia » 2020-04-29 21:07

cat /dev/ttyS0 &
echo abc > /dev/ttyS0
这些用户感谢了作者 astolia 于这个帖子:
cnxk (2020-04-29 22:17)
评价: 3.7%
cnxk
帖子: 9
注册时间: 2020-01-08 14:43
系统: Linux version 3.2.40
送出感谢: 1 次
接收感谢: 0

Re: 怎样同时对串口进行收和发的操作?

#3

帖子 cnxk » 2020-04-29 22:22

这样同时使用cat和echo的话不是限定只能发送abc这条命令了吗?能不能任何时候发送任意指令,或者折中先把cat暂停发关完ECHO再执行CAT的方法?
cnxk
帖子: 9
注册时间: 2020-01-08 14:43
系统: Linux version 3.2.40
送出感谢: 1 次
接收感谢: 0

Re: 怎样同时对串口进行收和发的操作?

#4

帖子 cnxk » 2020-04-30 8:58

不知道是串口设置的原因还是其它原因,现在接收串口数据正常,如果开始不接收数据,直接发数据可以。只要执行过接收命令后就不能发送命令了,除非重启前端设备,我第一次弄LINUX串口,是不是有什么清除串口缓存的命令或者初始货串口命令不对?希望有相关经验的高手指点指点。
我串口的初始化命令是:
stty -F /dev/ttyS1 9600 raw
头像
astolia
论坛版主
帖子: 4629
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 775 次

Re: 怎样同时对串口进行收和发的操作?

#5

帖子 astolia » 2020-04-30 13:22

cnxk 写了:
2020-04-30 8:58
不知道是串口设置的原因还是其它原因,现在接收串口数据正常,如果开始不接收数据,直接发数据可以。只要执行过接收命令后就不能发送命令了,除非重启前端设备
看起来是你的设备/相应驱动不支持全双工。因为用cat读取时,除非遇到EOF或出错,都会一直读下去,如果没有数据可读,就会进入阻塞状态,不是全双工的话会导致无法写入

你可以拿支持全双工的虚拟串口设备来做个实验
先用socat把两个虚拟串口设备的输入和输出端连起来

代码: 全选

socat -d -d pty,raw,echo=0 pty,raw,echo=0
再在两个终端中分别运行

代码: 全选

cat /dev/pts/1 &

代码: 全选

cat /dev/pts/2 &
然后就可以随意在其中一个终端中运行echo abc > /dev/pts/N,然后另一个终端就会显示相应的数据

对于你那种半双工的情况,如果知道待读取数据的长度,可以选择用dd来只读取指定长度的内容,防止无数据可读进入阻塞状态

代码: 全选

dd if=/dev/pts/1 bs=字节数 count=1 status=none
如果数据长度不定,也可以以非阻塞模式来读取数据

代码: 全选

dd if=/dev/pts/1 iflag=nonblock status=none 2>/dev/null
cnxk
帖子: 9
注册时间: 2020-01-08 14:43
系统: Linux version 3.2.40
送出感谢: 1 次
接收感谢: 0

Re: 怎样同时对串口进行收和发的操作?

#6

帖子 cnxk » 2020-04-30 14:51

linux下的串口全双工是不是需要设置的,或者说怎么设置,因为在winodws下面串口助手是可以收发同时操作的
头像
astolia
论坛版主
帖子: 4629
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 775 次

Re: 怎样同时对串口进行收和发的操作?

#7

帖子 astolia » 2020-04-30 16:35

cnxk 写了:
2020-04-30 14:51
linux下的串口全双工是不是需要设置的,或者说怎么设置,因为在winodws下面串口助手是可以收发同时操作的
不需要设置,或者说是不是全双工是看你设备的具体情况。你拿个rs485就只能半双工
即使是半双工,也可以实现串口助手那样的效果啊,只要用非阻塞I/O,或者是带超时控制的阻塞I/O都行。你要限定用shell,操作就要麻烦些。自己写个程序来做又不难,会用多线程的话就更简单了
cnxk
帖子: 9
注册时间: 2020-01-08 14:43
系统: Linux version 3.2.40
送出感谢: 1 次
接收感谢: 0

Re: 怎样同时对串口进行收和发的操作?

#8

帖子 cnxk » 2020-05-06 12:03

我找到原因了,是初始化串口的问题。我用root权限执行
stty -F /dev/ttyS5 speed 9600 cs8 -parenb -cstopb -echo
初始化一遍串口后问题解决了,应该是停止位的原因,设置停止位后可以保持服务器端和客户端的时钟相同
回复

回到 “Shell脚本”