真正的9位串行端口数据?


10

我有一个在Atmel UTC上运行的现有的,半成品的自动售货机项目,我想移植到Pi。

为了与硬币接收器等外围设备进行通讯,它必须支持 Multi-Drop总线,该总线具有9数据位的串行端口接口(加上启动,停止和奇偶校验位)。

我通过Atmel板了解了很难找到的方法,该方法是在网上找到建议的,这依赖于将奇偶校验位用作第9个数据位,这会导致不良的时序问题-难以检测和纠正(因此,请不要让我参考这个,或类似的东西。谢谢)。

有人知道我是否/在哪里可以买到真正的9位Pi串行端口(如果可以在Pi 0上工作,可以得到加分)。

可能有帽子吗?还是可以轻松地(我有一个既不熟悉又不熟悉硬件的人)使用另一块板来处理9个数据位UART并通过Pi进行控制?


1
GPIO上有一个串行接口-在Raspbian等映像上,已将其设置为提供来自Pi的输出,因此您必须先禁用该接口,但仍然会遇到位不在标准范围内的问题。在论坛上的这篇文章也可能会有所帮助。
2015年

1
您可以向项目添加硬件吗?带有UART的屏蔽罩并不难制造,并且可以为您提供所需的东西,尽管它可能消耗的I / O超过其应有的价值。一个真正低端的PIC CPU可能会被快速编程为在8位和9位串行之间转换,而不会花费太多或对您造成过多的工作。
迈克尔·科恩

你知道我在哪里可以买到吗?
Mawg说

Answers:


7

我的Pigpio库支持读取和写入9位串行数据。它使用位冲击,因此您可以使用任何可用的GPIO。

如果我没记错的话,任何19.2 kbps或更慢的速度都相当稳定。

您需要每秒几位?

读(CPython)比写(CPython)容易。


1
您确定100 *吗?当我刚开始进行开发时,我被警告不要出现此类“骇客”,并告知会出现计时问题。你知道有人用自动售货机试过吗?en.wikipedia.org/wiki/Multidrop_buscoin-acceptor.com.cn/Upload/EditorFiles/technicalfile/...(对不起,我不能给一个sectoin号码作为我是一个公司防火墙后面)
Mawg说起用莫妮卡

3
我唯一的经验是在Pi和带有USB串行加密狗的笔记本电脑之间使用该库。我所做的测试记录在raspberrypi.stackexchange.com/questions/27488/…中。我的软件仅使用RX / TX和地面,因此,如果您对其他串行信号进行某些操作,可能会遇到问题。
2015年

听起来不错。:让我检查一下规格并与您联系
Mawg说恢复Monica 2015年

2
@Mawg:您已经接受了。这是否意味着建议的解决方案可靠地工作?
Thomas Weller

3

我被分配了一个项目,用于运行使用MDB协议进行付款的小吃自动售货机,并且我已经使用Pi Zero(橙色)完成了该项目。

我尝试了9位硬件串行和软件串行库,并且在Pi Zero上出现了时序问题。MDB的9位串行通信变得很痛苦。MDB协议表示外围设备应具有%5的串行通信时序公差,但是不同的外围设备供应商具有不同的公差,不符合MDB协议。当您认为已完成串行通信但尝试使用其他供应商的支付外设时,它根本不起作用。因此,不要依赖MDB协议数据表。我讨厌为越野车供应商实现MDB控制器。另外,某些外设在内部引导过程中会从uart引脚上消耗过多的电流,并可能损坏串行通信层。因此,您最好使用抽象。光耦合器很好,但我仍然不愿意 •建议使用Pi Zero处理MDB串行通信。更好的方法是通过AVR使用中间层方法。

我不是使用Pi Zero上的Uart进行MDB通信,而是使用Atmega328 AVR进行MDB处理,轮询等。Atmega328使用软件串行库控制MDB外围设备,并将人类可读的数据发送到硬件串行上的Pi Zero。所有电子方案,源和Pi Zero Armbian图像,用于自动售货操作的Python代码都可在此处获得:

http://eliverse.com/content/vendiverse/

您可以查看Wiki页面以获取有关控制电机,产品交付传感器,冷却器和字符LCD显示屏的更多详细信息。这是一个完整的自动售货机控制器项目,正在被几个自动售货机生产商使用。


这是一个绝妙的答案,尤其是它是第一答案。我以前曾经在带有真正9位UART的Atmel板上取得成功,并希望通过使用Raspberry Pi节省资金,但是您的解决方案是如此全面,以至于我不使用它都是傻瓜。las,我是只有软件的人,因此对于原型,我强烈希望使用无需焊接的解决方案。您能推荐一个COTS板吗?
Mawg说恢复Monica 17'Oct

网站的此页面显示“如果您已完成制作Vendiverse VMC板的步骤,或者您已获得Vendiverse VMC板”。我可以向您购买一个吗?需要多少费用?另外,如果您推荐任何特定的MDB外设,是否可以将其添加到您的站点?谢谢
毛花说恢复莫妮卡的时间

我的电子邮件似乎陷入了垃圾邮件。你能和我联系吗?您有我的电子邮件地址,但我仍在不来梅
Mawg说,恢复莫妮卡(Monica)

现在看来页面已死了,该项目被放弃了:-(
Mawg说要恢复Monica


1

根据定义,所有串行数据均为1位。它是由接口读取写入数据如何同意他们如何解释位和有意义的数据。
如果要9位数据,一个奇偶校验位,一个停止位和一个起始位。然后由您决定将数据转换为该格式,并解释以该格式读取的数据。另一个答案中提到的Pigpio模块将为您提供所需的硬件接口,或者您可以编写自己的接口。如果您使用python进行开发,建议您将Scott Griffiths的bitString.py模块看做一个库,可以很轻松地操作基于位的数据。


5
传输串行数据的问题在于时序。数据不是自计时的,唯一保证的电平转换位于停止/启动位。两端必须保持紧密,不间断的时序,才能确定位的位置。这就是为什么通常使用专用硬件来发送和接收数据的原因。时机很少。
2015年

1

我绝对喜欢硬件UART,而不是像Pigpio那样的软件实现。

您可以将奇偶校验位用于9位通信。有一个小问题:当前内核不支持CMSPAR(空格/标记奇偶校验)。
但是即使使用当前内核,您也可以切换奇偶校验以获得所需的第9位值,例如:

unsigned char check_parity(unsigned char v)
{
    v ^= v >> 4;
    v &= 0xf;
    return (0x6996 >> ((v ^ (v >> 4)) & 0xf)) & 1;
}

/* send 9 bits - 8 bits of byte + 1 bit of parity */
send_byte_with_parity(unsigned char byte, unsigned char parity)
{
    if (check_parity(byte) == parity) {
        options.c_cflag &= ~PARODD;
    } else {
        options.c_cflag |= PARODD;
    }
    tcsetattr(fd, 0, &options);
    write(fd, &byte, 1);
}


更好的方法IMHO是使用小的内核补丁来支持CMSPAR:
http ://marc.info/?l=linux-serial&m=145706834101241&w=2
它添加了标记/空格奇偶校验支持,从而使代码更简单。

PS I使用这种方法通过串行实现了MDB。它可以完美地在Pi上运行。
PPS补丁已获得批准,并且CMSPAR将以4.6内核开始即用。


没有补丁或至少没有链接,没有更完整的细节,这不是答案,也不是很有帮助的评论-除非它说在理论上是可能的。
史蒂夫·罗比拉德

它仍然留下了比答案更多的问题:我如何实现MDB,如何应用内核补丁,这将在所有Pi上还是仅在其中一些上运行?这可能还会打破什么?如果需要,我该如何撤消呢?这个补丁安全吗?记住,您知道这一点是因为您没有实现OP。
史蒂夫·罗比拉德

1
我已取消删除您的答案,因为您承认您的答案可能会更好。希望您能借此机会改进它。
史蒂夫·罗比拉德

我还需要添加什么?MDB实施?我没有得到雇主开放源代码的许可。
edo1年

请参阅我之前的评论,并请记住最终用户并不知道您所做的一切。
史蒂夫·罗比拉德


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.