极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20755|回复: 19

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

[复制链接]
发表于 2015-8-8 23:23:42 | 显示全部楼层 |阅读模式
本帖最后由 乐乐2365 于 2015-8-8 23:31 编辑

int incomingByte =  0;
int ledpin = 8; //定义数字接口13
unsigned char hexdata[7] = {0xA5,0x5A,0x04,0x83,0x10,0x00,0x01};
unsigned char HEXHEX[9] = {0xA5,0x5A, 0x08, 0x83, 0x10, 0x01, 0x01,0x4E,0x2B};
unsigned char HEXFDS[9] = {0xA5,0x5A, 0x08, 0x83, 0x10, 0x01,0x00,0x8F,0xEB};
int x=0;
int c=0;
void setup()
{
  Serial.begin(9600);
  pinMode(ledpin, OUTPUT);
}

void loop()
{
  // Serial.write(hexdata,7);
   // delay(500);
  if (Serial.available() > 0)
  {
    incomingByte = Serial.read();
    Serial.print(incomingByte, HEX);
    if (x < 9 && (HEXHEX[x] == incomingByte))
    {
      digitalWrite(ledpin, HIGH); //点亮数字13 口LED。
      delay(500);
    }
    else if(c < 9 && (HEXFDS[c] == incomingByte))
    {
      digitalWrite(ledpin, LOW); //熄灭数字13 口LED
       delay(500);  
    }
     }
  }
现在问题是  LED不受控制,直接不亮。没反应,屏有2个按钮一个返回0xA5,0x5A, 0x08, 0x83, 0x10, 0x01, 0x01,0x4E,0x2B    一个返回0xA5,0x5A, 0x08, 0x83, 0x10, 0x01,0x00,0x8F,0xEB               arduino板比较返回值是不是这两值是LED亮,不是LED灭,这个原理。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-8-8 23:53:44 | 显示全部楼层
又是我,先简单看了一下子,你的那个int x=0,int c=0;后面x c就不用变化??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-9 07:07:20 | 显示全部楼层
那怎么能读出数据那
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-9 08:00:14 | 显示全部楼层
int   x, c
回复 支持 反对

使用道具 举报

发表于 2015-8-9 09:50:10 | 显示全部楼层
按你之前发过的帖子来看,你的程序跟你所要实现的功能之间还是有一定差距的。要不就是你没敢把所有的代码都放上来,前两回好多注释,还乱。这回关键的地方没有注释,最关键的给了3行注释,都是有关LEDpin的,但是为什么定义的时候写的8,仅有的两行注释都指向13呢?我看着图上所接的LED,好像也是13脚吧。这样的话,程序功能都实现了,LED也还是不会有反应的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-9 12:19:04 | 显示全部楼层
13脚一闪一闪的我移到8脚了。8脚就不行了。程序就这些我也是个菜鸟。用简单程序先叫屏和单片机通讯正常
回复 支持 反对

使用道具 举报

发表于 2015-8-9 15:34:19 | 显示全部楼层
乐乐2365 发表于 2015-8-9 12:19
13脚一闪一闪的我移到8脚了。8脚就不行了。程序就这些我也是个菜鸟。用简单程序先叫屏和单片机通讯正常

给个思路,前面定义的一个char数组hexdata。单片机串口接收到的数据就先存到另外一个数组里,存放完成后,再通过循环对比两个数组,然后再输出结果。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-9 21:44:55 | 显示全部楼层
给个小实例。小弟菜鸟
回复 支持 反对

使用道具 举报

发表于 2015-8-9 23:03:54 | 显示全部楼层
还是我
  1.     if (x < 9 && (HEXHEX[x] == incomingByte))
  2.     {
  3.       digitalWrite(ledpin, HIGH); //点亮数字13 口LED。
  4.       delay(500);
  5.     }
复制代码
你这个代码写错了哒。
第一,你的X在循环读取过程中,没有变化,永远可能都是0。
第二,你的反转led的代码,不应该写到这里边来。

在我上边引用的代码里边,你要做的是把正确的收到hex保存起来,如果错误,你必须丢弃。
在这个if外从新判断你收到的是什么内容,是开还是关。

流程应该是:
先判断你收到的协议头是否正确(也就是你的hexhex[]和接受的相比)。如果正确再去判断你所收到的命令是什么,根据命令执行相应的动作。

比如,我们协商口令=12345,上边引用的就是,我喊1,你比较第一声是否为1,依次到5。如果都正确,那么再做其他的。
你现在就是,喊1,你判断正确了,就亮了led,喊2,还是正确,led本来就亮着你又亮了一次……
当然,你的if根本就不成立了。因为x没有变化。所以,你的led应该是闪了一下就灭了,一直灭着。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-9 23:22:54 | 显示全部楼层
本帖最后由 乐乐2365 于 2015-8-9 23:28 编辑

int incomingByte ;
int ledpin = 8; //定义数字接口13
//unsigned char hexdata[7] = {0xA5,0x5A,0x04,0x83,0x10,0x00,0x01};
unsigned char HEXHEX[11] = {0xA5,0x5A, 0x08, 0x83, 0x10, 0x00,0x01,0x00, 0x01,0x4E,0x2B};
unsigned char HEXFDS[11] = {0xA5,0x5A, 0x08, 0x83, 0x10, 0x00, 0x01,0x00,0x00,0x8F,0xEB};
unsigned char  hexdata[]={};
//int x=0;
// int c=0;
void setup()
{
  Serial.begin(9600);
  pinMode(ledpin, OUTPUT);
}

void loop()
{
int x, c ,j;
  
  if (Serial.available() > 0)
{
    incomingByte = Serial.read();
    Serial.println(HEXFDS[11], HEX);
    if (x < 11 && (hexdata[x] == incomingByte))//把数组移到hexdata里
    x+1;
    delay(10);
  {
   
      if (c < 11 && (HEXFDS[c] ==hexdata[x]))//2数组比较
      c+1;
      delay(10);
      {
         Serial.print(hexdata[x], HEX);
        if(  j+1,j==11)//判断是否有9个数组..是led亮
        {
      digitalWrite(ledpin, HIGH);
      delay(500);
      j=0;
      x=0;
      c=0;
      
      
        }
      }
      }
   
   if (x < 11 && (hexdata[x] == incomingByte))
     x+1;
   delay(10);
  {
      if (c < 11 && (HEXHEX[c] ==hexdata[x]))
      c+1;
      delay(10);
      {
        if(  j+1,j==11)
        {
      digitalWrite(ledpin, HIGH);
      delay(500);
      j=0;
      x=0;
      c=0;
        }

     
  }}}}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-9 23:30:47 | 显示全部楼层
把正确的收到hex保存起来,如果错误,你必须丢弃。这个程序我不会,大侠指点
回复 支持 反对

使用道具 举报

发表于 2015-8-9 23:37:32 | 显示全部楼层
不知道这样行不行
int incomingByte =  0;
int ledpin = 8; //定义数字接口13
unsigned char hexdata[7] = {0xA5, 0x5A, 0x04, 0x83, 0x10, 0x00, 0x01};
unsigned char HEXHEX[9] = {0xA5, 0x5A, 0x08, 0x83, 0x10, 0x01, 0x01, 0x4E, 0x2B};
unsigned char HEXFDS[9] = {0xA5, 0x5A, 0x08, 0x83, 0x10, 0x01, 0x00, 0x8F, 0xEB};
int x = 0;
int CheckSumX = 0;
int CheckSumC = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(ledpin, OUTPUT);
}

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

    if (HEXHEX[x] == incomingByte) {
      CheckSumX++;
    }
    if (HEXFDS[x] == incomingByte) {
      CheckSumC++;
    }
    x++;
    if (x == 9) {
      if (CheckSumX == 9) {
        digitalWrite(ledpin, HIGH); //点亮数字13 口LED。
        delay(500);
      }
      if (CheckSumC == 9) {
        digitalWrite(ledpin, LOW); //熄灭数字13 口LED
        delay(500);
      }
      x = 0;
      CheckSumX = 0;
      CheckSumC = 0;
    }
  }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-9 23:39:02 | 显示全部楼层
把正确的收到hex保存起来,如果错误,你必须丢弃的程序不会写。大侠指点。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-9 23:44:16 | 显示全部楼层
lkc8210      程序可以控制。谢谢
回复 支持 反对

使用道具 举报

发表于 2015-8-10 10:22:52 | 显示全部楼层
乐乐2365 发表于 2015-8-9 23:39
把正确的收到hex保存起来,如果错误,你必须丢弃的程序不会写。大侠指点。

我现在刚好也在弄一个串口通信的小东西。
收到并保存这个,一种方法是:
在外面设一个标志位,来确定是收到的数据是否需要保存。
然后,收到一位检测一位,根据收到的内容是否为包头,以及前面的标志位,然后来处理。最后收到包尾了,再进行两个目标String或者char[]的比较。程序自己多写写多调调。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 04:26 , Processed in 0.038059 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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