c - 终端输入串口命令,输出Arduino Tx

标签 c linux serialization serial-port avr-gcc

我是这个领域的新手

我正在使用 Arduino Mega2560 并将其与自动售货机的投币机连接。 投币机运行在称为 MDB(多点总线)的协议(protocol)上,该协议(protocol)是 9 位串行的。 我通常会使用 Arduino IDE,但它不适合 9 位串行。因此,我决定使用 c 和 ubuntu 12.04 进行编码。我遇到了一个 usart 设置函数,它可以将 bitbash 转换为 9 位模式。 我已经安装了 avr-gcc avr-libc avrdude。

投币机根据接收到的串行数据进行操作。即重置它需要从它的 Rx 中读取 100101010(这是一个随机的 9 位数字,我现在不确定真正的数字是多少)。 另一个例子是,如果它在 Rx 上收到 10101111,它会分发所需类型的硬币等。 还有各种其他命令,如 ack、poll 等。 所以我想做的是将适当的二进制数从 Arduino 的 Tx 发送到投币机的 Rx 并尝试与投币机通信。

这只是为了上下文,但我的主要问题更笼统(假设我们在 8 位模式下工作):

a) 如何在终端上输入一个 8 位二进制数(例如 10111010),并将该数字放在 arduno 的 Tx 线上。 b) 由于 mega2560 有 3 个 Tx/Rx 模块,我可以从一个模块 Tx 和 Rx 从另一个模块进行测试,这样我在终端上输入的 8 位二进制数也会出现在终端上。

注意:我希望数字以二进制表示的原因是因为我想看到每一位,这样对我来说更有意义

我正在尝试做类似于 Bouni 的 MateDealer 的事情(参见 github 存储库) 但他正在将 Arduino 作为奴隶实现,我想作为主人实现。 更多关于他的项目 here .

谢谢您!

最佳答案

A) 有两种解决方案:

  • 您通过串行线发送数字的二进制表示,例如“00001111”,然后在 µC 中使用函数 strtoul,该函数将一个 char 数组(在本例中为“00001111”)和base(此处为2)并返回相应的值(此处为0x0F,即16);
  • 您创建自己的终端,它将输入的二进制表示形式转换为十进制表示形式(此处,将“00001111”转换为“16”),发送到使用函数 atoi 获取相应值(此处为 16 或0x0F)

我认为前者会更容易,但会慢一点,而后者可以卸载微 Controller 。

关于c - 终端输入串口命令,输出Arduino Tx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22895225/

相关文章:

开罗到开罗-xlib : cairo_xlib_surface_create problems (C)

Django 从 [ErrorDetail(string ='Test Message' , code ='invalid' )] 中提取字符串

django - 如何在 Django rest 框架中检索外键字段?

c - 在一个从高地址向低地址增长的调用栈中,数据元素是从内存低地址保存到内存高地址还是相反?

c - 客户端绑定(bind)如何影响 tcp 连接?

c - 仅使用 For 循环反转字符串

c# - Linux 锁定/解锁事件处理

java - 简单的库 Xml 序列化,无需新的类实例

c - 什么时候应该使用 mmap 进行文件访问?

c - C 中的函数 "boulders"