MSP432+SYN6288中文播报

模块比较简单,主要配置好串口,然后写好发送协议就可以了。芯片用的是msp432,直接移植标准例程中文无法读出,于是参考这篇文章,(10条消息) ESP32驱动喇叭(syn6288),UTF-8转Unicode,包含中文驱动_esp32 读取utf-_bird1999625的博客-CSDN博客中文用Unicode编码然后发送,可以正常播报,但调用时必须是双数的字数,单数字数的话要用空格补充。

void Run_Horn(char* Data)
{
	//printf_uart2("here");
	
  unsigned char  Out_put[240];    //暂定最多可改240位的字符串
  int i;
  int len_Str = strlen(Data);    //得到UTF-8字符串长度
  int Label_Record = 0;
  memset(Out_put , 0 , sizeof(Out_put));

  for(i = 0 ; i < len_Str ; i++)
  {
    if(Data[i]/128 == 0)  //这意思就是如果说除以127>0代表首位为1
    {
      unsigned char unicode_character[2];
      unicode_character[0] = 0x00;       //高字节填0x00
      unicode_character[1] = Data[i];    //低字节不变
      Out_put[Label_Record] = unicode_character[0];  //
      Label_Record++;
      Out_put[Label_Record] = unicode_character[1];
      Label_Record++;
    }
    //这里就是首位不为1的情况,也就是说遇到了中文字符
    //此项目为喇叭字符转义驱动,中文字符首位在1110 0100到1110 1001 之间(其实已经囊括绝大多数汉字),所以不在这个区间的直接报错
    else
    {
      //if(Data[i]/16 == 14 && Data[i]%16 > 4 && Data[i]%16 < 9 )    //这里就代表这个字节的高四位是1110,并且低位在一定的范围内
      if(Data[i]/16 == 14)
      {
        unsigned char  High_byte = Data[i+0];    //代表中文UTF-8高位
        unsigned char  Middle_byte = Data[i+1];  //代表中文UTF-8中位
        unsigned char  Low_byte = Data[i+2];     //代表中文UTF-8低位

        High_byte = High_byte % 16;    //高位取余16,就是抹掉高四位的1110
        Middle_byte = Middle_byte % 64;  //中位取余64,就是抹掉高两位的10
        Low_byte = Low_byte % 64;  //低位取余64,就是抹掉高两位的10

        unsigned short temp = 0;
        temp = High_byte*4096 + Middle_byte*64 + Low_byte;

        unsigned char  Unicode_Chinese_High_Byte = temp/256;
        unsigned char  Unicode_Chinese_Low_Byte = temp%256;
        Out_put[Label_Record] = Unicode_Chinese_High_Byte;
        Label_Record++;
        Out_put[Label_Record] = Unicode_Chinese_Low_Byte;
        Label_Record++;
      }
      i = i + 2;
    }
  }

  unsigned char Out_put_Fin[Label_Record];    //这里建立一个大小刚好与建立好的unicode形式字符串大小的字符串
  for(i = 0 ; i < Label_Record ; i++)
    Out_put_Fin[i] = Out_put[i];
//  int len_Out_put_Fin = sizeof(Out_put_Fin);//这里绝对不能用strlen,所有str系列的操作都会因为0x00影响
//  for(i = 0 ; i < len_Out_put_Fin ; i++)
//	UART_transmitData(EUSCI_A2_BASE, Out_put_Fin[i]);         //打印出最终的unicode编码字符串 , 注意底层改过write函数


  unsigned char aubChecksum = 0;              //异或校验结果
  unsigned char auwCnt = 0;                   //异或校验中用到的余数
  uint8_t cnt=0;
//  if(!strcmp(Volume , "D"))    //如果是最小声
//  {
    unsigned char Data_Horn[14 + sizeof(Out_put_Fin)];    //这个是传输到喇叭的数据
    int Size_H = (sizeof(Data_Horn) - 3)/256;
    int Size_L = (sizeof(Data_Horn) - 3)%256;
    Data_Horn[cnt++] = 0xFD;                         //0
    Data_Horn[cnt++] = Size_H;                       //1
    Data_Horn[cnt++] = Size_L;                       //2
    Data_Horn[cnt++] = 0x01;                         //3
    Data_Horn[cnt++] = 0x03; //unicode编码           //4
																										 
    Data_Horn[cnt++] = 0x00;                         //5
    Data_Horn[cnt++] = 0x5B;    //'['朗读的声音      //6
    Data_Horn[cnt++] = 0x00;                         //7
    Data_Horn[cnt++] = 0x76;    //'v'                //8
    Data_Horn[cnt++] = 0x00;                         //9
    Data_Horn[cnt++] = '9';                          //10
    Data_Horn[cnt++] = 0x00;                         //11
    Data_Horn[cnt++] = 0x5D;     //  ']'             //12
		

		
    for(int i = 0 ; i < sizeof(Out_put_Fin) ; i++)
      Data_Horn[i+cnt] = Out_put_Fin[i];             //13

    while(auwCnt < sizeof(Data_Horn)-1)
    {
      aubChecksum ^= Data_Horn[auwCnt];    //循环进行异或操作
      auwCnt++;
    }
    //这个时候的  aubChecksum  已经是异或校验最后的结果了
    Data_Horn[ cnt + 1 + sizeof(Out_put_Fin) - 1] = aubChecksum;  //最后的BCC校验位
		DrvUart3SendBuf(Data_Horn, sizeof(Data_Horn));
}

串口配置(波特率9600)

//串口A3
void uart3_init(uint32_t baudRate)
{

  const eUSCI_UART_ConfigV1 uartConfig =
      {
          EUSCI_A_UART_CLOCKSOURCE_SMCLK,                // SMCLK Clock Source
          312,                                            // BRDIV = 26
          8,                                             // UCxBRF = 0
          0,                                           // UCxBRS = 111
          EUSCI_A_UART_NO_PARITY,                        // No Parity
          EUSCI_A_UART_LSB_FIRST,                        // MSB First
          EUSCI_A_UART_ONE_STOP_BIT,                     // One stop bit
          EUSCI_A_UART_MODE,                             // UART mode
          EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION, // Oversampling
          EUSCI_A_UART_8_BIT_LEN                         // 8 bit data length
      };
  eusci_calcBaudDividers((eUSCI_UART_ConfigV1 *)&uartConfig, baudRate); //配置波特率

	//1.配置GPIO复用
		MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P9, GPIO_PIN6 | GPIO_PIN7, GPIO_PRIMARY_MODULE_FUNCTION);
	//初始化串口
		MAP_UART_initModule(EUSCI_A3_BASE, &uartConfig);
	//4.开启串口模块
		MAP_UART_enableModule(EUSCI_A3_BASE);
			  //5.开启串口相关中断
    UART_enableInterrupt(EUSCI_A3_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT);

    //6.开启串口端口中断
    Interrupt_enableInterrupt(INT_EUSCIA3);

}

void DrvUart3SendBuf(uint8_t *data, uint8_t len)
{
	uint8_t i;

	   for( i = 0 ; i < len; i++) 
	{
        while(!(UCA3IFG & UCTXIFG));  // 等待发送缓冲区就绪
        UCA3TXBUF = data[i];     // 将数据写入发送缓冲区
	}
}


//8.编写UART ISR
void EUSCIA3_IRQHandler(void)
{   
	 	uint8_t Res;
    uint32_t status = UART_getEnabledInterruptStatus(EUSCI_A3_BASE);

    if(status & EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG) //接收中断
    {
			 Res = MAP_UART_receiveData(EUSCI_A3_BASE);
		 UART_transmitData(EUSCI_A3_BASE,Res); //发送数据

    }

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值