——来自迪文开发者论坛
本期为大家推送迪文开发者论坛获奖开源案例——AI智能交互新方案:基于T5L的AI DeepSeek大模型。该方案通过T5L串口与AI模块开发板进行数据交互,支持用户与屏幕智能实时对话交互,并同步展示动态表情,构建了具有情感化交互能力的AI终端解决新方案。
【演示视频】
完整开发资料含迪文屏DGUS工程资料与C51代码,获取方式:
前往迪文开发者论坛获取:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=12235
微信公众号中回复“AI DeepSeek大模型”获取。
【UI素材展示】
【C51工程设计】
(1)屏幕主要程序如下:
#defineMAX_PACKETS 20//预设最大包数量
typedefstruct {
unsigned char *indata;//数据指针
int length;//包长度
} Packet;
int split_packets(constunsigned char *indata, int data_len, Packet *packets, int *packet_count)
{
int positions[MAX_PACKETS] = {0};
int count = 0;
int i;
//查找所有包头位置
for ( i = 0; i <= data_len - 2&& count < MAX_PACKETS; )
{
if (indata == 0x5A &&indata[i+1] == 0xA5) {
positions[count++] = i;
i += 2;//跳过包头
} else {
i++;
}
}
if (count == 0) return -1;
*packet_count = count;
for ( i = 0; i < count; i++) {
int start = positions;
int end = (i < count-1) ?positions[i+1] : data_len;
packets.indata = indata + start;
packets.length = end - start;
}
return 0;
}
#defineOutGbkLen 256
unsignedchar HuanBuffdata[1024];
voidHandleRecData(unsigned char *inputdata,unsigned char len){
char emotions=0;
char emoarr[2];
memset(HuanBuffdata,0,sizeof(HuanBuffdata));
memcpy(HuanBuffdata,inputdata,len);
switch(HuanBuffdata[2]){
case 1://表情
if(HuanBuffdata[3]>20)
emotions=0;
else
emotions=HuanBuffdata[3];
emoarr[0]=0;
emoarr[1]=emotions+1;
write_dgusii_vp(0x3000,emoarr,1);
break;
case 2://网络状态
break;
case 3://通知消息
write_dgusii_vp(0x2000,&HuanBuffdata[3],strlen(&HuanBuffdata[3])/2);
break;
case 4://聊天信息
write_dgusii_vp(0x4000,&HuanBuffdata[3],strlen(&HuanBuffdata[3])/2);
break;
}
}
voidDispDataHandle(void){
int i ;
int data_len = uart4_rx_count;
Packet packets[MAX_PACKETS];//栈内存分配
int packet_count;
if (split_packets(Uart4_Rx, data_len,packets, &packet_count) == 0) {
for ( i = 0; i < packet_count; i++){
HandleRecData(packets.indata,packets.length);
}
}
}
(2)AI模块开发板程序如下:
voidXINGZHI_1_54_TFT_LcdDisplay::SetChatMessage(const char* role, const char* content) {
DisplayLockGuard lock(this);
if(chat_message_label_ == nullptr) {
return;
}
lv_label_set_text(chat_message_label_, content);
char senddata[10];
int i=0;
memset(senddata,0,sizeof(senddata));
senddata[i++]=0x5a;
senddata[i++]=0xa5;
senddata[i++]=0x4;
uart_write_bytes(USART_UX,senddata,i);
uint16_t unicode_string[256];//足够大的缓冲区
memset(unicode_string,0,sizeof(unicode_string));
uint32_tretlen=utf8_to_unicode((const uint8_t*)content,strlen(content),unicode_string);
uint8_t gbk_string[256];//足够大的缓冲区
UnicodeToGbk(unicode_string,gbk_string,sizeof(gbk_string));
uart_write_bytes(USART_UX,gbk_string,strlen((char *)gbk_string));
}
voidXINGZHI_1_54_TFT_LcdDisplay::SetStatus(const char* status) {
DisplayLockGuard lock(this);
if (status_label_ ==nullptr) {
return;
}
lv_label_set_text(status_label_, status);
lv_obj_clear_flag(status_label_, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(notification_label_, LV_OBJ_FLAG_HIDDEN);
char senddata[10];int i=0;
memset(senddata,0,sizeof(senddata));
senddata[i++]=0x5a;
senddata[i++]=0xa5;
senddata[i++]=0x3;
uart_write_bytes(USART_UX,senddata,i);
uint16_t unicode_string[256];//足够大的缓冲区
memset(unicode_string,0,sizeof(unicode_string));
uint32_tretlen=utf8_to_unicode((const uint8_t*)status,strlen(status),unicode_string);
uint8_t gbk_string[256];//足够大的缓冲区
UnicodeToGbk(unicode_string,gbk_string,sizeof(gbk_string));
uart_write_bytes(USART_UX,gbk_string,strlen((char *)gbk_string));
}
上一篇:无
下一篇:DGUS素材库上线,欢迎使用!