我需要两个设备(PC和微控制器)之间的简单通信协议.PC必须向微软发送一些命令和参数.微必须传输一个字节数组(来自传感器的数据).
数据必须受到噪声保护(除了奇偶校验,我认为我还需要一些其他的数据校正方法).
有没有标准的解决方案呢?(我只需要一个想法,而不是完整的解决方案).
PS任何建议表示赞赏.PPS对不起任何语法错误,希望你理解.
编辑1.我还没有决定它是主/从协议还是双方都可以发起通信.PC必须知道微工作何时完成工作并且可以发送数据.如果数据准备就绪,它可以连续轮询微观,或者当作业完成时微观可以发送数据.我不知道哪个更好更简单.
编辑2. 硬件和物理层协议.由于PC中使用RS-232 C串行标准,我将使用异步通信.我将只使用RxD,TxD和GND信号.我无法使用额外的电线,因为微控制器AFAIK不支持它们.顺便说一下,我正在使用AVR ATmega128芯片.
所以我将使用固定波特率,8位数据,2个停止位而不进行奇偶校验(或使用?).
我正在构建一个带有自己的CPU(AVR Mega8)的小型设备,它应该连接到PC.假设已完成物理连接和字节传递,那么在这些字节之上使用的最佳协议是什么?计算机需要能够在设备上设置某些电压,并回读某些其他电压.
目前,我正在考虑一个完全由主机驱动的同步协议:计算机发送请求,嵌入式CPU应答.还有其他想法吗?
我试图通过SPI在一侧的微控制器和另一侧的多核TI芯片上的ARM处理器之间设计有效的通信协议.
所需协议的要求:
1 - 具有排队支持的多会话,因为我有多个发送/接收线程,因此它将是多个使用此通信协议的应用程序,我需要协议来处理这些请求的排队(如果传输我会保持缓冲区是队列,但我只需要协议来管理队列的调度).
2 - 通过SPI作为底层协议.
3 - 简单的错误检查.
在这个线程:" 简单的串行点对点通信协议 ",PPP是一个推荐的选项,但我看到PPP只做部分工作.
我还发现轻量级IP(LwIP)项目采用PPP over serial(我假设我可以通过SPI使用它),所以我想到了利用任何上层协议(如TCP/UDP)来完成其余工作的可能性.所需的工作.幸运的是,我发现TI包括LwIP作为其起始软件包中的以太网SW的一部分,我认为这至少可以在TI芯片方面轻松移植.
所以,我的问题是:
1 - 使用LwIP进行此通信方案是否有效?这会不会引起很多开销,因为IP头不是点对点(在芯片级别)通信所必需的并且会消耗吞吐量?
2 - 驻留在LwIP中的TCP或任何类似协议是否会处理传输请求的排队,例如,如果我在通信信道忙于发送/接收另一个线程的另一个套接字(会话)的请求时通过套接字请求传输,这将是由协议栈管理?如果是这样,哪个协议层管理它?
3 - 它们是否比LwIP更有效的协议栈,满足上述要求?
更新1:需要考虑的更多要点
1 - SPI是唯一可用的选项,我将它与可用的GPIO一起使用,以便在从机有数据要发送时向主机指示.
2 - 当前实现的(非标准)协议使用带有SPI的DMA,以及具有固定消息片段长度的消息格式"STX_MsgID_length_payload_ETX",但是当前方案的主要缺点是主机等待对消息的响应(不是片段)在发送另一个之前,这会消耗吞吐量并且不利用SPI的全双工特性.
3-这方面的一个改进是使用一种邮箱来接收片段,因此较长的消息可以被更高优先级的消息中断,这样单个消息的片段可以非顺序到达,但问题是这个设计引导使事情变得复杂,尤其是我没有太多可用资源用于许多缓冲区以在控制器(主)端使用邮箱方法.所以我认为这就像我通过为简单的点对点链接设计协议栈而重新发明轮子,这可能效率不高.
4- SPI上面通常可以使用哪种更高级别的协议来建立多个会话并解决消息的排队/调度问题?
更新2:另一个有用的线程" 嵌入式设备的良好串行通信协议/堆栈? "
更新3:我看了一下Modbus协议,它似乎指定了应用层然后直接用于串行线路通信的数据链路层,这听起来跳过面向网络协议层的不必要开销.
你认为这对于预期目的来说是比LwIP更好的选择吗?另外,有一个广泛使用的开源实现,如LwIP,但对于Modbus?