误入、人间 发表于 2017-10-29 21:57:04

请问下arduino的中断函数里面能否加Serial.available()

#include <LiquidCrystal.h>
unsigned char hexdata={0x04,0x01,0x09,0x00,0x0e,0x04,0x01,0x09,0x00,0x0e,0x04,0x01,0x09,0x00,0x0e,0x04,0x01,0x09,0x00,0x0e,0x04,0x01,0x09,0x00,0x0e,0x04,0x01,0x09,0x00,0x0e};//connect signal
int key=2;
int LED=5;
LiquidCrystal lcd(12,11,10,9,8,7,6); //4数据口模式连线声明
void setup()
{
lcd.begin(16,2);
Serial.begin(9600,SERIAL_8O1);//9600,8,1,odd
//Serial.flush();
pinMode(key,INPUT);
pinMode(LED,OUTPUT);
attachInterrupt(0,connect,FALLING);
}
void loop()
{

   while(Serial.available()==0){}
if(Serial.available())
{
    delay(100);
    while(Serial.available()>0)
    {
      digitalWrite(5,HIGH);//whether have data input
      int i=Serial.read();//receive data
      delay(2);
      lcd.print(i);//display data
      delay(10);
      digitalWrite(5,LOW);
    }
}

}
void connect()
{
Serial.write(&hexdata,30);
delay(50);
while(Serial.available()==0){
Serial.write(&hexdata,30);}
if(Serial.available())
{
    //delay(100);
    digitalWrite(5,HIGH);
    delay(500);
    digitalWrite(5,LOW);
}
Serial.flush();
}


我想实现按下按钮的时候,能把数组输入进电脑串口助手,等电脑串口助手回传一个信号的时候,LED能闪烁一下,表示接收到了数据,然后清空缓存,再来执行loop中的操作。
可是我直接用下面的东西的时候,电脑串口可以显示数组
void connect()
{
Serial.write(&hexdata,30);
delay(50);
}
但加上后面的while(Serial.available()==0)和后面的一些东西的时候,电脑收不到发进去的数组了,然后从电脑传信号到arduino的是时候,灯也不亮了。
求大神教教是不是中断里面不能有Serial.available().

275891381 发表于 2017-10-30 10:13:40

arduino 串口好像也是中断缓存的,要是串口中断优先级高,理论上应该可以,不过不确定谁高。
但是不建议你这么写程序,中断里面还延时,按键中断里面弄个标志量,主函数里面查询这歌标志量就可以了,尽量快速结束中断函数

误入、人间 发表于 2017-10-31 09:11:53

275891381 发表于 2017-10-30 10:13
arduino 串口好像也是中断缓存的,要是串口中断优先级高,理论上应该可以,不过不确定谁高。
但是不建议你 ...

谢谢啊,那就不用这东西了,换个方法。
能再请教您一个问题吗?
就是,我有一串数据从pc机传入arduino中,这串数据是0b 42 48 42 1b 85 1e b8 34 43 63 26
怎样写程序只接收到中间的42 1b 85 1e啊?

275891381 发表于 2017-10-31 16:47:41

误入、人间 发表于 2017-10-31 09:11
谢谢啊,那就不用这东西了,换个方法。
能再请教您一个问题吗?
就是,我有一串数据从pc机传入arduino ...

0b 42 48 要是固定帧头就好办,不是国定帧头,长度永远是3页好办,别的不太好弄。
最简单省事便于后期维护的就是串口收的转string直接截取。再转回数字。麻烦的,写个if 删掉就可以了,也省事,就是后期不好维护

误入、人间 发表于 2017-11-2 11:28:35

275891381 发表于 2017-10-31 16:47
0b 42 48 要是固定帧头就好办,不是国定帧头,长度永远是3页好办,别的不太好弄。
最简单省事便于后期维 ...

大佬,非常谢谢,前面的问题都应经解决了。。哈哈,谢谢谢谢
能再问您最后一个问题吗?
arduino uno我看书上写的都是只有两个中断端口,数字2和3口,只有发生在这两个端口的中断才能被响应,
那我要是想用第三个外部中断怎么办呢?
(因为现在弄的是一个称重天平,需要连接,清零,去皮三个功能,但就两个中断端口,不知道该怎么弄了)
想了下,应该可以用长按和短按实现,但感觉不太好。您能有别的方法吗?
谢谢了

275891381 发表于 2017-11-2 19:22:58

本帖最后由 275891381 于 2017-11-2 20:02 编辑

误入、人间 发表于 2017-11-2 11:28
大佬,非常谢谢,前面的问题都应经解决了。。哈哈,谢谢谢谢
能再问您最后一个问题吗?
arduino uno我 ...

你百度arduino第三个中断就有第三个硬件中断了,私人写的库不过容易有问题。
你的问题有很多简单方法解决
1:普通io接按键,函数扫描按键,缺点不及时,不过看你系统也不麻烦,也会很及时,占用io多
2:普通io接按键,定时器定时100ms,调用按键扫描函数,缺点费代码
3:ad采集按键,一个io口能挂很多按键,两种扫描方案同上,缺点不支持同时按
io紧缺的话,一般都是用第3个方案,一个adio能挂10个以上按键,理论上更多,下面代码挂了6个

int key=0;
int KEY_INPUT = A0;

int key_cancle=1;
int key_left=2;
int key_up=3;
int key_down=4;
int key_right=5;
int key_ok=6;

int get_key(void)
{
int NUM_KEYS=6;//0 218 498 676 818 936 1023
int adc_key_val ={109, 358, 587, 747, 877,979};
int k, input;
input=analogRead(KEY_INPUT);
for (k = 0; k < NUM_KEYS; k++)
{
    if (input < adc_key_val)
       return 6-k;
}
if (k >= NUM_KEYS)
    k = 0;   // No valid key pressed
return k;
}


main里面

    key=get_key(); Serial.print(" key:"); Serial.println(key);
    if(key==key_cancle)
    {
         current_caidan_sclect--;if(current_caidan_sclect<0)current_caidan_sclect=0;
    }
    if(key==key_left)
    {
         
    }
    if(key==key_right)
    {
         
    }
    if(key==key_up)
    {
         current_sclect--;if(current_sclect<0)current_sclect=caidan_sclect_max;
    }
    if(key==key_down)
    {
         current_sclect++;if(current_sclect>caidan_sclect_max)current_sclect=0;
    }
    if(key==key_ok)
    {
      current_caidan_sclect++;if(current_caidan_sclect>1)current_caidan_sclect=1;
    }
挂6个的电阻忘记是多少了,下面四个挂5个的,电阻分配原则是使每个按键按下电压尽量均匀分布0-5v 没按是5v 按最上面的事0v,中间分隔0-5v

误入、人间 发表于 2017-11-2 22:41:58

275891381 发表于 2017-11-2 19:22
你百度arduino第三个中断就有第三个硬件中断了,私人写的库不过容易有问题。
你的问题有很多简单方法 ...

嗯呐,谢谢谢谢了,我明天试一下:D:D

275891381 发表于 2017-11-2 22:44:58

本帖最后由 275891381 于 2017-11-2 22:51 编辑

误入、人间 发表于 2017-11-2 22:41
嗯呐,谢谢谢谢了,我明天试一下

看你io剩的估计很多,就用方式2吧,下个定时器库,这两个都挺好用的,一个用了定时器,一个用的是millis,用定时器的可以用在精度要求高的,普通用途都能满足
页: [1]
查看完整版本: 请问下arduino的中断函数里面能否加Serial.available()