最近在做语音合成模块,以下代码可以实现 语音合成,但语音的16进制代码 只是固定的,我的要求是通过网页获取16进制数据,然后arduino进行输出。目前已实现网页获取数据并存储于变量Voice中,后面就不知道怎么分割成数组了。
void setup(){
Serial.begin(9600);
}
void speech(){
unsigned char i = 0;
unsigned char a[]={0xFD,0x00,0x07,0x01,0x00,0xC4,0xE3,0xBA,0xC3,0xA5};//这里是语音的16进制代码
for(i=0; i<10; i++){
Serial.write(a[i]);
}
}
void loop(){
speech();
delay(3000);
}
//以串口读取字符串长度循环,
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;
}
}