极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: 乐乐2365

大侠看看我的程序哪里不对

[复制链接]
发表于 2015-8-11 11:10:00 | 显示全部楼层
初学者学习
回复 支持 反对

使用道具 举报

发表于 2015-8-11 18:31:48 | 显示全部楼层
本帖最后由 maxims 于 2015-8-11 18:43 编辑
乐乐2365 发表于 2015-8-9 23:30
把正确的收到hex保存起来,如果错误,你必须丢弃。这个程序我不会,大侠指点


我又来了。。。

既然我一直在回复你的帖子,你为何不能去搜索一下我的帖子呢?或许我在某个帖子里边有提问过,有解决方案?
  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. }
复制代码
上边的代码,是我在网上抄来的。调试通过之后,学习了它的工作方式,然后写了自己的另外的代码(自己写的代码不能给你)

  1. if (Serial.available() > 0)//如果串口事件发生
  2.   {
  3.     uint8_t incomingByte = Serial.read();//读取一个字节到变量
  4.     if (commPointer < 6 && (preamble[commPointer] == incomingByte))//判断:字节计数小于6并且收到的字节和预置字节相同位置内容一致
  5.     {//如果一致,执行以下代码
  6.       buf[commPointer] = incomingByte;//保存收到的当前字节到自定义缓冲区
  7.       commPointer++;//字节计数增加
  8.     }
  9.    //如果字节计数不小于5或者收到的内容不等于预置内容就执行下边
  10.     else if ((commPointer > 5) && (commPointer < 27))//判断:字节计数大于5并且小于27(27是自定义缓冲区大小)
  11.     {
  12.       buf[commPointer] = incomingByte;//保存收到的字节到缓冲区
  13.       commPointer++;//字节计数增加
  14.     }
  15.    //如果字节计数已经=27,则证明已经接受完一条协议。
  16.     else if (commPointer == 27 && checkSum())//判断:如果字节计数=27并且计算校验和正确
  17.     {
  18.       buf[27]=00;//自定义缓冲区第28位置零,准备给下一次数据计算校验码临时存放
  19.       produceData();//分割数据包
  20.       printData();//输出数据
  21.       commPointer = 0;//重置字节计数值
  22.     }
  23.     else//如果以上主要判断条件均不正确,直接重置字节计数值
  24.       commPointer = 0;
  25.   }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-8-11 18:44:45 | 显示全部楼层
你要根据各个if的条件,慢慢理顺代码执行的顺序。你才能理解我给你的代码的编程思想。你才能把我的这个思路用到你自己的代码里边去。
回复 支持 反对

使用道具 举报

发表于 2015-9-7 21:49:40 | 显示全部楼层
liuxue4503 发表于 2015-8-10 10:22
我现在刚好也在弄一个串口通信的小东西。
收到并保存这个,一种方法是:
在外面设一个标志位,来确定是 ...

为什么添加这个程序上边的对比程序不管用了


else
  {
if (buttonState == LOW)
  {     
   delay(10);
    if (buttonState == LOW)//机械式延时去抖
    j++;//按键后变量加1;
    while(!digitalRead(addKey));//等待松开按键结束,按键弹起算一次有效值
    }


液晶屏串口程序
int incomingByte =  0;
int ledpin = 8; //定义数字接口
unsigned char HEXFD1[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x01};
unsigned char HEXFD2[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x02};
unsigned char HEXFD3[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x03};
unsigned char HEXFD4[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x04};
unsigned char HEXFD5[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x05};
unsigned char HEXFD6[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x06};
unsigned char HEXFD7[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x07};
unsigned char HEXFD8[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x08};
unsigned char HEXFD9[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x09};
unsigned char HEXFD10[9] = {0xA5, 0x5A, 0x06, 0x83, 0x00,0x00, 0x01,0x00, 0x0A};
int j=0;//初使化加数变量
int addKey =4;//定义按键为第4引脚
int buttonState = 0; //初使化按键暂存值,为了和addKey类型保持一致用int;
unsigned char showNumber[10][8] ={
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x01},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x02},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x03},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x04},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x05},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x06},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x07},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x08},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x09},
{0xA5,0x5A,0x05,0x82,0x00,0x10,0x00,0x0A}};
int x = 0;
int CheckSumX1 = 0;
int CheckSumX2 = 0;
int CheckSumX3 = 0;
int CheckSumX4 = 0;
int CheckSumX5 = 0;
int CheckSumX6 = 0;
int CheckSumX7 = 0;
int CheckSumX8 = 0;
int CheckSumX9 = 0;
int CheckSumX10 = 0;
void setup()
{
  Serial.begin(9600);
  pinMode(ledpin, OUTPUT);
  pinMode(addKey,INPUT);
}

void loop()
{
  // Serial.write(hexdata,7);
   buttonState = digitalRead(addKey);//
  if (Serial.available() > 0)
  {
    incomingByte = Serial.read();
    Serial.print(incomingByte, HEX);

    if (HEXFD1[x] == incomingByte) {
      CheckSumX1++;
    }
    if (HEXFD2[x] == incomingByte) {
      CheckSumX2++;
    }
     if (HEXFD3[x] == incomingByte) {
      CheckSumX3++;
    }
    if (HEXFD4[x] == incomingByte) {
      CheckSumX4++;
    }
     if (HEXFD5[x] == incomingByte) {
      CheckSumX5++;
    }
    if (HEXFD6[x] == incomingByte) {
      CheckSumX6++;
    }
     if (HEXFD7[x] == incomingByte) {
      CheckSumX7++;
    }
    if (HEXFD8[x] == incomingByte) {
      CheckSumX8++;
    }
     if (HEXFD9[x] == incomingByte) {
      CheckSumX9++;
    }
    if (HEXFD10[x] == incomingByte) {
      CheckSumX10++;
    }
   
   
   
    x++;
    if (x == 9) {
      if (CheckSumX5 == 9) {
        digitalWrite(ledpin, HIGH); //点亮数字13 口LED。
        delay(5000);
      }
      if (CheckSumX7 == 9) {
        digitalWrite(ledpin, LOW); //熄灭数字13 口LED
        delay(5000);
      }
      x = 0;
      CheckSumX5 = 0;
      CheckSumX7 = 0;
    }
  }
  else
  {
if (buttonState == LOW)
  {     
   delay(10);
    if (buttonState == LOW)//机械式延时去抖
    j++;//按键后变量加1;
    while(!digitalRead(addKey));//等待松开按键结束,按键弹起算一次有效值
    }
      switch(j)
{
case 1:
Serial.write(&showNumber[0][0],8);
break;
case 2:
Serial.write(&showNumber[1][0],8);
break;
case 3:
Serial.write(&showNumber[2][0],8);
break;
case 4:
Serial.write(&showNumber[3][0],8);
break;
case 5:
Serial.write(&showNumber[4][0],8);
break;
case 6:
Serial.write(&showNumber[5][0],8);
break;
case 7:
Serial.write(&showNumber[6][0],8);
break;
case 8:
Serial.write(&showNumber[7][0],8);
break;
case 9:
Serial.write(&showNumber[8][0],8);
break;
case 10:
Serial.write(&showNumber[9][0],8);
j=0;
break;
default:
break;

}
  }
}
   
回复 支持 反对

使用道具 举报

发表于 2015-9-8 08:44:36 | 显示全部楼层
你还是去理解一下上面maxims发的那一篇吧,那个思路是比较好用的了,我后来也搞一个类似的串口通讯的小项目,也是这样操作的,开始时间在你来这里问问题之后了。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 01:44 , Processed in 0.070353 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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