Safari◢ 发表于 2014-4-1 12:13:55

如何实现SYN6288动态播报

本帖最后由 Safari◢ 于 2014-4-1 12:15 编辑

我想做一个能播报变量的测距设备,在变量的播报部分遇到障碍,希望有能力的老师帮忙看下。

这是一段在论坛上淘到的代码,看上去只能输入字符串

#include <string.h>


unsigned char unicstr; //输出unicode编码字符串
int utf8_to_unicode(unsigned char *pUTF8, unsigned char *pUNIC);
unsigned int length;
unsigned char headOfFrame;   //定义数据帧头
unsigned char ecc = 0 ; //定义校验字节
unsigned int i = 0;

void setup()
{
// initialize serial:
Serial.begin(9600);

}
void loop()
{

unsigned char utf8str[]="123";//我想把这里的“123”替换成测距得出的变量,请问怎么改可以实现?

length = utf8_to_unicode(utf8str, unicstr); //utf8 编码转换成unicode 编码,并返回unicode字符数
    headOfFrame = 0xFD ; //构造帧头FD
    headOfFrame = length >> 8 ;   //构造数据区长度的高字节
    headOfFrame = (length + 3) & 0xFF; //构造数据区长度的低字节
headOfFrame = 0x01; //构造命令字:合成播放命令
headOfFrame = 0x03 ; //构造命令参数:编码格式为Unicode
ecc = 0;
    for(i = 0; i < 5; i++) //依次发送构造好的5 个帧头字节
{
ecc = ecc ^ (headOfFrame); //对发送的字节进行异或校验
Serial.write(headOfFrame);
}
    for(i = 0; i < length; i++) //依次发送待合成的文本数据
{
ecc = ecc ^ (unicstr); //对发送的字节进行异或校验
Serial.write(unicstr);
//Serial.println(unicstr, HEX);
}
Serial.write(ecc); //最后发送校验字节
delay(6000);
}
int utf8_to_unicode(unsigned char   *pUTF8, unsigned char *pUNIC)
{
//SYN6288中unicode编码采用大端模式
// b1 表示UTF-8编码的pInput中的高字节, b2表示次高字节, ...
    unsigned char b1, b2, b3, b4;
int utfbytes = 0;
while( *pUTF8 != '\0')
{
b1 = *pUTF8;
if( (b1 & 0x80) == 0x0)// utf8 - one byte
{
utfbytes = utfbytes + 2;
*pUNIC = 0x00;
*(pUNIC + 1) = b1;
pUTF8++;
pUNIC = pUNIC + 2;
}
      else if( (b1 & 0xE0) == 0xC0)// utf8 - two byte
{
utfbytes = utfbytes + 2;
b1 = *pUTF8;
b2 = *(pUTF8 + 1);
if ( (b2 & 0xC0) != 0x80 )
return 0;
*pUNIC = (b1 >> 2) & 0x07;
            *(pUNIC + 1) = (b1 << 6) + (b2 & 0x3F);
pUTF8 = pUTF8 + 2;
pUNIC = pUNIC + 2;
}
      else if( (b1 & 0xF0) == 0xE0)// utf8 - three byte
{
utfbytes = utfbytes + 2;
b1 = *pUTF8;
b2 = *(pUTF8 + 1);
b3 = *(pUTF8 + 2);
if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80) )
return 0;
*pUNIC = (b1 << 4) + ((b2 >> 2) & 0x0F);
            *(pUNIC + 1) = (b2 << 6) + (b3 & 0x3F);
pUTF8 = pUTF8 + 3;
pUNIC = pUNIC + 2;
}
else if( (b1 & 0xF8) == 0xF0)// utf8 - four byte
{
utfbytes = utfbytes + 3;
b1 = *pUTF8;
b2 = *(pUTF8 + 1);
b3 = *(pUTF8 + 2);
b4 = *(pUTF8 + 3);
            if ( ((b2 & 0xC0) != 0x80) ||((b3 & 0xC0) != 0x80) || ((b4 & 0xC0) != 0x80) )
return 0;
*pUNIC = ((b1 << 2) & 0x1C) + ((b2 >> 4) & 0x03);
*(pUNIC + 1) = (b2 << 4) + ((b3 >> 2) & 0x0F);
            *(pUNIC + 2) = (b3 << 6) + (b4 & 0x3F);
pUTF8 = pUTF8 + 4;
pUNIC = pUNIC + 3;
}
}
*pUNIC = '\0';
return utfbytes;
}

小生,谢谢了









页: [1]
查看完整版本: 如何实现SYN6288动态播报