极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10425|回复: 0

如何实现SYN6288动态播报

[复制链接]
发表于 2014-4-1 12:13:55 | 显示全部楼层 |阅读模式
本帖最后由 Safari◢ 于 2014-4-1 12:15 编辑

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

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

  1. #include <string.h>


  2. unsigned char unicstr[100]; //输出unicode编码字符串
  3. int utf8_to_unicode(unsigned char *pUTF8, unsigned char *pUNIC);
  4. unsigned int length;
  5. unsigned char headOfFrame[5];     //定义数据帧头
  6. unsigned char ecc = 0 ; //定义校验字节
  7. unsigned int i = 0;

  8. void setup()
  9. {
  10. // initialize serial:
  11. Serial.begin(9600);

  12. }
  13. void loop()
  14. {

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

  16.   length = utf8_to_unicode(utf8str, unicstr); //utf8 编码转换成unicode 编码,并返回unicode字符数
  17.     headOfFrame[0] = 0xFD ; //构造帧头FD
  18.     headOfFrame[1] = length >> 8 ;   //构造数据区长度的高字节
  19.     headOfFrame[2] = (length + 3) & 0xFF; //构造数据区长度的低字节
  20. headOfFrame[3] = 0x01; //构造命令字:合成播放命令
  21. headOfFrame[4] = 0x03 ; //构造命令参数:编码格式为Unicode
  22. ecc = 0;
  23.     for(i = 0; i < 5; i++) //依次发送构造好的5 个帧头字节
  24. {
  25. ecc = ecc ^ (headOfFrame[i]); //对发送的字节进行异或校验
  26. Serial.write(headOfFrame[i]);
  27. }
  28.     for(i = 0; i < length; i++) //依次发送待合成的文本数据
  29. {
  30. ecc = ecc ^ (unicstr[i]); //对发送的字节进行异或校验
  31. Serial.write(unicstr[i]);
  32. //Serial.println(unicstr[i], HEX);
  33. }
  34. Serial.write(ecc); //最后发送校验字节
  35. delay(6000);
  36. }
  37. int utf8_to_unicode(unsigned char   *pUTF8, unsigned char *pUNIC)
  38. {
  39. //SYN6288中unicode编码采用大端模式
  40. // b1 表示UTF-8编码的pInput中的高字节, b2  表示次高字节, ...
  41.     unsigned char b1, b2, b3, b4;
  42. int utfbytes = 0;
  43. while( *pUTF8 != '\0')
  44. {
  45. b1 = *pUTF8;
  46. if( (b1 & 0x80) == 0x0)  // utf8 - one byte
  47. {
  48. utfbytes = utfbytes + 2;
  49. *pUNIC = 0x00;
  50. *(pUNIC + 1) = b1;
  51. pUTF8++;
  52. pUNIC = pUNIC + 2;
  53. }
  54.         else if( (b1 & 0xE0) == 0xC0)  // utf8 - two byte
  55. {
  56. utfbytes = utfbytes + 2;
  57. b1 = *pUTF8;
  58. b2 = *(pUTF8 + 1);
  59. if ( (b2 & 0xC0) != 0x80 )
  60. return 0;
  61. *pUNIC = (b1 >> 2) & 0x07;
  62.             *(pUNIC + 1) = (b1 << 6) + (b2 & 0x3F);
  63. pUTF8 = pUTF8 + 2;
  64. pUNIC = pUNIC + 2;
  65. }
  66.         else if( (b1 & 0xF0) == 0xE0)  // utf8 - three byte
  67. {
  68. utfbytes = utfbytes + 2;
  69. b1 = *pUTF8;
  70. b2 = *(pUTF8 + 1);
  71. b3 = *(pUTF8 + 2);
  72. if ( ((b2 & 0xC0) != 0x80) || ((b3 & 0xC0) != 0x80) )
  73. return 0;
  74. *pUNIC = (b1 << 4) + ((b2 >> 2) & 0x0F);
  75.             *(pUNIC + 1) = (b2 << 6) + (b3 & 0x3F);
  76. pUTF8 = pUTF8 + 3;
  77. pUNIC = pUNIC + 2;
  78. }
  79. else if( (b1 & 0xF8) == 0xF0)  // utf8 - four byte
  80. {
  81. utfbytes = utfbytes + 3;
  82. b1 = *pUTF8;
  83. b2 = *(pUTF8 + 1);
  84. b3 = *(pUTF8 + 2);
  85. b4 = *(pUTF8 + 3);
  86.             if ( ((b2 & 0xC0) != 0x80) ||((b3 & 0xC0) != 0x80) || ((b4 & 0xC0) != 0x80) )
  87. return 0;
  88. *pUNIC = ((b1 << 2) & 0x1C) + ((b2 >> 4) & 0x03);
  89. *(pUNIC + 1) = (b2 << 4) + ((b3 >> 2) & 0x0F);
  90.             *(pUNIC + 2) = (b3 << 6) + (b4 & 0x3F);
  91. pUTF8 = pUTF8 + 4;
  92. pUNIC = pUNIC + 3;
  93. }
  94. }
  95. *pUNIC = '\0';
  96. return utfbytes;
  97. }
复制代码


小生,谢谢了









回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-6 19:03 , Processed in 0.075170 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表