串行输入超过1个字符的Arduino控件
我有下面的脚本,它可以工作。串行输入超过1个字符的Arduino控件,arduino,serial-port,Arduino,Serial Port,我有下面的脚本,它可以工作。 但是我想用开或关这样的词来控制它,而不是用一个字符。 我尝试了很多次,但是没有成功 /* 简单LED示意图 */ int led=13;//针脚13 无效设置() { 引脚模式(led,输出);//将引脚13设置为数字输出 //启动串行连接 Serial.begin(115200);//波特率 } void循环() { if(Serial.available()){ int ser=Serial.read();//将串行读取为ascii整数 如果(ser=='a')
但是我想用
开
或关
这样的词来控制它,而不是用一个字符。我尝试了很多次,但是没有成功
/*
简单LED示意图
*/
int led=13;//针脚13
无效设置()
{
引脚模式(led,输出);//将引脚13设置为数字输出
//启动串行连接
Serial.begin(115200);//波特率
}
void循环()
{
if(Serial.available()){
int ser=Serial.read();//将串行读取为ascii整数
如果(ser=='a'){//这个串行字节是0到9的ASCII等价物吗?
数码写入(led,高);//打开
序列号。打印号(“aan”);
}
否则如果(ser=='u'){
数字写入(led,低);//关闭
序列号。打印号(“uit”);
}
}
}
用于从序列号中读取字符串
发送的字符串需要以换行符结尾。在Arduino IDE的串行监视器中选择
Newline
String cmd=”“;
void循环()
{
if(Serial.available()){
cmd=Serial.readStringUntil('\n');
如果(cmd==“on”){
数码写入(led,高);//打开
序列号。打印号(“aan”);
}
else if(cmd==“off”){
数字写入(led,低);//关闭
序列号。打印号(“uit”);
}
}
}
您的问题是您使用的是一个字符,您需要声明一个字符串,以便您可以将该字符串与输入进行比较,上面的人给出了一个确定/非常松散/太复杂的答案(对不起,无意冒犯,我只是想展示复杂答案和简单答案之间的对比,不想冒犯您)部分原因是他没有解释他在做什么,因为他正在做不必要/无用的工作。C++中有一个函数叫做Stay.RealStReg(),它比上面的内容要简单多了。假设您的编程水平(无意冒犯),这里是对数据类型的快速回顾:
String=“”
int=整数{1,2,3,4,5,6,…}
char=''是否有任何用例需要它并证明有效负载大小和复杂性的增加是合理的?让我猜猜,上面的家伙拒绝了,因为我抨击了他的答案,lolI没有因为你抨击了我的答案而否决你的答案,我否决了它,因为你的答案是错误的。基于超时,默认情况下为1秒。这意味着每次调用时,
readString
都会阻塞至少1秒。这也意味着,这些命令将有1秒的延迟,您发送单个命令的速度不能超过每秒一个,或者您将在一个字符串中获得多个命令。通过函数可以缩短超时时间,但这仍然不理想。如果(Serial.available()),则没有什么奇怪和可疑之处。零的计算结果为false
,任何其他值的计算结果为true
。该语句实际上与if(Serial.available()!=0)相同。奇怪和阴暗的是你对它的使用和你的评论与你对它的实际操作相反。如果串行缓冲区中有任何内容使用serial.available()。为什么???您也无缘无故地对数据类型进行了一些解释。你的代码格式很差,很难阅读。你的文章中有太多的篇幅专门抨击我的答案,说它太复杂,做了不必要的工作,却没有解释你的答案如何更好。如果您只是使用readString
展示了一个解决方案,并解释了与之相关的问题,那么您的答案会很好。正如您所知,如果(Serial.available())不是condition@IamtheLawTheLaw什么意思?我认为只有当缓冲区中至少有一个字符时,这段代码才应该执行阻塞函数(我认为这是不复制缓冲区的最佳方法)。值得注意的是,通常在windows上,默认设置是将新行字符作为“\r\n”发送,这使此代码无法工作(您应该在比较之前过滤掉\r字符)@IamtheLawTheLaw正如您所知,我运行了此代码,它工作得很好。嗯…好的,很酷,很高兴您高兴大家都高兴,我仍然认为(Serial.available())这不是一个条件。为什么?因为您并没有真正创建条件,所以Serial.available()通常需要和int。在我的序列中输入的字符序列是什么?字符串是一系列字符,因此,如果您想使用Serial.available来实际查看您输入的内容,例如0是第一个字符(这是因为字符串是一个字符数组),则必须对其进行定义,否则只会浪费内存。但一切都很好,只是不要因为不喜欢就放下它。祝你好运
/*
Simple LED sketch
*/
int led = 7; // Pin 13
String ser; //Declare the string that is going to store what your are going to
//write in the serial
void setup(){
// Start up serial connection
//It's good convention to start the serial before pinMode or any other thing
//in setup
Serial.begin(9600); //I don't know why you need such an high baud rate in
//your thing, 9600 for what you have to do is more than fine, this is just at
//what speed the serial is read (in a very general explanation)
pinMode(led, OUTPUT); // Set pin 13 as digital out
//make sure you put in here wheter you want to start the led "on" or "off"
//Eg you want it to start on, then digitalWrite(led, HIGH);
}
void loop(){
ser = Serial.readString();
if(Serial.available() == 0) { //You can also use a while loop if you want to
//This is telling the arduino: if there is something in the serial, then do...
if(ser == "on"){
Serial.println("on");
digitalWrite(led, HIGH);
}else if(ser == "off"){
Serial.println("off");
digitalWrite(led, LOW);
}
}
}
if(Serial.available())
int incomingByte = 0; // for incoming serial data
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}