gpt4 book ai didi

ubuntu - 通过串口发送一个 300-400 毫秒的脉冲

转载 作者:行者123 更新时间:2023-12-04 18:41:57 25 4
gpt4 key购买 nike

如题,我需要通过串口发送一个 300-400 ms 的脉冲。我的传感器需要这样的脉冲才能唤醒。我的传感器生产商提供的程序可以在 Windows 中执行此操作。但是我需要在 ubuntu 中开发一个类似的程序,因为我的项目使用的是 ubuntu。
任何指向也表示赞赏。

问候,

最佳答案

首先,您需要确定要在哪个引脚上发出该脉冲。看看the Wikipedia page on RS232查看存在哪些信号。虽然在 Tx(传输数据)上发送脉冲是可行的,但这种情况并不常见,所以我认为您需要通过 RTS 或 DTR 发送脉冲。

为此,您需要 ioctl这就是如何做到这一点,假设你想脉冲 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_DTR通过 TIOCM_RTS .

有关串行端口编程的更多信息,我推荐 Serial Programming Guide for POSIX Operating Systems。和 the Linux serial Howto .

编辑:根据 OP 的评论发送休息实际上是需要的。发送中断意味着 Tx 线在一定时间内被拉到逻辑 0(而不是控制信号)。这在 Linux serial programming howto 中有描述。并按如下方式完成:

使用 ioctl:
   int ioctl( fd, TCSBRK, int arg );

使用 tc* 调用
   int tcsendbreak( fd, int arg );

请注意来自 Linux serial programming howto 的评论

Send a break: Here the action differs between the conventional
ioctl() call and the POSIX call. For the conventional call, an arg of '0' sets the break control line of the UART for 0.25 seconds. For the POSIX command, the break line is set for arg times 0.1 seconds.



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);然后是一些 sleep 调用,然后是 ioctl(fd, TIOCCBRK, 0);应该允许您发送具有微调长度的中断信号。
  • 第二个选项实际上非常漂亮,因为它展示了如何通过摆弄端口设置和发送一串零来模拟中断。它在不实现中断的系统上总是有用的。

  • 那么,结论呢?首先尝试 tcsendbreak(fd, 0);因为它是最简单的,如果这没有给出好的结果,请尝试 ioctl(fd, TIOCSBRK, 0); some sort of sleep ; ioctl(fd, TIOCCBRK, 0); .在一个健全的系统上,“模拟中断”应该是不必要的。

    关于ubuntu - 通过串口发送一个 300-400 毫秒的脉冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15728273/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com