模块比较简单,主要配置好串口,然后写好发送协议就可以了。芯片用的是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); //发送数据
}
}