[Arduino]在串口读取多个字符串,并且转换为数字数组(转)
功能如题目。
在串口收到逗号分割的6串数字比如
100,200,45,4,87,99
然后在6个PWM端口3, 5, 6, 9, 10, 11输出对应PWM值
代码注释很详细了,就不再说明了。
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.{
arduino字符串转数组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 += ad());
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.}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论