前言
基于STM32F407实现与迪文串口屏T5L系列的串口通信,实现8位,16位,32位的数据读写。
PS:不包含完整程序,这里只说一下核心的代码。
一、串口需要的相关实现
数据类型
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
//32位int与8位char互转
typedef union
{
u32 intdata;
u8 chardata[4];
}int_char_unioin;
//16位short与8位char互转
typedef union
{
u16 shortdata;
u8 chardata[2];
}short_char_unioin;
需要自定义实现的变量和函数
buffer——串口收发缓冲区数组。
send_buffer()——向串口发送buffer数组。
delay_time——等待迪文屏返回数据的时间,例:5ms,迪文屏上OS的周期是20ms,读写过快可能出问题。(可能有更好的方法,一般情况下几ms还是可以容忍的。)
clear_usart()——清空串口缓冲区数组buffer,如用memset()将数组置零即可。
二、迪文屏读写
STM32与迪文屏的通信核心在于向迪文屏中定义的变量进行读写,迪文屏中的变量用一个16位数据表示其地址。迪文屏的用户可操作地址空间为0x1000-0xFFFF,我们要做的就是在这个区间内的一个地址上读写数据,这个地址指向的数据类型由DGUS II(迪文屏开发上位机软件)设置,详细内容可以查看迪文公司的应用开发指南。
2.1 向迪文屏写数据
向迪文屏上的16位地址写8位,16位,32位数据。
/************************************************************************************
* @name : write_to_dwin
* @brief : 串口4向迪文屏写数据
* @param : addr_h 变量地址高字节
addr_l 变量地址低字节
value_h 变量值高字节
value_l 变量值低字节
* @retval :
************************************************************************************/
void write_to_dwin(u8 addr_h, u8 addr_l, u8 value_h, u8 value_l)
{
u8 write_cmd[8] = {0x5A, 0xA5, 0x05, 0x82, addr_h, addr_l, value_h, value_l};
send_buffer(write_cmd, sizeof(write_cmd));
}
void writeu8_to_dwin(u16 addr, u8 data)
{
short_char_unioin m;
m.shortdata = addr;
write_to_dwin(m.chardata[1], m.chardata[0], 0x00, data);
}
void writeu16_to_dwin(u16 addr, u16 data)
{
short_char_unioin m;
m.shortdata = addr;
short_char_unioin n;
n.shortdata = data;
write_to_dwin(m.chardata[1], m.chardata[0], n.chardata[1], n.chardata[0]);
}
void writeu32_to_dwin(u16 addr, u32 data)
{
short_char_unioin m;
m.shortdata = addr;
int_char_unioin n;
n.intdata = data;
u8 write_cmd[10] = {0x5A, 0xA5, 0x07, 0x82, m.chardata[1], m.chardata[0], n.chardata[3], n.chardata[2], n.chardata[1], n.chardata[0]};
send_buffer(write_cmd, sizeof(write_cmd));
}
2.2 从迪文屏读取数据
从迪文屏上的16位地址上读取8位,16位,32位数据。
/************************************************************************************
* @name : read_from_dwin
* @brief : 串口4从迪文屏读数据
* @param : addr_h 变量地址高字节
addr_l 变量地址低字节
size 数据大小(单位:字/两字节/16位)
* @retval :
************************************************************************************/
void read_from_dwin(u8 addr_h, u8 addr_l, u8 size)
{
clear_usart();
u8 read_cmd[7] = {0x5A, 0xA5, 0x04, 0x83, addr_h, addr_l, size};
send_buffer(read_cmd, sizeof(read_cmd));
}
u8 readu8_from_dwin(u16 addr)
{
u8 data = 0;
short_char_unioin m;
m.shortdata = addr;
read_from_dwin(m.chardata[1], m.chardata[0], 0x01);
delay_xms(delay_time);
if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查
{
if(buffer[4] == m.chardata[1] && buffer[5] == m.chardata[0]) //地址检查
{
data = buffer[8];
}
}
clear_usart();
return data;
}
u16 readu16_from_dwin(u16 addr)
{
u16 data = 0;
short_char_unioin m;
short_char_unioin n;
m.shortdata = addr;
read_from_dwin(m.chardata[1], m.chardata[0], 0x01);
delay_xms(delay_time);
if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查
{
if(buffer[4] == m.chardata[1] && buffer[5] == m.chardata[0]) //地址检查
{
n.chardata[1] = buffer[7];
n.chardata[0] = buffer[8];
data = n.shortdata;
}
}
clear_usart();
return data;
}
u32 readu32_from_dwin(u16 addr)
{
u32 data = 0;
short_char_unioin m;
m.shortdata = addr;
int_char_unioin n;
read_from_dwin(m.chardata[1], m.chardata[0], 0x02);
delay_xms(delay_time);
if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查
{
if(buffer[4] == [1] && buffer[5] == m.chardata[0]) //地址检查
{
n.chardata[3] = buffer[7];
n.chardata[2] = buffer[8];
n.chardata[1] = buffer[9];
n.chardata[0] = buffer[10];
data = n.intdata;
}
}
clear_usart();
return data;
}
前言
基于STM32F407实现与迪文串口屏T5L系列的串口通信,实现8位,16位,32位的数据读写。
PS:不包含完整程序,这里只说一下核心的代码。
一、串口需要的相关实现
数据类型
#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int
//32位int与8位char互转
typedef union
{
u32 intdata;
u8 chardata[4];
}int_char_unioin;
//16位short与8位char互转
typedef union
{
u16 shortdata;
u8 chardata[2];
}short_char_unioin;
需要自定义实现的变量和函数
buffer——串口收发缓冲区数组。
send_buffer()——向串口发送buffer数组。
delay_time——等待迪文屏返回数据的时间,例:5ms,迪文屏上OS的周期是20ms,读写过快可能出问题。(可能有更好的方法,一般情况下几ms还是可以容忍的。)
clear_usart()——清空串口缓冲区数组buffer,如用memset()将数组置零即可。
二、迪文屏读写
STM32与迪文屏的通信核心在于向迪文屏中定义的变量进行读写,迪文屏中的变量用一个16位数据表示其地址。迪文屏的用户可操作地址空间为0x1000-0xFFFF,我们要做的就是在这个区间内的一个地址上读写数据,这个地址指向的数据类型由DGUS II(迪文屏开发上位机软件)设置,详细内容可以查看迪文公司的应用开发指南。
2.1 向迪文屏写数据
向迪文屏上的16位地址写8位,16位,32位数据。
/************************************************************************************
* @name : write_to_dwin
* @brief : 串口4向迪文屏写数据
* @param : addr_h 变量地址高字节
addr_l 变量地址低字节
value_h 变量值高字节
value_l 变量值低字节
* @retval :
************************************************************************************/
void write_to_dwin(u8 addr_h, u8 addr_l, u8 value_h, u8 value_l)
{
u8 write_cmd[8] = {0x5A, 0xA5, 0x05, 0x82, addr_h, addr_l, value_h, value_l};
send_buffer(write_cmd, sizeof(write_cmd));
}
void writeu8_to_dwin(u16 addr, u8 data)
{
short_char_unioin m;
m.shortdata = addr;
write_to_dwin(m.chardata[1], m.chardata[0], 0x00, data);
}
void writeu16_to_dwin(u16 addr, u16 data)
{
short_char_unioin m;
m.shortdata = addr;
short_char_unioin n;
n.shortdata = data;
write_to_dwin(m.chardata[1], m.chardata[0], n.chardata[1], n.chardata[0]);
}
void writeu32_to_dwin(u16 addr, u32 data)
{
short_char_unioin m;
m.shortdata = addr;
int_char_unioin n;
n.intdata = data;
u8 write_cmd[10] = {0x5A, 0xA5, 0x07, 0x82, m.chardata[1], m.chardata[0], n.chardata[3], n.chardata[2], n.chardata[1], n.chardata[0]};
send_buffer(write_cmd, sizeof(write_cmd));
}
2.2 从迪文屏读取数据
从迪文屏上的16位地址上读取8位,16位,32位数据。
/************************************************************************************
* @name : read_from_dwin
* @brief : 串口4从迪文屏读数据
* @param : addr_h 变量地址高字节
addr_l 变量地址低字节
size 数据大小(单位:字/两字节/16位)
* @retval :
************************************************************************************/
void read_from_dwin(u8 addr_h, u8 addr_l, u8 size)
{
clear_usart();
u8 read_cmd[7] = {0x5A, 0xA5, 0x04, 0x83, addr_h, addr_l, size};
send_buffer(read_cmd, sizeof(read_cmd));
}
u8 readu8_from_dwin(u16 addr)
{
u8 data = 0;
short_char_unioin m;
m.shortdata = addr;
read_from_dwin(m.chardata[1], m.chardata[0], 0x01);
delay_xms(delay_time);
if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查
{
if(buffer[4] == m.chardata[1] && buffer[5] == m.chardata[0]) //地址检查
{
data = buffer[8];
}
}
clear_usart();
return data;
}
u16 readu16_from_dwin(u16 addr)
{
u16 data = 0;
short_char_unioin m;
short_char_unioin n;
m.shortdata = addr;
read_from_dwin(m.chardata[1], m.chardata[0], 0x01);
delay_xms(delay_time);
if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查
{
if(buffer[4] == m.chardata[1] && buffer[5] == m.chardata[0]) //地址检查
{
n.chardata[1] = buffer[7];
n.chardata[0] = buffer[8];
data = n.shortdata;
}
}
clear_usart();
return data;
}
u32 readu32_from_dwin(u16 addr)
{
u32 data = 0;
short_char_unioin m;
m.shortdata = addr;
int_char_unioin n;
read_from_dwin(m.chardata[1], m.chardata[0], 0x02);
delay_xms(delay_time);
if (buffer[0] == 0x5A && buffer[1] == 0xA5 && buffer[3] == 0x83) //返回数据检查
{
if(buffer[4] == [1] && buffer[5] == m.chardata[0]) //地址检查
{
n.chardata[3] = buffer[7];
n.chardata[2] = buffer[8];
n.chardata[1] = buffer[9];
n.chardata[0] = buffer[10];
data = n.intdata;
}
}
clear_usart();
return data;
}
1
举报