极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20762|回复: 7

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

[复制链接]
发表于 2017-10-29 21:57:04 | 显示全部楼层 |阅读模式
#include <LiquidCrystal.h>
unsigned char hexdata[30]={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[0],30);
  delay(50);
  while(Serial.available()==0){
  Serial.write(&hexdata[0],30);}
  if(Serial.available())
  {
    //delay(100);
    digitalWrite(5,HIGH);
    delay(500);
    digitalWrite(5,LOW);
  }
Serial.flush();
}


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

使用道具 举报

发表于 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啊?
回复 支持 反对

使用道具 举报

发表于 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口,只有发生在这两个端口的中断才能被响应,
那我要是想用第三个外部中断怎么办呢?
(因为现在弄的是一个称重天平,需要连接,清零,去皮三个功能,但就两个中断端口,不知道该怎么弄了)
想了下,应该可以用长按和短按实现,但感觉不太好。您能有别的方法吗?
谢谢了
回复 支持 反对

使用道具 举报

发表于 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个方案,一个adi  o能挂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[6] ={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[k])
       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[current_caidan_sclect];
    }
    if(key==key_down)
    {
         current_sclect++;if(current_sclect>caidan_sclect_max[current_caidan_sclect])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

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

嗯呐,谢谢谢谢了,我明天试一下
回复 支持 反对

使用道具 举报

发表于 2017-11-2 22:44:58 | 显示全部楼层
本帖最后由 275891381 于 2017-11-2 22:51 编辑
误入、人间 发表于 2017-11-2 22:41
嗯呐,谢谢谢谢了,我明天试一下


看你io剩的估计很多,就用方式2吧,下个定时器库,这两个都挺好用的,一个用了定时器,一个用的是millis,用定时器的可以用在精度要求高的,普通用途都能满足

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 04:32 , Processed in 0.043617 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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