大侠看看我的程序哪里不对
本帖最后由 乐乐2365 于 2015-8-8 23:31 编辑int incomingByte =0;
int ledpin = 8; //定义数字接口13
unsigned char hexdata = {0xA5,0x5A,0x04,0x83,0x10,0x00,0x01};
unsigned char HEXHEX = {0xA5,0x5A, 0x08, 0x83, 0x10, 0x01, 0x01,0x4E,0x2B};
unsigned char HEXFDS = {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 == incomingByte))
{
digitalWrite(ledpin, HIGH); //点亮数字13 口LED。
delay(500);
}
else if(c < 9 && (HEXFDS == 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灭,这个原理。 又是我,先简单看了一下子,你的那个int x=0,int c=0;后面x c就不用变化?? 那怎么能读出数据那 int x, c
按你之前发过的帖子来看,你的程序跟你所要实现的功能之间还是有一定差距的。要不就是你没敢把所有的代码都放上来,前两回好多注释,还乱。这回关键的地方没有注释,最关键的给了3行注释,都是有关LEDpin的,但是为什么定义的时候写的8,仅有的两行注释都指向13呢?我看着图上所接的LED,好像也是13脚吧。这样的话,程序功能都实现了,LED也还是不会有反应的。 13脚一闪一闪的我移到8脚了。8脚就不行了。程序就这些我也是个菜鸟。用简单程序先叫屏和单片机通讯正常 乐乐2365 发表于 2015-8-9 12:19 static/image/common/back.gif
13脚一闪一闪的我移到8脚了。8脚就不行了。程序就这些我也是个菜鸟。用简单程序先叫屏和单片机通讯正常
给个思路,前面定义的一个char数组hexdata。单片机串口接收到的数据就先存到另外一个数组里,存放完成后,再通过循环对比两个数组,然后再输出结果。 给个小实例。小弟菜鸟 还是我 if (x < 9 && (HEXHEX == incomingByte))
{
digitalWrite(ledpin, HIGH); //点亮数字13 口LED。
delay(500);
}你这个代码写错了哒。
第一,你的X在循环读取过程中,没有变化,永远可能都是0。
第二,你的反转led的代码,不应该写到这里边来。
在我上边引用的代码里边,你要做的是把正确的收到hex保存起来,如果错误,你必须丢弃。
在这个if外从新判断你收到的是什么内容,是开还是关。
流程应该是:
先判断你收到的协议头是否正确(也就是你的hexhex[]和接受的相比)。如果正确再去判断你所收到的命令是什么,根据命令执行相应的动作。
比如,我们协商口令=12345,上边引用的就是,我喊1,你比较第一声是否为1,依次到5。如果都正确,那么再做其他的。
你现在就是,喊1,你判断正确了,就亮了led,喊2,还是正确,led本来就亮着你又亮了一次……
当然,你的if根本就不成立了。因为x没有变化。所以,你的led应该是闪了一下就灭了,一直灭着。 本帖最后由 乐乐2365 于 2015-8-9 23:28 编辑
int incomingByte ;
int ledpin = 8; //定义数字接口13
//unsigned char hexdata = {0xA5,0x5A,0x04,0x83,0x10,0x00,0x01};
unsigned char HEXHEX = {0xA5,0x5A, 0x08, 0x83, 0x10, 0x00,0x01,0x00, 0x01,0x4E,0x2B};
unsigned char HEXFDS = {0xA5,0x5A, 0x08, 0x83, 0x10, 0x00, 0x01,0x00,0x00,0x8F,0xEB};
unsigned charhexdata[]={};
//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, HEX);
if (x < 11 && (hexdata == incomingByte))//把数组移到hexdata里
x+1;
delay(10);
{
if (c < 11 && (HEXFDS ==hexdata))//2数组比较
c+1;
delay(10);
{
Serial.print(hexdata, HEX);
if(j+1,j==11)//判断是否有9个数组..是led亮
{
digitalWrite(ledpin, HIGH);
delay(500);
j=0;
x=0;
c=0;
}
}
}
if (x < 11 && (hexdata == incomingByte))
x+1;
delay(10);
{
if (c < 11 && (HEXHEX ==hexdata))
c+1;
delay(10);
{
if(j+1,j==11)
{
digitalWrite(ledpin, HIGH);
delay(500);
j=0;
x=0;
c=0;
}
}}}}
把正确的收到hex保存起来,如果错误,你必须丢弃。这个程序我不会,大侠指点
不知道这样行不行
int incomingByte =0;
int ledpin = 8; //定义数字接口13
unsigned char hexdata = {0xA5, 0x5A, 0x04, 0x83, 0x10, 0x00, 0x01};
unsigned char HEXHEX = {0xA5, 0x5A, 0x08, 0x83, 0x10, 0x01, 0x01, 0x4E, 0x2B};
unsigned char HEXFDS = {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 == incomingByte) {
CheckSumX++;
}
if (HEXFDS == 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;
}
}
} 把正确的收到hex保存起来,如果错误,你必须丢弃的程序不会写。大侠指点。
lkc8210 程序可以控制。谢谢
乐乐2365 发表于 2015-8-9 23:39 static/image/common/back.gif
把正确的收到hex保存起来,如果错误,你必须丢弃的程序不会写。大侠指点。
我现在刚好也在弄一个串口通信的小东西。
收到并保存这个,一种方法是:
在外面设一个标志位,来确定是收到的数据是否需要保存。
然后,收到一位检测一位,根据收到的内容是否为包头,以及前面的标志位,然后来处理。最后收到包尾了,再进行两个目标String或者char[]的比较。程序自己多写写多调调。
页:
[1]
2