1

我想在我的 Mac 上使用 C 与我的 arduino “交谈”。我首先使用了arduino官网给出的链接中的代码:http: //todbot.com/blog/2006/12/06/arduino-serial-c-code-to-talk-to-arduino/

使用“闪烁”示例它根本不起作用,我知道当串行端口打开时较新的 arduinos 会重置,但即使添加延迟(最多 4 秒)它只会在我发送的任何字符时闪烁。

我还尝试通过在 termios 标志中禁用 HUPCL(应该防止重置)来更改代码,但它不会改变任何东西。

有趣的是,如果我在后台加载 Arduino 官方应用程序的串行监视器,它就可以工作。命令屏幕也功能齐全。所以我想这与串行通信的初始化有关。然后,我尝试使用stty -a获取监视器使用的标志(l、i、o 和 c),并在我的 C 程序中使用它们……但运气不好!

谢谢你的帮助!

PS:这是在 ebay 上购买的中国克隆......也许它可能是相关的

编辑:我尝试使用 python 对 pyserial 做同样的事情,它做同样的事情:仅当 arduino 应用程序的串行监视器同时运行时才有效

4

3 回答 3

3

嗯,我想我找到了。

我可以尝试一个 arduino Uno,结果是一样的。然后我意识到,由于某种晦涩的原因,我的 arduino 在每次通过串行端口进行通信时都会重置,而不仅仅是在第一次连接时。由于在 windows 下结果是一样的,我想这与我的笔记本电脑有关(MBP 15",2011 年初,10.7.4)。

然后我搜索了一下,发现实际上有一种方法可以使用 C 或 Python 禁用 DTR(使电路板复位的信号)。

import serial, time

#open the serial port
s = serial.Serial(port='/dev/tty.usbserial-A5006HGR', baudrate=9600)

#disable DTR
s.setDTR(level=False)

#wait for 2 seconds
time.sleep(2)

#send the data
s.write("7")

在 C 中,您需要从串行端口加载参数,禁用 DTR,然后更新参数,这是使用ioctl(来自http://www.easysw.com/~mike/serial/serial.html#5_1_2

//load status
int status;
ioctl(fd, TIOCMGET, &status);

//disable DTR
status &= ~TIOCM_DTR;

//update the status
ioctl(fd, TIOCMSET, &status);

这可以在端口打开后放在代码中。但是,板子在第一次连接时仍会重新启动,第一次延迟仍然是必要的。

我希望这将帮助处于相同(不寻常)情况的人们。

于 2012-07-09T13:28:36.813 回答
3

最后,我发现对于 Linux 中的 Python(在我的情况下为 2.7.3),您必须这样做:

ser = serial.Serial('/dev/ttyACM0', 9600)
ser.dsrdtr=False
ser.setDTR(level=False)

不会有重置

于 2012-12-17T19:58:44.983 回答
0

我还没有发现这种方法对于在 mac 上打开串口来说太可靠了。我建议使用 ioctl,因为它更加健壮并提供许多优势,主要是使用任意波特率。

#import <IOKit/serial/ioss.h>
#import <sys/ioctl.h>

- (int)serialInit:(const char*)path baud:(int)baud;
{
    struct termios options;

    // open the serial like POSIX C
    int serialFileDescriptor = open(path, O_RDWR | O_NOCTTY | O_NONBLOCK);

    // block non-root users from using this port
    ioctl(serialFileDescriptor, TIOCEXCL);

    // clear the O_NONBLOCK flag, so that read() will
    //   block and wait for data.
    fcntl(serialFileDescriptor, F_SETFL, 0);

    // grab the options for the serial port
    tcgetattr(serialFileDescriptor, &options);

    // setting raw-mode allows the use of tcsetattr() and ioctl()
    cfmakeraw(&options);

    // specify any arbitrary baud rate
    ioctl(serialFileDescriptor, IOSSIOSPEED, &baud);

    return serialFileDescriptor;
}
于 2012-07-08T23:58:44.723 回答