Arduino学习笔记A6(补充) - 在串口读取多个字符串,并且转换为数字数组

功能如题目。 在串口收到逗号分割的6串数字比如 100,200,45,4,87,99 然后在6个PWM端口3, 5, 6, 9, 10, 11输出对应PWM值
代码注释很详细了,就不再说明了。

ARDUINO 代码

  1. //定义一个comdata字符串变量,赋初值为空值

  2. String comdata = "";

  3. //numdata是分拆之后的数字数组

  4. int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9, 10, 11}, mark = 0;

  5. void setup()

  6. {

  7. //定义0~6脚是输出

  8.   for(int i = 0; i < 6; i++) pinMode(PWMPin[i], OUTPUT);

  9.   Serial.begin(9600);

  10. }

  11.  

  12. void loop()

  13. {

  14. //j是分拆之后数字数组的位置记数

  15.   int j = 0;

  16.  

  17.   //不断循环检测串口缓存,一个个读入字符串,

  18.   while (Serial.available() > 0)

  19.   {

  20.   //读入之后将字符串,串接到comdata上面。

  21.     comdata += char(Serial.read());

  22.       //延时一会,让串口缓存准备好下一个数字,不延时会导致数据丢失,

  23.     delay(2);

  24.     //标记串口读过数据,如果没有数据的话,直接不执行这个while了。

  25.     mark = 1;

  26.   }

  27.  

  28.   if(mark == 1)  //如果接收到数据则执行comdata分析操作,否则什么都不做。

  29.   {

  30.   //显示刚才输入的字符串(可选语句)

  31.     Serial.println(comdata);

  32.       //显示刚才输入的字符串长度(可选语句)

  33.     Serial.println(comdata.length());

  34.  

  35. /*******************下面是重点*******************/

  36. //以串口读取字符串长度循环,

  37.     for(int i = 0; i < comdata.length() ; i++)

  38.     {

  39.     //逐个分析comdata[i]字符串的文字,如果碰到文字是分隔符(这里选择逗号分割)则将结果数组位置下移一位

  40.     //即比如11,22,33,55开始的11记到numdata[0];碰到逗号就j等于1了,

  41.     //再转换就转换到numdata[1];再碰到逗号就记到numdata[2];以此类推,直到字符串结束

  42.       if(comdata[i] == ',')

  43.       {

  44.         j++;

  45.       }

  46.       else

  47.       {

  48.          //如果没有逗号的话,就将读到的数字*10加上以前读入的数字,

  49.          //并且(comdata[i] - '0')就是将字符'0'的ASCII码转换成数字0(下面不再叙述此问题,直接视作数字0)。

  50.          //比如输入数字是12345,有5次没有碰到逗号的机会,就会执行5次此语句。

  51.          //因为左边的数字先获取到,并且numdata[0]等于0,

  52.          //所以第一次循环是numdata[0] = 0*10+1 = 1

  53.          //第二次numdata[0]等于1,循环是numdata[0] = 1*10+2 = 12

  54.          //第三次是numdata[0]等于12,循环是numdata[0] = 12*10+3 = 123

  55.          //第四次是numdata[0]等于123,循环是numdata[0] = 123*10+4 = 1234

  56.          //如此类推,字符串将被变成数字0。

  57.         numdata[j] = numdata[j] * 10 + (comdata[i] - '0');

  58.       }

  59.     }

  60.     //comdata的字符串已经全部转换到numdata了,清空comdata以便下一次使用,

  61.     //如果不请空的话,本次结果极有可能干扰下一次。

  62.     comdata = String("");

  63.  

  64.  

  65.     //循环输出numdata的内容,并且写到PWM引脚

  66.     for(int i = 0; i < 6; i++)

  67.     {

  68.       Serial.print("Pin ");

  69.       Serial.print(PWMPin[i]);

  70.       Serial.print(" = ");

  71.       Serial.println(numdata[i]);

  72.       analogWrite(PWMPin[i], numdata[i]);

  73.       numdata[i] = 0;

  74.     }

  75.     //输出之后必须将读到数据的mark置0,不置0下次循环就不能使用了。

  76.     mark = 0;

  77.   }

  78. }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Python中的列表存储到Arduino数组中,需要通过串口通信将数据传输到Arduino中。具体的步骤如下: 1. 在Python中,使用`serial`模块连接到Arduino串口。例如: ```python import serial ser = serial.Serial('COM3', 9600) # COM3为串口号,9600为波特率 ``` 2. 将Python中的列表转换字符串,并通过串口发送到Arduino中。例如: ```python my_list = ['hello', 'world', 'python'] my_str = ','.join(my_list) # 将列表中的字符串用逗号连接成一个字符串 ser.write(my_str.encode()) # 将字符串编码后通过串口发送到Arduino ``` 3. 在Arduino的代码中,接收串口传输的数据,并将其存储到数组中。例如: ```c++ String inputString = ""; // 保存串口接收到的数据 String data[10]; // 存储字符串数组 void setup() { Serial.begin(9600); // 设置串口波特率为9600 } void loop() { if (Serial.available()) { // 如果串口接收到数据 char c = Serial.read(); // 读取串口数据 if (c == '\n') { // 如果接收到换行符,说明数据传输完成 int i = 0; while (inputString.length() > 0) { // 将接收到的字符串分割成多个字符串,存储到数组中 int index = inputString.indexOf(','); if (index != -1) { data[i] = inputString.substring(0, index); inputString = inputString.substring(index + 1); i++; } else { data[i] = inputString; inputString = ""; } } } else { inputString += c; } } } ``` 注意:在将Python中的字符串通过串口发送到Arduino时,需要按照一定的格式进行编码和解码,以保证数据的正确传输。在上述例子中,我们采用了将字符串用逗号连接的方式,并在Arduino端将其分割成多个字符串存储到数组中的方法。在实际应用中,根据需求可以采用其他的方式进行编码和解码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值