淘晶池串口屏操作指令集
那我们就来谈一谈串口屏与STM32F4嵌入式板子的通信
第一,串口屏传输数据给F4板子
这时,我们就该来谈一谈prints函数和printh函数的用法
prints att,length
att:变量名称
length:长度(0为自动长度)
printh hex
hex:需要发送的字符的16进制字符串表达式(每个字节之间用空格隔开)
sprintf(msg, "funct0.b9.txt=\"-%d%s\"", items[opt].step, items[opt].unit);
含sprintf( )的语句都是从单片机发送信息到串口屏并修改串口屏上对应值的代码段,其中func0.b9.txt指的是串口屏上位机程序中func0页面b9模块的文本txt值,也就是说这段代码将串口屏所显示的func0.b9.txt值用“-%d%s”覆盖,其中%d和%s分别是items[opt].step,items[opt].unit的值。
串口屏-单片机的交互流程是:在串口屏上用你配置的虚拟键盘输入数据 -> 输入数据以字符形式从串口屏传给单片机 -> 单片机内部存储该数据 -> 单片机将数据发送回串口屏并在屏幕上进行显示。
将数据发送回串口屏只是为了便于观察和调试,实际上是利用串口屏为单片机内部变量赋新值。
prints函数具体用法:
这里参考一下SpeedyDashie博主:
使用prints函数发送定长为2的字符串,并规定第一个字符为操作位,第二个字符为具体操作值,这样在代码中也比较便于处理。
其中lenth部分写0则代表发送整个完整的字符串,不过由于代码是处理定长数据的,为了防止溢出,建议仍对lenth写2,即发送2字节。注意所发送数据需要带“ ”号,否则会被当作数值类型发送。
对于从单片机回传数据至串口屏,数据的结束符为“0XFF 0XFF 0XFF”三个字节。
示例1:发送字符串
假设要发送字符串"hello",可以这样用prints函数:
prints"hello",5
这里"hello"是要发送的字符串,5表示字符串的长度(5个字符)。串口屏会通过串口将5个字符发送出去。
示例2:发送变量值
如果有变量temp存储了温度值,要将其发送出去,可以这样使用:
prints temp.val,2
假设temp.val的值为25(十进制),那么串口屏会发送两个字节的数据,即19 00(假设以小端格式发送16位数值)。
示例3:结合帧头和帧尾发送数据
在一些通信协议中,可能需要在数据前后添加帧头和帧尾标识。例如,发送一个以0x55
开头,以0xff 0xff 0xff
结尾的数据帧,其中包含一个变量data
的值,可以这样编写:
printh 55 //发送帧头
prints data.val,2 //发送data变量的值,假设是16位数据
printh ff ff ff //发送帧尾
这样串口屏会先发送0x55作为帧头,然后发送data.val的值,最后发送三个0xff作为帧尾
注意事项
-
参数格式:在使用prints函数时,参数之间必须用逗号分隔,且参数的格式要正确。例如,发送字符串时,字符串需要用双引号括起来;发送变量时,要使用变量的正确引用方式。
-
数据类型处理:如果发送的是数值型变量,需要注意其数据类型(如8位、16位、32位等)以及在串口传输中的字节顺序(大端或小端)。
-
帧结构设计:在设计数据帧时,要根据实际的通信需求合理安排帧头、数据内容和帧尾,确保接收端能够正确解析出完整的数据帧。
#include "usart.h"#define RX_BUFFER_SIZE 256 // 接收缓冲区大小
uint8_t RxBuffer[RX_BUFFER_SIZE]; // 接收缓冲区
uint8_t aRxBuffer; // 中间变量,用于存储接收到的一个字节
uint16_t Uart_Rx_Cnt = 0; // 接收计数// 在主函数中初始化串口并开启中断接收
int main(void)
{HAL_Init();SystemClock_Config();MX_USART1_UART_Init(); // 初始化串口1,假设与串口屏连接的是串口1HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); // 开启中断接收while (1){// 主循环中可以处理其他任务}
}// 中断接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{// 检查是否是串口1的中断if (huart->Instance == USART1){if (Uart_Rx_Cnt >= RX_BUFFER_SIZE - 1) // 如果接收缓冲区即将溢出{Uart_Rx_Cnt = 0; // 重置计数memset(RxBuffer, 0x00, sizeof(RxBuffer)); // 清空缓冲区HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10, 0xFFFF); // 发送提示信息}else{RxBuffer[Uart_Rx_Cnt++] = aRxBuffer; // 将接收到的字节存入缓冲区// 判断是否接收到回车换行符(假设串口屏发送数据以回车换行符结束)if ((RxBuffer[Uart_Rx_Cnt - 1] == 0x0A) && (RxBuffer[Uart_Rx_Cnt - 2] == 0x0D)){// 在这里对接收到的数据进行处理DataProcessing(RxBuffer, Uart_Rx_Cnt - 2); // 减去回车换行符的两个字节Uart_Rx_Cnt = 0; // 重置计数memset(RxBuffer, 0x00, sizeof(RxBuffer)); // 清空缓冲区}}HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); // 继续接收下一个字节}
}// 数据处理函数
void DataProcessing(uint8_t *data, uint16_t length)
{// 根据实际需求对接收到的数据进行处理// 例如,判断数据内容并执行相应操作if (length >= 1){switch (data[0]){case 'A':// 执行操作Abreak;case 'B':// 执行操作Bbreak;default:// 默认操作break;}}
}
第二,F4传输数据给串口屏
#include "stdio.h"
void Uart_printf(UART_HandleTypeDef *huart,char *format, ...)
{
char buf[512];
memset(buf,0x00,sizeof(buf));
va_list ap;
va_start(ap, format);
uint16_t len = vsnprintf((char *)buf, sizeof(buf), (char *)format, ap);
va_end(ap);
HAL_UART_Transmit(huart,(uint8_t *)buf,len,1000);
}
Uart_printf(&huart1,"t0.txt=\"%.3f\"\xff\xff\xff",t0);