LED 多行显示和播放语音函数 - LED_MuiltLineDisAndPlayVoice
func LED_MuiltLineDisAndPlayVoice(TextContext *[]TEXT_CONTEXT, VoiceText string) {
BuffPos := 0
Buff := make([]byte, 255) //分配缓冲数组
var CRC uint16
TextContextNum := byte(len(*TextContext))
/*0.填充命令参数*/
Buff[BuffPos] = 0x00 //显示屏地址
BuffPos++
Buff[BuffPos] = 0x64 //固定参数
BuffPos++
Buff[BuffPos] = 0xFF //包序列
BuffPos++
Buff[BuffPos] = 0xFF //包序列
BuffPos++
Buff[BuffPos] = 0x6E //指令
BuffPos++
Buff[BuffPos] = 0x00 //数据长度
BuffPos++
/*1.填充文本参数*/
Buff[BuffPos] = 0x00 //文本类型,1为广告语,0为临时信息
BuffPos++
Buff[BuffPos] = TextContextNum //文本数量
BuffPos++
for i := 0; i < int(TextContextNum); i++ {
Buff[BuffPos] = (*TextContext)[i].LID //行号
BuffPos++
Buff[BuffPos] = (*TextContext)[i].DisMode //显示模式
BuffPos++
Buff[BuffPos] = 0x01 //显示速度
BuffPos++
Buff[BuffPos] = (*TextContext)[i].DelayTime //停留时间
BuffPos++
Buff[BuffPos] = 0x00 //显示次数
BuffPos++
Buff[BuffPos] = 0xFF //32位字体颜色 红色分量
BuffPos++
Buff[BuffPos] = 0x00 //32位字体颜色 绿色分量
BuffPos++
Buff[BuffPos] = 0x00 //32位字体颜色 蓝色分量
BuffPos++
Buff[BuffPos] = 0x00 //32位字体颜色 保留字节
TextBuff := []byte((*TextContext)[i].Text) //把string 类型字符串 读取到字节数组里面.注意字符串编码必须是GB2312 WINDOWS代码页为936
if (BuffPos + len(TextBuff)) >= 255 { //整包长度不能大于255
return
}
Buff[BuffPos] = byte(len(TextBuff)) //文本长度
BuffPos++
for z := 0; z < len(TextBuff); z++ { //复制文本到缓冲
Buff[BuffPos] = TextBuff[z]
BuffPos++
}
if i == (int(TextContextNum) - 1) { //添加文本分隔符
Buff[BuffPos] = 0x00
} else {
Buff[BuffPos] = 0x0D
}
BuffPos++
}
/*2.填充语音参数*/
VoiceTextBuff := []byte(VoiceText) //把string 类型字符串 读取到字节数组里面.注意字符串编码必须是GB2312 WINDOWS代码页为936
if len(VoiceTextBuff) > 0 {
Buff[BuffPos] = 0x0A //语音分隔符
BuffPos++
Buff[BuffPos] = byte(len(VoiceTextBuff)) //语音文本长度
BuffPos++
if (BuffPos + len(VoiceTextBuff)) >= 255 { //长度检查
return
}
for z := 0; z < len(VoiceTextBuff); z++ { //复制文本到缓冲
Buff[BuffPos] = VoiceTextBuff[z]
BuffPos++
}
} else {
Buff[BuffPos] = 0x00
BuffPos++
}
Buff[BuffPos] = 0x00
BuffPos++
Buff[5] = byte(BuffPos - 6) //重新修改数据长度
/*3.计算校验码*/
CRC = MB_CRC16(&Buff, BuffPos)
Buff[BuffPos] = byte(CRC & 0xff) //校验码低字节
BuffPos++
Buff[BuffPos] = byte((CRC >> 8) & 0xff) //校验码高字节
BuffPos++
/*4.最后在这里把Buff的内容发送出去,长度为BuffPos */
//....
}
该函数用于控制 LED 显示屏,实现多行文本显示和语音播放功能。函数接收文本内容和语音文本作为参数,并生成一个包含所有必要信息的字节数组,该数组可用于与 LED 显示屏进行通信。
参数:
TextContext: 包含文本信息的数组,每个元素代表一行文本。VoiceText: 语音文本,如果为空则不播放语音。
返回值:
无
函数流程:
- 填充命令参数:包括显示屏地址、固定参数、包序列、指令和数据长度。
- 填充文本参数:包括文本类型、文本数量、文本内容、显示模式、显示速度、停留时间、显示次数和字体颜色。
- 填充语音参数:包括语音分隔符、语音文本长度和语音文本内容。
- 计算校验码:使用 MB_CRC16 函数计算校验码,并将其添加到字节数组中。
- 发送数据:将生成好的字节数组发送到 LED 显示屏,实现文本显示和语音播放。
注意:
- 文本编码必须是 GB2312,WINDOWS 代码页为 936。
- 字节数组长度不能超过 255。
- MB_CRC16 函数是一个用于计算 CRC 校验码的函数,需要根据实际情况进行实现。
应用场景:
- LED 显示屏广告播放
- LED 显示屏信息发布
- LED 显示屏语音提示
代码示例:
// 假设已经定义了 TEXT_CONTEXT 结构体和 MB_CRC16 函数
var TextContext []TEXT_CONTEXT
// 初始化文本内容
TextContext = append(TextContext, TEXT_CONTEXT{
LID: 1,
DisMode: 0,
DelayTime: 5,
Text: "欢迎光临!",
})
TextContext = append(TextContext, TEXT_CONTEXT{
LID: 2,
DisMode: 1,
DelayTime: 3,
Text: "本店今日特价!",
})
// 设置语音文本
VoiceText := "欢迎光临!"
// 调用 LED_MuiltLineDisAndPlayVoice 函数
LED_MuiltLineDisAndPlayVoice(&TextContext, VoiceText)
原文地址: https://www.cveoy.top/t/topic/nlWU 著作权归作者所有。请勿转载和采集!