全局变量会循环初始化值???-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1273|回复: 12

[已解决] 全局变量会循环初始化值???

[复制链接]
发表于 2021-12-19 01:37 | 显示全部楼层 |阅读模式
本帖最后由 xcj1 于 2021-12-19 01:38 编辑

请问有大佬遇到过这种情况吗,我通过串口通信赋值了 ,然后一会key值又变成-1了

jpg

jpg
发表于 2021-12-19 10:20 | 显示全部楼层

回帖奖励 +1 金币

本帖最后由 topdog 于 2021-12-19 10:28 编辑

如果程序改成这样,全局变量就不会变了。

[pre]int key;

void setup() {
Serial.begin(9600);

}

void loop() {
  if(Serial.available() > 0){
  key = Serial.read();
  }
  delay(500);
  Serial.println(key);
}[/pre]

原因如下:
read()串口中可读取数据的第一个字节(如果没有可读取的数据则返回-1)。该返回值为整数型,返回值内容是读取到数据的ASCII代码。譬如串口输入0,key输出为48。
 楼主| 发表于 2021-12-19 15:45 | 显示全部楼层
topdog 发表于 2021-12-19 10:20
如果程序改成这样,全局变量就不会变了。

int key;

大哥 我换成 int key; 他初始化为0,然后我通过串口传入任何一个值, 后它会给我重复初始化10(好像是对应换行键)
 楼主| 发表于 2021-12-19 15:47 | 显示全部楼层
topdog 发表于 2021-12-19 10:20
如果程序改成这样,全局变量就不会变了。

int key;

不知道是不是我的这块Arduino里面的环境问题
发表于 2021-12-19 16:10 | 显示全部楼层
xcj1 发表于 2021-12-19 15:47
不知道是不是我的这块Arduino里面的环境问题

C语言要学好。
发表于 2021-12-19 16:12 | 显示全部楼层
topdog 发表于 2021-12-19 10:20
如果程序改成这样,全局变量就不会变了。

int key;

请教怎样去掉数据后的1
int key;
int k;
void setup() {
Serial.begin(9600);
}
void loop() {
  if(Serial.available()>0 ){
  key= Serial.read();  
  }
  delay(1000);
  k=Serial.write(key);
  Serial.println(k);
}
发表于 2021-12-19 16:14 | 显示全部楼层
本帖最后由 topdog 于 2021-12-19 16:17 编辑
xcj1 发表于 2021-12-19 15:45
大哥 我换成 int key; 他初始化为0,然后我通过串口传入任何一个值, 后它会给我重复初始化10(好像是对 ...

read()串口中可读取数据的第一个字节(如果没有可读取的数据则返回-1)。该返回值为整数型,返回值内容是读取到数据的ASCII代码。譬如串口输入0,key输出为48。

int key是全局变量,你给它赋值。只要串口不输入,那么值是不改变的。Serial.available() > 0,才会读取输入值。一旦,串口有输入,那么key初始值就改变了,并且保持不变。
 楼主| 发表于 2021-12-19 16:24 | 显示全部楼层
topdog 发表于 2021-12-19 16:14
read()串口中可读取数据的第一个字节(如果没有可读取的数据则返回-1)。该返回值为整数型,返回值内容是 ...

好吧,谢谢大哥。
我这个是为了拿来做毕业设计 ,我主要是学java的,所以能算是有一点点编程基础,我也是按照您说的这样想的。按照正常情况全局变量只会执行一次,但是在我这会重复执行,所以我就很不理解了。
发表于 2021-12-19 16:56 | 显示全部楼层
本帖最后由 topdog 于 2021-12-19 16:59 编辑

其实write是有返回值的,数据是一个字节一个字节地发送的,Arduino官方建议若以字符形式发送数字请使用print()代替。 k=Serial.write(key); k值被赋值是write的返回值。如果write输出字符串呢?
[pre]void setup() {
Serial.begin(9600);
}
void loop() {  
  int bytesSent = Serial.write("hello");  
  Serial.print("bytesSent =");
  Serial.println(bytesSent);
  delay(1000);
}[/pre]

输出结果:
write.JPG
发表于 2021-12-19 17:01 | 显示全部楼层
xcj1 发表于 2021-12-19 16:24
好吧,谢谢大哥。
我这个是为了拿来做毕业设计 ,我主要是学java的,所以能算是有一点点编程基础,我也是 ...

祝你学习愉快,天天进步。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 18:48 , Processed in 0.118645 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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