c - 使用 arduino 和 C 初始化串行接口(interface)

标签 c macos serial-port arduino

我想在我的 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/

相关文章:

c - Debian 自动超时中的串行通信

c - 对于数组,为什么 a[5] == 5[a]?

c - 为什么需要多个 EOF (CTRL+Z) 字符?

c++ - UCI 种子数据集上的 CGAL::Delaunay_d C++: “EXC_BAD_ACCESS”

objective-c - Mac OSX 如何添加 plist 来捆绑和修改 plist

Java/Arduino - 从串口读取数据

Python + Arduino 与 Mac OS X

c++ - C++ 或 ANSI C 所用的周期数?

c - 在 tmp 文件夹中打开文件时使用信号量不起作用

macos - Mac OS X 中类似 Windows 的 Qt4 菜单栏