在为不同的项目编写几个不同的自定义串行协议之后,我开始对重新发明轮子感到沮丧。 为了继续为每个项目开发定制的解决scheme,我一直在寻找更通用的解决scheme。 我想知道是否有人知道满足以下要求的串行协议(或更好的实现): 支持多种设备。 我们希望能够支持一个RS485总线。 保证交付。 某种确认机制,以及一些简单的错误检测(CRC16可能是好的)。 不是主/从。 理想情况下,从机可以asynchronous发送数据。 这主要是出于美学的原因,投票每个奴隶的概念不适合我。 OS独立性。 理想情况下,它不会依赖于抢先式的多任务处理环境。 我愿意承认这一点,如果我能得到其他的东西。 ANSI C我们需要能够编译几个不同的体系结构。 速度不是太大的问题,我们愿意放弃一些速度,以满足其他一些需求。 但是,我们希望尽量减less所需资源的数量。 我即将开始实施滑动窗口协议与piggybacked ACK并没有select性的重复,但认为也许有人可以救我这个麻烦。 有谁知道现有的项目,我可以利用? 或者更好的策略? UPDATE 我认真考虑过一个TCP / IP的实现,但真的希望有更轻量级的东西。 TCP / IP的许多function对于我正在尝试做的事情来说都是过度的。 我愿意接受(勉强),也许我想要的function不包括在较轻的协议中。 更新2 感谢CAN上的提示。 我曾经看过,未来可能会用到它。 我真的很喜欢图书馆处理确认,缓冲,重试等。 我想我更多的是寻找一个networking/传输层,而不是数据链/物理层。 更新3 所以这听起来像这个领域的艺术状态是: 裁减的TCP / IP堆栈。 可能从诸如lwIP或uIP之类的东西开始。 一个基于CAN的实现,它可能很大程度上依赖于CAN总线,所以它在其他物理层上将不会有用。 CAN节日可以帮助你。 一个HDLC或SDLC实现(就像这个一样)。 这可能是我们要采取的路线。 如果您遇到此问题,请随时发布更多的答案。
如何在编程Arduino时使用c++11 ? 我会很好地使用Arduino IDE或其他环境。 我对核心语言改进最感兴趣,而不是需要标准库更改的东西。
我正在Ubuntu下编译一个自定义的内核,我遇到了内核似乎不知道在哪里寻找固件的问题。 在Ubuntu 8.04下,固件与驱动程序模块的内核版本相同。 例如,内核2.6.24-24-generic将其内核模块存储在: /lib/modules/2.6.24-24-generic 和它的固件在: /lib/firmware/2.6.24-24-generic 当我根据“ 替代构build方法:老式的Debian方式 ”编译2.6.24-24-generic Ubuntu内核时,我得到相应的模块目录,除了需要固件的那些设备(除了我的英特尔无线网卡(ipw2200模块)。 内核日志显示例如当ipw2200尝试加载固件时,控制固件加载的内核子系统无法find它: ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2 errno-base.h将其定义为: #define ENOENT 2 /* No such file or directory */ (返回ENOENT的函数在它前面放一个减号。) 我试图在/ lib / firmware中创build一个符号链接,其中我的内核名称指向2.6.24-24的通用目录,但是这导致了相同的错误。 这个固件是非英特尔的,由英特尔提供,并由Ubuntu打包。 我不相信它有一个特定的内核版本。 cmp显示各个目录中的版本是相同的。 那么内核如何知道在哪里寻找固件? 更新 我发现这个解决scheme是针对我遇到的确切问题,但是由于Ubuntu已经取消/etc/hotplug.d而不再工作,并且不再将其固件存储在/usr/lib/hotplug/firmware 。 UPDATE2 还有一些研究发现了更多的答案。 直到udev 92版本,程序firmware_helper是固件加载的方式。 从udev 93开始,这个程序被replace为一个名为firmware.sh的脚本,据我所知可以提供相同的function。 这两个硬编码到/lib/firmware的固件path。 […]