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;       //高字节填0x00unicode_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,就是抹掉高四位的1110Middle_byte = Middle_byte % 64;  //中位取余64,就是抹掉高两位的10Low_byte = Low_byte % 64;  //低位取余64,就是抹掉高两位的10unsigned 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;                         //0Data_Horn[cnt++] = Size_H;                       //1Data_Horn[cnt++] = Size_L;                       //2Data_Horn[cnt++] = 0x01;                         //3Data_Horn[cnt++] = 0x03; //unicode编码           //4Data_Horn[cnt++] = 0x00;                         //5Data_Horn[cnt++] = 0x5B;    //'['朗读的声音      //6Data_Horn[cnt++] = 0x00;                         //7Data_Horn[cnt++] = 0x76;    //'v'                //8Data_Horn[cnt++] = 0x00;                         //9Data_Horn[cnt++] = '9';                          //10Data_Horn[cnt++] = 0x00;                         //11Data_Horn[cnt++] = 0x5D;     //  ']'             //12for(int i = 0 ; i < sizeof(Out_put_Fin) ; i++)Data_Horn[i+cnt] = Out_put_Fin[i];             //13while(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 Source312,                                            // BRDIV = 268,                                             // UCxBRF = 00,                                           // UCxBRS = 111EUSCI_A_UART_NO_PARITY,                        // No ParityEUSCI_A_UART_LSB_FIRST,                        // MSB FirstEUSCI_A_UART_ONE_STOP_BIT,                     // One stop bitEUSCI_A_UART_MODE,                             // UART modeEUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION, // OversamplingEUSCI_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); //发送数据}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部