Ubuntu 通过串行端口发送300-400毫秒脉冲

Ubuntu 通过串行端口发送300-400毫秒脉冲,ubuntu,serial-port,Ubuntu,Serial Port,作为标题,我需要通过串行端口发送300-400毫秒的脉冲。我的传感器需要这样的脉冲才能唤醒。我的传感器的制作人提供的程序可以在Windows中执行此操作。但是我需要在ubuntu中开发一个类似的程序,因为我的项目使用的是ubuntu。 任何指点也将不胜感激 关于,首先,您需要确定要在哪个引脚上提供该脉冲。看看有哪些信号存在。虽然在Tx(传输数据)上发送脉冲是可行的,但这种情况相当少见,因此我假设您需要通过RTS或DTR发送脉冲 要做到这一点,你将需要,这就是如何做到这一点,假设你想脉冲DTR i

作为标题,我需要通过串行端口发送300-400毫秒的脉冲。我的传感器需要这样的脉冲才能唤醒。我的传感器的制作人提供的程序可以在Windows中执行此操作。但是我需要在ubuntu中开发一个类似的程序,因为我的项目使用的是ubuntu。 任何指点也将不胜感激


关于,

首先,您需要确定要在哪个引脚上提供该脉冲。看看有哪些信号存在。虽然在Tx(传输数据)上发送脉冲是可行的,但这种情况相当少见,因此我假设您需要通过RTS或DTR发送脉冲

要做到这一点,你将需要,这就是如何做到这一点,假设你想脉冲DTR

int pulseDTR(int fd)
{
    int status;

    // get the current modem control lines status
    if (ioctl(fd, TIOCMGET, &status) == -1) {
        // handle the error
    }

    // Now set DTR high
    status |= TIOCM_DTR;
    // and apply  
    if (ioctl(fd, TIOCMSET, &status) == -1) {
        // handle the error
    }
    // wait a bit
    usleep (400*1000);
    // Now set DTR low
    status &= ~TIOCM_DTR;
    // and apply  
    if (ioctl(fd, TIOCMSET, &status) == -1) {
        // handle the error
    }

    return 0;
}
如果需要脉冲RTS,只需将
TIOCM\U DTR
替换为
TIOCM\U RTS

有关串行端口编程的更多信息,我建议使用和

编辑:根据OP的评论,发送一个中断实际上是需要的。发送中断意味着Tx线路在一定时间内(而不是控制信号)被拉至逻辑0。这在中进行了描述,具体操作如下:

使用ioctl:

   int ioctl( fd, TCSBRK, int arg );
使用tc*呼叫

   int tcsendbreak( fd, int arg );
请注意网站上的评论

发送中断:这里的操作不同于传统的
ioctl()调用和POSIX调用。对于常规呼叫,arg为 “0”将UART的中断控制线设置为0.25秒。对于 POSIX命令,断开线设置为arg乘以0.1秒

EDIT2:开源最棒的地方是源代码是可用的:-)这是minicom源代码的逐字记录,非常棒,因为它显示了3种发送中断的方法:

/*
 * Send a break
 */
void m_break(int fd)
{
#ifdef USE_SOCKET
  if (portfd_is_socket)
    return;
#endif
#ifdef POSIX_TERMIOS
  tcsendbreak(fd, 0);
#else
#  ifdef _V7
#    ifndef TIOCSBRK
  {
    struct sgttyb sg, ng;

    ioctl(fd, TIOCGETP, &sg);
    ioctl(fd, TIOCGETP, &ng);
    ng.sg_ispeed = ng.sg_ospeed = B110;
    ng.sg_flags = BITS8 | RAW;
    ioctl(fd, TIOCSETP, &ng);
    write(fd, "\0\0\0\0\0\0\0\0\0\0", 10);
    ioctl(fd, TIOCSETP, &sg);
  }
#    else
  ioctl(fd, TIOCSBRK, 0);
  sleep(1);
  ioctl(fd, TIOCCBRK, 0);
#    endif
#  endif
#endif
} 
  • 我猜Linux使用了第一个选项,
    tcsendbreak(fd,0)
  • 第三个选项也很有趣,因为它执行
    ioctl(fd,TIOCSBRK,0)之后是一些睡眠呼叫,然后是
    ioctl(fd,TIOCCBRK,0)应允许您发送长度经过微调的中断信号
  • 第二个选项实际上很漂亮,因为它显示了如何通过修改端口设置和发送一串零来模拟中断。它在不实现中断的系统上总是有用的

  • 那么,结论是什么?首先尝试使用
    tcsendbreak(fd,0)因为这是最简单的,如果结果不好,请尝试
    ioctl(fd,TIOCSBRK,0);某种睡眠;ioctl(fd,tiocbrk,0)。在一个健全的系统上,“模拟中断”应该是不必要的。

    在哪一行?Tx或其中一条控制线(RTS、DTR)?我的传感器使用RS232,因此我使用RS232到USB将其连接到我的笔记本电脑。将来我会把它直接连接到我电脑的RS232端口。我会要求生产商提供发送脉冲所需的pin码,然后尽快回来。然而,正如我所说,我正在使用RS232到USB转换器将传感器连接到我的笔记本电脑上,我仍然可以从提供的Windows程序中唤醒传感器,因此,你对我需要发送脉冲的pin码有任何线索吗?不,对不起,这是两者之一,只有制造设备的人才能告诉你(或者这些信息可以在设备的技术文档中找到)。请注意USB转换器,除非你有最劣质的USB串行转换器。事实上,你通过这样一个转换器应该不会有任何区别,现在它们相当精确地模拟了真实的串行端口。我只是尝试从tera术语中突破(alt-B),它的工作原理与所提供程序的中断信号完全相同。同样,您有任何线索吗?在第tcsendbreak()页中如果终端使用异步串行数据传输,则在特定的持续时间内传输零值位的连续流。如果持续时间为零,则传输零值位的时间至少为0.25秒,不超过0.5秒。如果持续时间不为零,则发送零值位的时间长度为某个实现定义的时间长度。an在第页中,如果持续时间为零,则发送零值位的时间至少为0.25秒,但不超过0.5秒。如果持续时间不为零,则发送零值位的时间*N秒,其中N至少为0.25,但不超过0.5秒。那么,我如何知道我的系统每个功能的中断时间?