Alicat MC串行通信响应不一致

时间:2018-06-21 18:19:08

标签: python linux pyserial serial-communication

alicat MFC的数据表在这里:
http://www.alicat.com/documents/manuals/Gas_Flow_Controller_Manual.pdf

目标是在运行debian的触摸屏上使用pyserial,以通过RS-232向alicat MFC发送命令并接收响应。

我正在测试的命令是:

  • 将节点ID设置为“ A”:“ * @ = A \ r”(第36页)
  • 阅读寄存器20:“ A $$ R20 \ r”
  • 将目标流量设置为5.45:“ AS5.45”(第37页)
  • 获取当前状态:“ A \ r”

我正在使用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)

0 个答案:

没有答案