极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16016|回复: 7

【求助】自定义串口通讯协议

[复制链接]
发表于 2015-7-22 22:04:58 | 显示全部楼层 |阅读模式
本帖最后由 maxims 于 2015-7-23 08:10 编辑

数据生成:协议头+固定数据+和值校验
  1. void setup()
  2. {
  3.   Serial.begin(115200);
  4.   randomSeed(analogRead(0));
  5. }

  6. void loop()
  7. {
  8.     uint8_t sum = 0x80 + 0x8F + 0xEA + 0x16 + 0x50 + 0x08;
  9.     Serial.write(0x80);
  10.     Serial.write(0x8F);
  11.     Serial.write(0xEA);
  12.     Serial.write(0x16);
  13.     Serial.write(0x50);
  14.     Serial.write(0x08);
  15.     for(int i = 0; i < 20; i++)
  16.     {
  17.       //uint8_t randomShit = random(0,256);
  18.       uint8_t randomShit = 5;
  19.       sum += randomShit;
  20.       Serial.write(randomShit);
  21.     }
  22.     Serial.write(sum % 256);
  23.     delay(5000);
  24. }
复制代码


接收端解码:
  1. struct engineData {
  2.   float RPM;
  3.   float MAP;
  4.   float TPS;
  5.   float ECT;
  6.   float IAT;
  7.   float O2S;
  8.   float SPARK;
  9.   float FUELPW1;
  10.   float FUELPW2;
  11.   float UbAdc;
  12. } data;

  13. const uint8_t preamble[] = {0x80, 0x8F, 0xEA, 0x16, 0x50, 0x08};
  14. uint8_t buf[27];
  15. uint8_t commPointer = 0;

  16. int checkSum() {
  17.   for (int i = 0; i < 26; i++)
  18.   {
  19.     buf[27] += buf[i];
  20.   }
  21.   if (buf[27] == buf[26])
  22.   {
  23.     return 1;
  24.   }
  25.   else
  26.   {
  27.     return 0;
  28.   }
  29. }

  30. void produceData() {
  31.   data.RPM = (buf[6] * 256 + buf[7]) / 4;
  32.   data.MAP = (buf[8] * 256 + buf[9]) / 256;
  33.   data.TPS = (buf[10] * 256 + buf[11]) / 655.36;
  34.   data.ECT = (buf[12] * 256 + buf[13]) - 40;
  35.   data.IAT = (buf[14] * 256 + buf[15]) - 40;
  36.   data.O2S = (buf[16] * 256 + buf[17]) / 204.8;
  37.   data.SPARK = (buf[18] * 256 + buf[19]) / 2;
  38.   data.FUELPW1 = (buf[20] * 256 + buf[21]) / 1000;
  39.   data.FUELPW2 = (buf[22] * 256 + buf[23]) / 1000;
  40.   data.UbAdc = (buf[24] * 256 + buf[25]) / 160;
  41. }

  42. void printData() {
  43.   Serial.print("New Data\n");
  44.   Serial.print(data.RPM);
  45.   Serial.print("\n");
  46.   Serial.print(data.MAP);
  47.   Serial.print("\n");
  48.   Serial.print(data.TPS);
  49.   Serial.print("\n");
  50.   Serial.print(data.ECT);
  51.   Serial.print("\n");
  52.   Serial.print(data.IAT);
  53.   Serial.print("\n");
  54.   Serial.print(data.O2S);
  55.   Serial.print("\n");
  56.   Serial.print(data.SPARK);
  57.   Serial.print("\n");
  58.   Serial.print(data.FUELPW1);
  59.   Serial.print("\n");
  60.   Serial.print(data.FUELPW2);
  61.   Serial.print("\n");
  62.   Serial.print(data.UbAdc);
  63.   Serial.print("\n");
  64. }

  65. void setup()
  66. {
  67.   Serial.begin(115200);
  68.   Serial.println("System Int OK");
  69. }

  70. void loop()
  71. {
  72.   if (Serial.available() > 0)
  73.   {
  74.     uint8_t incomingByte = Serial.read();
  75.     if (commPointer < 6 && (preamble[commPointer] == incomingByte))
  76.     {
  77.       buf[commPointer] = incomingByte;
  78.       commPointer++;
  79.     }
  80.     else if ((commPointer > 5) && (commPointer < 27))
  81.     {
  82.       buf[commPointer] = incomingByte;
  83.       commPointer++;
  84.     }
  85.     else if (commPointer == 27 && checkSum())
  86.     {
  87.       buf[27]=00;
  88.       produceData();
  89.       printData();
  90.       commPointer = 0;
  91.     }
  92.     else
  93.       commPointer = 0;
  94.   }
  95. }
复制代码


卡在“int checkSum()”函数里边了。。。

代码是抄来的,自己改了一部分

已经修改为调试通过的代码了
回复

使用道具 举报

 楼主| 发表于 2015-7-22 22:09:04 | 显示全部楼层
本帖最后由 maxims 于 2015-7-22 22:23 编辑

int checkSum()里边,我输出了sum和buf[26]到串口,都是一样的hex值。但是在下边的if判断里边,死活不能成立

好吧,现在已经知道是int类型和char比较不成立

怎么改呢?
回复 支持 反对

使用道具 举报

发表于 2015-7-22 23:38:52 | 显示全部楼层
uint8_t buf[27]
int sum=0
需要加强制转换符
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-23 08:09:21 | 显示全部楼层
Vincent2014 发表于 2015-7-22 23:38
uint8_t buf[27]
int sum=0
需要加强制转换符

不好意思,昨晚累了,没有来得及更新。

我已经解决问题了。

我修改了一楼的代码
回复 支持 反对

使用道具 举报

发表于 2015-7-23 09:29:47 | 显示全部楼层
maxims 发表于 2015-7-23 08:09
不好意思,昨晚累了,没有来得及更新。

我已经解决问题了。

不要直接修改原來的代碼, 把一個沒問題的程式放在問題之下, 會浪費大家時間.  

我就是看了幾遍也看不出大概的問題, 下次不敢再看你的帖了.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-23 10:31:35 | 显示全部楼层
Super169 发表于 2015-7-23 09:29
不要直接修改原來的代碼, 把一個沒問題的程式放在問題之下, 會浪費大家時間.  

我就是看了幾遍也看不出 ...

{:3_43:}
哎哟,一楼代码我已经调通了,然后更改为最新通过的代码了。
回复 支持 反对

使用道具 举报

发表于 2016-10-24 14:21:51 | 显示全部楼层
楼主 这贴的代码校验和那函数里 buf 改成 buf[[i]

我试过这代码了,头一次接收不回 ,得发送第二遍才有返回的打印值。
回复 支持 反对

使用道具 举报

发表于 2016-10-24 15:59:48 | 显示全部楼层
多加了个数据位 就是 一发一回了!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 08:34 , Processed in 0.042774 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表