迪文滑块调试与stm32对应串口函数的写法

迪文屏型号 DMT80480T050_06WTC
用stm32f103zet6 最小系统板

在这里插入图片描述
想做一个这样的界面,右边是个滑块0-500,滑块每次变化,数据上传给串口。记录一下过程。
总体遇到了三个问题:
1、网上的例程一般是收到一个字节发送一个字节。此例需要收到9个字节再发送。
2、迪文屏.ICO的编号要按照文件大小/256的个数,往后排,否则存储区重叠了就不显示了,这个问题读了说明书才知道,SD卡反复烧录了200多次都不知道为什么,还以为是图片格式不对。。。。。真坑啊,能不能把开发工具做得再贴心一点啊。
在这里插入图片描述
3、串口屏默认不主动返回数据,需要用UltraEdit修改CFG配置文件,下载时在DWIN_SET文件夹下加入修改后的CFG

1、串口接收N个字节
参考了两个人的
https://blog.csdn.net/android_lover2014/article/details/78220163

https://blog.csdn.net/zyxhangiian123456789/article/details/79463162?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163084969116780271556433%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163084969116780271556433&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-1-79463162.first_rank_v2_pc_rank_v29&utm_term=stm32%E4%B8%B2%E5%8F%A3%E6%8E%A5%E5%8F%97%E5%A4%9A%E4%B8%AA%E5%AD%97%E8%8A%82&spm=1018.2226.3001.4187

1.1、要在.c文件全局添加个定长接收字符数组

#define USART_MAX_RECV_LEN 9
uint8_t DEBUG_USART_RX_BUF[USART_MAX_RECV_LEN];
char DEBUG_USART_RX_BUF_char[USART_MAX_RECV_LEN];
uint8_t DEBUG_RxCounter;
uint16_t DEBUG_ReceiveState;

1.2、USART_Config2也要修改

。。。
/--------------------------------------------------------/
// 串口中断优先级配置
NVIC_Configuration2();

// 【!!!使能帧接收中断】
USART_ITConfig(DEBUG_USARTx_2, USART_IT_IDLE, ENABLE);
// 使能串口接收中断
USART_ITConfig(DEBUG_USARTx_2, USART_IT_RXNE, ENABLE);

/--------------------------------------------------------/
。。。

1.3、在中断函数中

// 串口中断服务函数
void DEBUG_USART_IRQHandler_2(void)
{
uint8_t Clear = Clear; //这种定义方法,用来消除编译器的“没有用到”提星
char sliderchar[4];
// 接收一个字节
if(USART_GetITStatus(DEBUG_USARTx_2,USART_IT_RXNE)!=RESET)
{
DEBUG_USART_RX_BUF_char[DEBUG_RxCounter] = DEBUG_USARTx_2->DR;
DEBUG_USART_RX_BUF[DEBUG_RxCounter++] = DEBUG_USARTx_2->DR;
}
// 接收到一帧数据
else if(USART_GetITStatus(DEBUG_USARTx_2,USART_IT_IDLE)!=RESET)
{
DEBUG_RxCounter = 0;
Clear = DEBUG_USARTx_2->SR;
Clear = DEBUG_USARTx_2->DR; //读取DR寄存器,先读SR后读DR是为了清楚IDLE中断标志
DEBUG_ReceiveState = 1; //标记接收到一帧数据

	// 判断变量 VAR1_HI
	if(DEBUG_USART_RX_BUF[4]==VAR1_HI &&DEBUG_USART_RX_BUF[5]==VAR1_LO)
	{
		// 开关
		if(DEBUG_USART_RX_BUF[8]==0x01) //5A A5 06 83 10 02 01 00 01 
		{
			Usart_SendoneHex_char(DEBUG_USARTx,"01");
			LED1_ON;
		}
		else if(DEBUG_USART_RX_BUF[8]==0x00) //5A A5 06 83 10 03 01 00 00 
		{
			Usart_SendoneHex_char(DEBUG_USARTx,"00");
			LED1_OFF;
		}
	}
	// 判断变量 VAR2_HI
	else if(DEBUG_USART_RX_BUF[4]==VAR2_HI &&DEBUG_USART_RX_BUF[5]==VAR2_LO)
	{
		// 发送原字符
		Usart_SendString_Have0NotStop(DEBUG_USARTx,DEBUG_USART_RX_BUF_char,USART_MAX_RECV_LEN);
		LED1_ON;
	}
}

}

这样就能发送完整字符。

2.1、在迪文DGUS中 裁剪合适的背景图片,画一个滑块的轨迹;再添加控件
在这里插入图片描述
这里 滑动刻度指示蓝色区域要比拖动调节黄色区域往右上方移动,因为图标区域其实限制的是图标图片的左上角的移动范围,所以下边会出来一段儿,黄色区域滑块的印记应该正对图标的中心,所以要如图所示错动一点距离。
2.2、滑动刻度指示,拖动调节,数据变量显示要共享一个变量地址。记得自己添加的图标ICO文件大小要计算一下。(大小/256)不能覆盖其他的图标文件。
在这里插入图片描述
这里26号是 261/256 = 1.0195 所以27.ICO就不应该存在,同理34也不应该有,除非33号大小小于256。
之后连接屏幕与stm32
在这里插入图片描述
在这里插入图片描述
2.3、因为在usart2中,把接收到的数据都发给了usart1所以 stm32 A9 A10 连接电脑,所以在串口助手上看屏幕给stm32发了什么。
在这里插入图片描述
2.4、调试过程中,要用到字符串转16进制字符串的函数,自己写比较费劲
void Usart_SendoneHex_char( USART_TypeDef * pUSARTx, char *pAscii)
{
uint8_t pHex = 0;
char Nibble[2] = {0};
int j=0;

Nibble[0] = *pAscii;
Nibble[1] = *(pAscii+1);
for (j = 0; j < 2; j ++)
{

if (Nibble[j] <= 'F' && Nibble[j] >= 'A')
	Nibble[j] = Nibble[j] - 'A' + 10;
else if (Nibble[j] <= 'f' && Nibble[j] >= 'a')
	Nibble[j] = Nibble[j] - 'a' + 10;
else if (Nibble[j] >= '0' && Nibble[j] <= '9')
	Nibble [j] = Nibble[j] - '0';
else
	return;//Nibble[j] = Nibble[j] - 'a' + 10;
}
pHex = Nibble[0] << 4;    // Set the high nibble
pHex |= Nibble[1];    //Set the low nibble
Usart_SendByte( pUSARTx, pHex );

/* 等待发送完成 /
while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
{}
}
/
**************** 发送字符串 **********************/
void Usart_SendHex( USART_TypeDef * pUSARTx, char *pAscii,int nLen )
{
uint8_t pHex = 0;
int nHexLen = nLen / 2;
char Nibble[2] = {0};
int i = 0;
int j = 0;
if (nLen%2)
{
return;
}

for (i = 0; i < nHexLen; i ++)
{
Nibble[0] = *pAscii ++;
Nibble[1] = *pAscii ++;
for (j = 0; j < 2; j ++)
{

	if (Nibble[j] <= 'F' && Nibble[j] >= 'A')
		Nibble[j] = Nibble[j] - 'A' + 10;
	else if (Nibble[j] <= 'f' && Nibble[j] >= 'a')
		Nibble[j] = Nibble[j] - 'a' + 10;
	else if (Nibble[j] >= '0' && Nibble[j] <= '9')
		Nibble [j] = Nibble[j] - '0';
	else
		return;//Nibble[j] = Nibble[j] - 'a' + 10;
	}
	pHex = Nibble[0] << 4;    // Set the high nibble
	pHex |= Nibble[1];    //Set the low nibble
Usart_SendByte( pUSARTx, pHex );
}

/* 等待发送完成 */
while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
{}
}

3.1、串口屏默认数据上传是关闭的,需要使用UltraEdit改一下
这样屏幕可以实时上传数据给板子,
在这里插入图片描述
在这里插入图片描述
但发现,有的时候加入T5UID2_80480_fanhuishuju.CFG 烧录失败,所以用了一次T5UID2_80480_fanhuishuju.CFG之后,最好删除掉,否则ICO文件,动画文件,可能会失效。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胸毛男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值