我想在我的 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 应用程序的串行监视器同时运行时才有效
最佳答案
好吧,我想我找到了。
我尝试了 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);
这可以放在端口打开后的代码中。然而开发板仍会在第一次连接时重启,因此第一次延迟仍然是必要的。
我希望这会帮助处于相同(不寻常)情况的人们。
关于c - 使用 arduino 和 C 初始化串行接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11385915/