首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于在嵌入式CPU和PC之间通信的协议

用于在嵌入式CPU和PC之间通信的协议
EN

Stack Overflow用户
提问于 2008-11-22 03:49:34
回答 6查看 2.9K关注 0票数 18

我正在构建一个小型设备,它有自己的CPU (AVR Mega8),应该可以连接到PC。假设已经完成了物理连接和字节的传递,那么在这些字节之上使用的最佳协议是什么?计算机需要能够在设备上设置特定的电压,并回读某些其他的电压。

目前,我正在考虑一种完全由主机驱动的同步协议:计算机发送请求,嵌入式CPU应答。还有其他想法吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-11-26 08:07:37

Modbus可能就是你要找的东西。它正是为您所遇到的问题类型而设计的。有很多代码/工具,遵守一个标准可能意味着以后很容易重用。它还支持人类可读ASCII,因此仍然很容易理解/测试。

请参阅适用于windows和嵌入式源代码的FreeModBus

票数 6
EN

Stack Overflow用户

发布于 2008-11-25 13:43:04

我的票是人类可读的。

但是如果你是二进制的,试着在开头放一个头字节来标记一个包的开始。我总是在串行协议不同步的情况下倒霉。标头字节允许嵌入式系统与PC重新同步。另外,在结尾处添加校验和。

票数 5
EN

Stack Overflow用户

发布于 2008-11-25 19:41:58

我已经用简单的二进制格式做过这样的事情

代码语言:javascript
复制
struct PacketHdr
{
  char syncByte1;
  char syncByte2;
  char packetType;
  char bytesToFollow;  //-or- totalPacketSize
};

struct VoltageSet
{ 
   struct PacketHdr;
   int16 channelId;
   int16 voltageLevel; 
   uint16 crc;
};

struct VoltageResponse
{
   struct PacketHdr;
   int16 data[N];  //Num channels are fixed
   uint16 crc;
}

同步字节在同步协议中没有异步协议那么关键,但它们仍然有帮助,特别是当嵌入式系统第一次加电时,并且您不知道它获得的第一个字节是否是消息的中间。

类型应该是告诉如何解压数据包的枚举。可以从类型推断出大小,但如果显式发送,则接收器可以处理未知类型而不会阻塞。你可以使用“总数据包大小”,或者“跟随的字节数”;后者可以使接收器的代码更整洁一些。

末尾的CRC增加了更多的保证,即您拥有有效的数据。有时我会在头部看到CRC,这使得声明结构更容易,但将它放在末尾可以避免在发送消息时对数据进行额外的传递。

在一个字节被丢弃的情况下,发送方和接收方都应该在接收到分组的第一个字节之后开始超时。PC端还需要超时来处理嵌入式系统未连接且完全没有响应的情况。

如果您确定两个平台都使用IEEE-754浮点型(PC的do)并且具有相同的字节顺序,那么您可以使用浮点型作为数据类型。否则,使用整数更安全,无论是原始A/D位,还是预置标度(即1位= .001V给出+/-32.267 V范围)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/310826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档