usart hmi(串口屏)使用小总结

1.刚到手的X5系列的串口屏,下载程序后黑屏

   找了挺久的原因,最后发现是其中一张图片太大导致的黑屏。(图片为2M)

   解决方法:打开官方例程,生成.tft文件(在串口屏软件生成:文件--输出生产文件),生成的文件如下:

                                                                           

  然后将生成的.tft文件 拷贝到SD卡中,给串口屏上电,利用SD卡将.tft文件下载到串口屏,下载完成后断电,拔出SD卡,

  重新给串口屏上电,串口屏恢复正常。重新编辑串口屏工程,更换图片,黑屏问题解决。

注:串口屏工程里的图片不能太大,太大会导致黑屏。

 

2.单片机处理串口屏发送的数据

   注:串口屏发送数据时:低位在前,高位在后。

 

3.串口屏的运算

   注:串口屏不支持运算优先级,运算是从左向

<think>嗯,用户想用USARTHMI串口开发一个三子棋游戏。首先,我需要理清楚整个项目的流程。三子棋游戏通常需要显示棋盘、处理玩家输入、判断胜负等功能。结合串口的话,界面设计是关键,因为HMI串口是通过上位机软件设计界面,然后通过串口通信发送指令来控制显示内容。 首先,用户需要了解HMI串口的开发步骤。根据引用[1]和[2],HMI的上位软件用来设计界面,比如按钮、文本框等。然后,STM32通过USART发送指令给屏幕,比如更新某个控件的文本或属性。例如,sprintf函数可以将数据格式化为字符串发送,这在引用[2]中提到过,用来实时更新显示的数据。 接下来,游戏逻辑部分。三子棋需要棋盘的状态存储,玩家和电脑(或另一个玩家)的轮流落子。每次落子后,需要更新屏幕上的显示,比如在对应的格子显示X或O。同时,每次操作后要检查是否有胜负,或者是否平局。 可能的问题点在于如何将触摸的输入传输到STM32。HMI串口的触摸事件会通过串口发送数据给单片机,所以STM32需要解析这些数据,确定是哪个位置的按钮被按下,然后更新游戏状态。例如,每个棋盘格子可以对应一个按钮控件,当触摸时发送特定的指令,STM32接收后处理坐标,转换为棋盘的行列索引。 然后,游戏状态的更新需要同步到串口。每次落子后,STM32发送指令更新对应按钮的文本,显示X或O。同时,胜负判断后可能需要弹出提示信息,比如用另一个页面显示结果,或者直接更新某个文本框的内容。 还需要考虑游戏的重置功能,比如游戏结束后,如何清空棋盘,重新开始。这可以通过发送复位指令给串口,或者重新加载页面来实现。 代码结构方面,主循环中需要不断检测串口接收的数据,解析触摸事件,处理游戏逻辑,然后发送更新指令到屏幕。同时,ADC或者传感器数据可能不需要,但sprintf的使用在更新显示时是必须的,比如将行列位置转化为对应的控件名称。 可能遇到的挑战是串口通信的稳定性和响应速度,尤其是在频繁更新界面时。需要确保指令的正确格式,避免通信错误。此外,界面布局和控件命名需要与代码中的处理逻辑严格对应,否则会导致更新错误的位置。 总结下来,步骤应该是:1. 设计界面,创建按钮和显示控件;2. STM32初始化USART,配置中断接收;3. 解析触摸事件,更新游戏状态;4. 发送指令更新屏幕显示;5. 判断游戏结果并处理。需要参考引用中的示例,正确使用sprintf生成指令字符串,并处理通信协议。</think>### 基于USARTHMI串口的三子棋开发步骤 #### 1. **界面设计与控件布局** - **使用USART HMI上位软件**:设计游戏界面,包括: - 3x3的按钮控件(`btn1`~`btn9`)表示棋盘格子 - 文本框显示当前玩家(如`t0.txt`) - 胜负提示框(如`t1.txt`) - 复位按钮(`btn_reset`) - **控件属性绑定**:为每个按钮设置触摸事件返回指令(例如`click btn1,0`表示第1格被点击)[^1]。 #### 2. **STM32与串口通信协议** - **指令格式**:通过USART发送HMI协议指令,例如更新控件文本: ```c // 更新第1格显示为"X" sprintf(buf, "btn1.txt=\"X\"\xff\xff\xff"); HAL_UART_Transmit(&huart1, buf, strlen(buf), 100); ``` 引用[2]中提到的`sprintf`函数用于格式化字符串,末尾`\xff\xff\xff`是协议结束符[^2]。 #### 3. **核心代码实现** ```c // 定义棋盘状态 char board[9] = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '}; // 解析触摸事件(示例) void parse_touch(uint8_t *data) { if(strstr(data, "click btn1")) update_board(0); // 第1格索引0 // 其他按钮类似... } // 更新棋盘及显示 void update_board(int pos) { if(board[pos] != ' ') return; // 禁止重复落子 board[pos] = current_player; // 'X'或'O' // 更新屏幕显示 sprintf(buf, "btn%d.txt=\"%c\"\xff\xff\xff", pos+1, current_player); HAL_UART_Transmit(&huart1, buf, strlen(buf), 100); check_winner(); toggle_player(); } ``` #### 4. **胜负判断逻辑** ```c bool check_winner() { // 行检查 for(int i=0; i<3; i++){ if(board[i*3] == board[i*3+1] && board[i*3+1] == board[i*3+2] && board[i*3] != ' ') show_result(); } // 列和对角线类似... } ``` #### 5. **复位功能实现** ```c // 收到复位指令时清空棋盘 void reset_game() { memset(board, ' ', 9); for(int i=1; i<=9; i++){ sprintf(buf, "btn%d.txt=\" \"\xff\xff\xff", i); HAL_UART_Transmit(&huart1, buf, strlen(buf), 100); } } ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值