发新帖我要提问
12
返回列表
打印
[开发工具]

如何用arduino语法来玩STM32<1>

[复制链接]
楼主: wangjiahao88
手机看帖
扫描二维码
随时随地手机跟帖
21
wangjiahao88|  楼主 | 2019-8-8 16:17 | 只看该作者 回帖奖励 |倒序浏览
String comdata = "";

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

void loop()
{
    while (Serial.available() > 0)  
    {
        comdata += char(Serial.read());
        delay(2);
    }
    if (comdata.length() > 0)
    {
        Serial.println(comdata);
        comdata = "";
    }
}

使用特权

评论回复
22
wangjiahao88|  楼主 | 2019-8-8 16:18 | 只看该作者
在串口输入1011101..的话,就会令Arduino的D2~Dx引脚产生高/低电平,当然,一次发送的数据视Arduino引脚数而定,比如Arduino UNO/nano之类的,只有D2~D13十二个引脚。我们打12个数字就好。比如101101011010,如果中间有非0和1的字符,则自动跳过该位设置:比如122202221222这样。因为2不是允许范围内,就只设置D2/D6/D10的值了:

String comdata = "";
void setup()
{
  Serial.begin(9600);
  for(int i = 2; i <= 13; i++) pinMode(i, OUTPUT);
}

void loop()
{
  while (Serial.available() > 0)
  {
    comdata += int(Serial.read()) - '0';
    delay(2);
  }
  if(comdata.length() > 0)
  {
    for(int i = 0; i < comdata.length(); i++)
    {
      if(comdata[i]=='0'||comdata[i]=='1')
      {
        digitalWrite(i + 2, comdata[i] - '0');
        Serial.print("Pin ");
        Serial.print(i + 2);
        Serial.print(" is ");
        Serial.println(comdata[i]);
      }
    }
    comdata = "";
  }
}

使用特权

评论回复
23
wangjiahao88|  楼主 | 2019-8-8 16:18 | 只看该作者
现在 arduino 已经不单纯的是只AVR了!

stm32 也可以利用这个开发环境了!

使用特权

评论回复
24
wangjiahao88|  楼主 | 2019-8-8 16:28 | 只看该作者
在串口读取多个字符串,并且转换为数字数组

//定义一个comdata字符串变量,赋初值为空值
String comdata = "";
//numdata是分拆之后的数字数组
int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9, 10, 11}, mark = 0;
void setup()
{
//定义0~6脚是输出
  for(int i = 0; i < 6; i++) pinMode(PWMPin[i], OUTPUT);
  Serial.begin(9600);
}

void loop()
{
//j是分拆之后数字数组的位置记数
  int j = 0;

  //不断循环检测串口缓存,一个个读入字符串,
  while (Serial.available() > 0)
  {
  //读入之后将字符串,串接到comdata上面。
    comdata += char(Serial.read());
      //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,
    delay(2);
    //标记串口读过数据,如果没有数据的话,直接不执行这个while了。
    mark = 1;
  }

  if(mark == 1)  //如果接收到数据则执行comdata分析操作,否则什么都不做。
  {
  //显示刚才输入的字符串(可选语句)
    Serial.println(comdata);
      //显示刚才输入的字符串长度(可选语句)
    Serial.println(comdata.length());

//以串口读取字符串长度循环,
    for(int i = 0; i < comdata.length() ; i++)
    {
    //逐个分析comdata[i]字符串的文字,如果碰到文字是分隔符(这里选择逗号分割)则将结果数组位置下移一位
    //即比如11,22,33,55开始的11记到numdata[0];碰到逗号就j等于1了,
    //再转换就转换到numdata[1];再碰到逗号就记到numdata[2];以此类推,直到字符串结束
      if(comdata[i] == ',')
      {
        j++;
      }
      else
      {
         //如果没有逗号的话,就将读到的数字*10加上以前读入的数字,
         //并且(comdata[i] - '0')就是将字符'0'的ASCII码转换成数字0(下面不再叙述此问题,直接视作数字0)。
         //比如输入数字是12345,有5次没有碰到逗号的机会,就会执行5次此语句。
         //因为左边的数字先获取到,并且numdata[0]等于0,
         //所以第一次循环是numdata[0] = 0*10+1 = 1
         //第二次numdata[0]等于1,循环是numdata[0] = 1*10+2 = 12
         //第三次是numdata[0]等于12,循环是numdata[0] = 12*10+3 = 123
         //第四次是numdata[0]等于123,循环是numdata[0] = 123*10+4 = 1234
         //如此类推,字符串将被变成数字0。
        numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
      }
    }
    //comdata的字符串已经全部转换到numdata了,清空comdata以便下一次使用,
    //如果不请空的话,本次结果极有可能干扰下一次。
    comdata = String("");


    //循环输出numdata的内容,并且写到PWM引脚
    for(int i = 0; i < 6; i++)
    {
      Serial.print("Pin ");
      Serial.print(PWMPin[i]);
      Serial.print(" = ");
      Serial.println(numdata[i]);
      analogWrite(PWMPin[i], numdata[i]);
      numdata[i] = 0;
    }
    //输出之后必须将读到数据的mark置0,不置0下次循环就不能使用了。
    mark = 0;
  }
}

使用特权

评论回复
25
toofree| | 2019-8-8 16:51 | 只看该作者
在Arduino上ESP8266这个更好玩,便宜是硬道理。

使用特权

评论回复
26
wangjiahao88|  楼主 | 2019-8-12 12:38 | 只看该作者
现在有更强大的ESP32了!

使用特权

评论回复
27
kxsi| | 2019-9-9 15:02 | 只看该作者
我看不懂啊

使用特权

评论回复
28
wangjiahao88|  楼主 | 2019-9-9 15:14 | 只看该作者

说白了 就是使用arduino 的方式来开发 STM32 不算是专业的!
只能是极客的开发模式估计!
区别于 KEIL IAR等等

使用特权

评论回复
29
nawu| | 2019-9-9 15:18 | 只看该作者
这是什么语法啊

使用特权

评论回复
30
wangjiahao88|  楼主 | 2019-9-10 10:09 | 只看该作者
nawu 发表于 2019-9-9 15:18
这是什么语法啊

估计是C++ 的语法。。。

使用特权

评论回复
31
晓伍| | 2019-9-16 09:59 | 只看该作者
对这个名字好陌生啊

使用特权

评论回复
32
八层楼| | 2019-9-16 12:05 | 只看该作者
真心没有接触过

使用特权

评论回复
33
观海| | 2019-9-16 12:08 | 只看该作者
我来学习一下吧

使用特权

评论回复
34
汽车电子| | 2019-12-30 08:47 | 只看该作者
Arduino是面对中小学生学习用的,开发环境也不适合做产品,要做产品,还是老老实实学好C语言,用Keil、IAR之类的编译器。
STM32F确实比AVR更强大,性价比更高,ST官应该投多些钱,全面支持Arduino,让更多学生使用。
还有更简单的 Scratch,MIT开发的小朋友编程启蒙软件,更有意思。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则