您没有详细说明微控制器的行为方式,但是从微控制器传输的所有内容都是对来自PC的命令的直接响应吗?如果这样做,似乎你可以使用某种主/从协议(这通常是最简单的解决方案)。如果双方都可以发起通信,则需要更通用的数据链路层协议。 HDLC 是一个经典的协议。尽管完整协议可能对您的需求有些过分,但您可以例如至少使用相同的帧格式。你可能也看看 PPP 看是否有一些有用的部分。
我唯一的建议是,如果您需要抗噪声,您可能需要使用全双工RS-422/485。您可以使用类似的IC 这个 在AVR侧,然后PC侧的RS-232-> RS-422转换器就像 485PTBR在这里 。如果您可以找到或制作屏蔽电缆(两对双绞屏蔽),那么您将获得更多保护。所有这一切对微型和PC都是不可见的 - 没有软件改变。
无论您做什么,都要确保使用全双工系统,并确保在IC上声明读/写使能线。
我会用 HDLC 。我过去好运。我想点一点才能串口使用 异步框架 并且忘记所有其他控件,因为它可能是矫枉过正的。
除了使用HDLC进行数据包的成帧。我格式化我的数据包如下。这是使用802.11传递选项的方式
U8 cmd; U8 len; u8 payload[len];
每个命令包的总大小为len +2
然后,您可以定义命令
#define TRIGGER_SENSOR 0x01 #define SENSOR_RESPONSE 0x02
另一个优点是您可以添加新命令,如果您正确设计解析器以忽略未定义的命令,那么您将具有一些向后兼容性。
所以将数据包放在一起看起来如下所示。
// total packet length minus flags len+4 U8 sflag; //0x7e start of packet end of packet flag from HDLC U8 cmd; //tells the other side what to do. U8 len; // payload length U8 payload[len]; // could be zero len U16 crc; U8 eflag; //end of frame flag
然后,系统将监视串行流的标志0x7e,当它在那里时,检查长度以查看它是pklen> = 4和pklen = len + 4并且crc是有效的。注意不要只依靠crc来获取小包,你会得到很多误报也检查长度。如果长度或crc不匹配,只需重置长度和crc,然后从解码新帧开始。如果匹配则将数据包复制到新缓冲区并将其传递给命令处理函数。收到标志时,始终重置长度和crc。
对于命令处理函数,请抓取cmd和len,然后使用开关来处理每种类型的命令。我还要求某些事件发送响应,因此系统的行为类似于事件驱动的远程过程调用。
因此,例如,传感器设备可以具有计时器或响应命令以获取读数。然后它会格式化数据包并将其发送到PC,PC将响应它收到的数据包。如果没有,则传感器设备可以在超时时重新发送。
此外,当您进行网络传输时,您应该将其设计为网络堆栈,如 OSI模型 如 Foredecker 积分不要忘了 物理层的东西 。我的HDLC帖子是 数据链路层 和 RPC和命令处理是应用程序层 。
我的建议是modbus。 它是一种高效且简单的标准协议,用于与具有传感器和参数的设备(例如PLC)进行通信。 你可以在那里获得规格 http://www.modbus.org 。它自1979年以来一直存在并且越来越受欢迎,您可以毫无困难地找到示例和库。
SLIP和UDP。认真。
所有PC和类似设备都能说出来。
有一本好书和例子 TCP精益
Jeremy Bentham偷偷摸摸地得到了一个PIC工作TCP / IP。 AVR和PIC一样好吗?
我建议使用UDP,它非常简单。
RS232协议很棘手。使用HDLC的建议是一个很好的建议,但它不是整个解决方案。您还需要决定其他事项:
我建议你使用8个数据位,没有硬件奇偶校验,1个停止位,并使用基于软件的流量控制。如果您的硬件支持,您应该使用自动波特率。如果没有,那么autobaud在软件中非常困难。