如题,我需要通过串口发送一个 300-400 ms 的脉冲。我的传感器需要这样的脉冲才能唤醒。我的传感器生产商提供的程序可以在 Windows 中执行此操作。但是我需要在 ubuntu 中开发一个类似的程序,因为我的项目使用的是 ubuntu。任何指向也表示赞赏。
问候,
如题,我需要通过串口发送一个 300-400 ms 的脉冲。我的传感器需要这样的脉冲才能唤醒。我的传感器生产商提供的程序可以在 Windows 中执行此操作。但是我需要在 ubuntu 中开发一个类似的程序,因为我的项目使用的是 ubuntu。任何指向也表示赞赏。
问候,
首先,您需要确定要在哪个引脚上发出该脉冲。查看RS232 上的 Wikipedia 页面,了解存在哪些信号。尽管在 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
.
有关串行端口编程的更多信息,我推荐POSIX 操作系统的串行编程指南和Linux 串行 Howto。
编辑:根据 OP 的评论发送休息实际上是需要的。发送中断意味着 Tx 线在一定时间内被拉到逻辑 0(而不是控制信号)。这在Linux 串行编程方法中进行了描述,并按如下方式完成:
使用 ioctl:
int ioctl( fd, TCSBRK, int arg );
使用 tc* 调用
int tcsendbreak( fd, int arg );
请注意Linux 串行编程指南中的注释
发送中断:这里的操作在传统的
ioctl() 调用和 POSIX 调用之间有所不同。对于常规调用,“0”的 arg 将 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
}
tcsendbreak(fd, 0);
ioctl(fd, TIOCSBRK, 0);
之后是一些睡眠呼叫,然后ioctl(fd, TIOCCBRK, 0);
应该允许您发送具有微调长度的中断信号。那么,结论呢?首先尝试,tcsendbreak(fd, 0);
因为它是最简单的,如果这没有给出好的结果,请尝试ioctl(fd, TIOCSBRK, 0); some sort of sleep ; ioctl(fd, TIOCCBRK, 0);
。在一个健全的系统上,“模拟中断”应该是不必要的。