185 lines
3.8 KiB
C++
185 lines
3.8 KiB
C++
#include "QDPQF.h"
|
|
//#include "QDPprot.h"
|
|
|
|
void QDPQF::begin(Stream &stream) {
|
|
|
|
_serial = &stream;
|
|
}
|
|
int QDPQF::HC(char text[],uint8_t order) {
|
|
int text_len = strlen(text) + 2;
|
|
_serial->write(0xFD);
|
|
_serial->write(text_len >> 8);
|
|
_serial->write(text_len);
|
|
_serial->write(0x01);
|
|
_serial->write(0x01);
|
|
_serial->print(text);
|
|
if(order)
|
|
QZWC();
|
|
return 0;
|
|
|
|
}
|
|
int QDPQF::HC(int num,uint8_t order) {
|
|
char s[10]{0};//定义定符数组
|
|
sprintf(s,"%d",num);//把字转换成字符放到数据里
|
|
// itoa(i,s,10);
|
|
int text_len = strlen(s) + 2;
|
|
_serial->write(0xFD);
|
|
_serial->write(text_len >> 8);
|
|
_serial->write(text_len);
|
|
_serial->write(0x01);
|
|
_serial->write(0x01);
|
|
_serial->print(s);
|
|
if(order)
|
|
QZWC();
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
int QDPQF::HC(char data[],int len,uint8_t order) {
|
|
|
|
int text_len = len + 2;
|
|
_serial->write(0xFD);
|
|
_serial->write(text_len >> 8);
|
|
_serial->write(text_len);
|
|
_serial->write(0x01);
|
|
_serial->write(0x01);
|
|
for(int i=0;i<len;i++)
|
|
_serial->write(data[i]);
|
|
if(order)
|
|
QZWC();
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
int QDPQF::HC(float fnum,uint8_t order) {
|
|
char s[10]={0};//定义定符数组
|
|
dtostrf(fnum,10,2,s);
|
|
int text_len = strlen(s) + 2;
|
|
_serial->write(0xFD);
|
|
_serial->write(text_len >> 8);
|
|
_serial->write(text_len);
|
|
_serial->write(0x01);
|
|
_serial->write(0x01);
|
|
_serial->print(s);
|
|
if(order)
|
|
QZWC();
|
|
return 0;
|
|
|
|
}
|
|
int QDPQF::QZWC() {
|
|
long Stime = millis();
|
|
while (_serial->read() != 0x41) //等待语音合成完成
|
|
{ if (millis() - Stime > 10000)
|
|
return -1;
|
|
delay(0);
|
|
}
|
|
while (_serial->read() != 0x4F) //等待语音播放完成
|
|
{ if (millis() - Stime > 10000)
|
|
return -1;
|
|
delay(0);
|
|
}
|
|
return 0;
|
|
}
|
|
int QDPQF::QDSB(uint8_t num) {
|
|
byte FS_array[] = {0xFD, 0x00, 0x01, 0x10};
|
|
for (int i = 0; i < 4; i++) {
|
|
_serial->write(FS_array[i]);
|
|
}
|
|
strcpy(data_js,"");
|
|
long Stime = millis();
|
|
int count = 0, D_len = 0, count1 = 0;
|
|
byte data_len[2] = {0};
|
|
//去除收到的41
|
|
while (true) {
|
|
if (millis() - Stime > 10000)
|
|
return -1;
|
|
if ((_serial->available() > 0 ) && (_serial->read() == 0x41)) {
|
|
break;
|
|
}
|
|
}
|
|
// 去除FC
|
|
while (true) {
|
|
if (millis() - Stime > 10000)
|
|
return -1;
|
|
if ((_serial->available() > 0) && (_serial->read() == 0xFC)) {
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
//接收数据长度计算
|
|
while (count < 2) {
|
|
if (millis() - Stime > 10000)
|
|
return -1;
|
|
if (_serial->available() > 0) {
|
|
data_len[count] = _serial->read();
|
|
count ++;
|
|
}
|
|
}
|
|
D_len = data_len[0];
|
|
D_len <<= 8;
|
|
D_len |= data_len[1];
|
|
D_len -= 2;//总数据长度-2用于后面数据处理
|
|
//下面两个字节分别为命令.命令不理.如果出现2,3,4返回值.函数返回对应数据.
|
|
count = 0;
|
|
while (count < 2) {
|
|
if (millis() - Stime > 10000)
|
|
return -1;
|
|
if (_serial->available() > 0) {
|
|
data_len[count] = _serial->read();
|
|
count ++;
|
|
}
|
|
}
|
|
switch ( data_len[2]) {
|
|
case 0x2: return -2;
|
|
break;
|
|
case 0x3: return -3;
|
|
break;
|
|
case 0x4: return -4;
|
|
break;
|
|
}
|
|
//接收数据.并计算出接收到有效的数据长度.方便后继处理
|
|
count = 0;
|
|
while (count < D_len) {
|
|
if (millis() - Stime > 10000)
|
|
return -1;
|
|
if (_serial->available() > 0) {
|
|
data_js[count] = _serial->read();
|
|
if (data_js[count] != 0x00)
|
|
count1 ++;
|
|
count ++;
|
|
}
|
|
}
|
|
if(num){
|
|
HC(data_js);
|
|
// QZWC();
|
|
}
|
|
//Serial.print(data_js);
|
|
return count1;
|
|
}
|
|
int QDPQF::DBJG(char ZF[]) {
|
|
if(strcmp(ZF,data_js)){
|
|
return 0;
|
|
}else{
|
|
memset(data_js,'\0',sizeof(data_js));
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
void QDPQF::TZSB() {
|
|
byte FS_array[] = {0xFD, 0x00, 0x01, 0x1F};
|
|
for (int i = 0; i < 4; i++) {
|
|
_serial->write(FS_array[i]);
|
|
|
|
}
|
|
}
|
|
|
|
void QDPQF::TZHC() {
|
|
byte FS_array[] = {0xFD,0x00,0x01,0x02};
|
|
for (int i = 0; i < 4; i++) {
|
|
_serial->write(FS_array[i]);
|
|
|
|
}
|
|
}
|