请问下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().
arduino 串口好像也是中断缓存的,要是串口中断优先级高,理论上应该可以,不过不确定谁高。
但是不建议你这么写程序,中断里面还延时,按键中断里面弄个标志量,主函数里面查询这歌标志量就可以了,尽量快速结束中断函数 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 09:11
谢谢啊,那就不用这东西了,换个方法。
能再请教您一个问题吗?
就是,我有一串数据从pc机传入arduino ...
0b 42 48 要是固定帧头就好办,不是国定帧头,长度永远是3页好办,别的不太好弄。
最简单省事便于后期维护的就是串口收的转string直接截取。再转回数字。麻烦的,写个if 删掉就可以了,也省事,就是后期不好维护 275891381 发表于 2017-10-31 16:47
0b 42 48 要是固定帧头就好办,不是国定帧头,长度永远是3页好办,别的不太好弄。
最简单省事便于后期维 ...
大佬,非常谢谢,前面的问题都应经解决了。。哈哈,谢谢谢谢
能再问您最后一个问题吗?
arduino uno我看书上写的都是只有两个中断端口,数字2和3口,只有发生在这两个端口的中断才能被响应,
那我要是想用第三个外部中断怎么办呢?
(因为现在弄的是一个称重天平,需要连接,清零,去皮三个功能,但就两个中断端口,不知道该怎么弄了)
想了下,应该可以用长按和短按实现,但感觉不太好。您能有别的方法吗?
谢谢了 本帖最后由 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
275891381 发表于 2017-11-2 19:22
你百度arduino第三个中断就有第三个硬件中断了,私人写的库不过容易有问题。
你的问题有很多简单方法 ...
嗯呐,谢谢谢谢了,我明天试一下:D:D 本帖最后由 275891381 于 2017-11-2 22:51 编辑
误入、人间 发表于 2017-11-2 22:41
嗯呐,谢谢谢谢了,我明天试一下
看你io剩的估计很多,就用方式2吧,下个定时器库,这两个都挺好用的,一个用了定时器,一个用的是millis,用定时器的可以用在精度要求高的,普通用途都能满足
页:
[1]