alicat MFC的数据表在这里:
http://www.alicat.com/documents/manuals/Gas_Flow_Controller_Manual.pdf
目标是在运行debian的触摸屏上使用pyserial,以通过RS-232向alicat MFC发送命令并接收响应。
我正在测试的命令是:
我正在使用pyserial访问具有19200、8n1和无流控制的正确设备(第35页) 我知道设置正确,因为我/ do /得到响应。但是,如果我尝试多次读取同一寄存器,则可能会收到1/10次响应,并且很多时候它完全失败。
如果我执行screen <device> 19200
,则好像我得到了对正确命令的正确响应。我尝试在该屏幕会话上运行strace,看起来确实是先发送write(“ A”),然后发送write(“ \ r”):
Process 9127 attached
select(1024, [3 4 6], [], NULL, NULL) = 1 (in [3])
read(3, "A", 4096) = 1
select(1024, [3 4 6], [6], NULL, NULL) = 1 (out [6])
write(6, "A", 1) = 1
select(1024, [3 4 6], [], NULL, NULL) = 1 (in [3])
read(3, "\r", 4096) = 1
select(1024, [3 4 6], [6], NULL, NULL) = 1 (out [6])
write(6, "\r", 1) = 1
select(1024, [3 4 6], [], NULL, NULL) = 1 (in [6])
read(6, "A +014.04 +023.2", 4096) = 16
select(1024, [3 4 6], [3], NULL, NULL) = 1 (out [3])
write(3, "A +014.04 +023.2", 16) = 16
select(1024, [3 4 6], [], NULL, NULL) = 1 (in [6])
read(6, "7 +000.00 +000.0", 4096) = 16
select(1024, [3 4 6], [3], NULL, NULL) = 1 (out [3])
write(3, "7 +000.00 +000.0", 16) = 16
select(1024, [3 4 6], [], NULL, NULL) = 1 (in [6])
read(6, "0 000.00 N2", 4096) = 16
select(1024, [3 4 6], [3], NULL, NULL) = 1 (out [3])
write(3, "0 000.00 N2", 16) = 16
select(1024, [3 4 6], [], NULL, NULL) = 1 (in [6])
read(6, "\r", 4096) = 1
select(1024, [3 4 6], [3], NULL, NULL) = 1 (out [3])
write(3, "\r", 1) = 1
select(1024, [3 4 6], [], NULL, NULL
但是,如果我对minicom进行上述操作,则不会得到任何回应。我什至调整了设置,以使没有局部回波,并且在命令末尾有回车符。以下是strace的输出:
Process 9410 attached
select(4, [0 3], NULL, NULL, {0, 7775}) = 0 (Timeout)
ioctl(3, TIOCMGET, [TIOCM_DTR|TIOCM_RTS|TIOCM_CAR|TIOCM_DSR]) = 0
gettimeofday({1529604087, 999237}, NULL) = 0
gettimeofday({1529604087, 999684}, NULL) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B2400 -opost -isig -icanon -echo ...}) = 0
select(4, [0 3], NULL, NULL, {1, 0}) = 1 (in [0], left {0, 146947})
read(0, "A", 32) = 1
write(3, "A", 1) = 1
ioctl(3, TIOCMGET, [TIOCM_DTR|TIOCM_RTS|TIOCM_CAR|TIOCM_DSR]) = 0
gettimeofday({1529604088, 855852}, NULL) = 0
gettimeofday({1529604088, 856337}, NULL) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B2400 -opost -isig -icanon -echo ...}) = 0
select(4, [0 3], NULL, NULL, {1, 0}) = 1 (in [0], left {0, 699690})
read(0, "\r", 32) = 1
write(3, "\r", 1) = 1
ioctl(3, TIOCMGET, [TIOCM_DTR|TIOCM_RTS|TIOCM_CAR|TIOCM_DSR]) = 0
gettimeofday({1529604089, 160058}, NULL) = 0
gettimeofday({1529604089, 160560}, NULL) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B2400 -opost -isig -icanon -echo ...}) = 0
select(4, [0 3], NULL, NULL, {1, 0}) = 0 (Timeout)
ioctl(3, TIOCMGET, [TIOCM_DTR|TIOCM_RTS|TIOCM_CAR|TIOCM_DSR]) = 0
gettimeofday({1529604090, 163925}, NULL) = 0
gettimeofday({1529604090, 164414}, NULL) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B2400 -opost -isig -icanon -echo ...}) = 0
select(4, [0 3], NULL, NULL, {1, 0}) = 0 (Timeout)
ioctl(3, TIOCMGET, [TIOCM_DTR|TIOCM_RTS|TIOCM_CAR|TIOCM_DSR]) = 0
gettimeofday({1529604091, 168832}, NULL) = 0
gettimeofday({1529604091, 169992}, NULL) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B2400 -opost -isig -icanon -echo ...}) = 0
select(4, [0 3], NULL, NULL, {1, 0}) = 1 (in [0], left {0, 694528})
read(0, "A", 32) = 1
write(3, "A", 1) = 1
ioctl(3, TIOCMGET, [TIOCM_DTR|TIOCM_RTS|TIOCM_CAR|TIOCM_DSR]) = 0
gettimeofday({1529604091, 482873}, NULL) = 0
gettimeofday({1529604091, 483884}, NULL) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B2400 -opost -isig -icanon -echo ...}) = 0
select(4, [0 3], NULL, NULL, {1, 0}) = 1 (in [0], left {0, 736296})
read(0, "\r", 32) = 1
write(3, "\r", 1) = 1
ioctl(3, TIOCMGET, [TIOCM_DTR|TIOCM_RTS|TIOCM_CAR|TIOCM_DSR]) = 0
gettimeofday({1529604091, 753890}, NULL) = 0
gettimeofday({1529604091, 754882}, NULL) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B2400 -opost -isig -icanon -echo ...}) = 0
select(4, [0 3], NULL, NULL, {1, 0}^CProcess 9410 detached
<detached ...>
如果我尝试通过pyserial向设备写入“ A \ r”,这就是strace输出的样子:
Process 9590 attached
select(1, [0], NULL, NULL, NULL) = 1 (in [0])
rt_sigaction(SIGWINCH, {0x76c22a0d, [], SA_RESTORER|SA_RESTART, 0x76de8ae1}, {SIG_DFL, [], SA_RESTORER, 0x76de8ae1}, 8) = 0
read(0, "\r", 1) = 1
write(1, "\n", 1) = 1
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(0, SNDCTL_TMR_STOP or SNDRV_TIMER_IOCTL_GINFO or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x76de8ae1}, {0x76c22a0d, [], SA_RESTORER|SA_RESTART, 0x76de8ae1}, 8) = 0
gettimeofday({1529604572, 761316}, NULL) = 0
write(3, "A\r", 2) = 2
select(7, [6], [3], [], NULL) = 1 (out [3])
write(1, "2\n", 2) = 2
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, TIOCGWINSZ, {ws_row=53, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(0, SNDRV_TIMER_IOCTL_STATUS or TIOCSWINSZ, {ws_row=53, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_STOP or SNDRV_TIMER_IOCTL_GINFO or TCSETSW, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
write(1, ">>> ", 4) = 4
select(1, [0], NULL, NULL, NULL
如果我检查串行对象的in_waiting属性,它为0。我尝试在运行上述写入之前刷新串行对象,结果类似。我也尝试使用termios参数尝试失败。电缆是定制的,但我已经检查了好几次,看起来还是正确的(特别是因为屏幕在工作)
为什么默认情况下屏幕无法运行,但minicom或pyserial无法运行?如何找出不同的设置?
编辑: 我的python代码的相关部分是:
from serial import *
s = Serial(port="/dev/ttymxc4", baudrate=19200, bytesize=EIGHTBITS,
stopbits=STOPBITS_ONE, parity=PARITY_NONE, xonxoff=False,
timeout=0.5)
for i in range(5):
s.flush()
s.write(b'A\r') # Alicat command to display status
sleep(0.5)
response = s.read(s.in_waiting) # Response should not be empty
if response != "":
break
sleep(0.5)