【C#学习】20事件详解(上) 初步了解事件,事件模型的基本理论


在这里插入图片描述

1.什么是事件?

事件是一种类型成员,可以把它理解为【能够发生的什么事】
属性,事件,方法,是最重要的三种类型成员;其中,属性的作用是:存储数据;方法的作用是:逻辑运算;而事件的作用是:使类或者对象具备通知能力

举例:手机有响铃这个事件
手机可以通过响铃这个事件来通知关注手机的人,也可以说【响铃这个事件让手机具备了通知能力】;伴随着通知,很多事件发生时会产生一些与事件本身相关的数据,比如智能手机响铃时,一定会附带一些其他的消息:新短信,新邮件,电话打进来等;
以手机的角度:它是在完成通知关注者的同时,把相关的消息发送给关注者
以关注者的角度:他除了被通知之外,还收到了事件的主体(手机)发送出来的与事件本身相关的数据(消息),从而采取一些行为

微软规定:
经由事件发送出来的与事件本身相关的数据称为【事件参数(EventArgs)
根据通知和事件参数采取行动的行为称为【响应事件(或 处理事件)
处理事件时具体所作的事情称为【事件处理器(Event Handler)

只管通知,没有事件参数的事件,也是存在的
比如说:红绿灯,报警器
这类事件,无需额外消息,事件发生的本身就足以说明一切了

事件的功能 = 通知(别的对象或类)+ 可选的事件参数(即 详细信息)
“内容决定形式,功能决定使用方法” ,所以,事件的功能就决定了它在程序中的使用方法,必然是:用于对象或者类间的动作协调与信息传递(消息推送)

“XX对象拥有一个XX事件”
指这个对象可以通过它的事件来通知别的对象,事件一发生,关心着这个事件的对象们就会被依次通知到,然后纷纷作出响应,统一协调地运作起来,从而使程序正常运转

2.事件模型的原理

事件模型又称为【发生–响应模型】,事件模型有两个5

(1)事件模型的5个组成部分

举例:
闹钟响了大宝起床
<1>事件的拥有者:闹钟
<2>事件:闹钟响铃
<3>事件的响应者:大宝
<4>事件处理器:起床
<5>订阅事件
第<5>部分,是隐含的 “订阅” 关系,为什么别人闹钟响了大宝不起床呢?是因为大宝只关心自己的闹钟,只订阅了自己的闹钟的响铃事件

(2)事件模型在构建和运作时的5个步骤

<1>我有一个事件
<2>一个人或一群人关心我的这个事件(订阅)
<3>我的这个事件发生了
<4>关心这个事件的人会被依次通知到(通知的次序就是订阅的次序:先订阅先被通知,后订阅后被通知)
<5>被通知到的人根据拿到的事件信息对事件进行响应(处理事件)

3.术语约定

(1)事件的订阅者,又称

  • 事件消息的接收者
  • 事件的响应者
  • 事件的处理者
  • 被事件所通知的对象

(2)事件参数,又称

  • 事件信息
  • 事件消息
  • 事件数据

4.补充

MVC,MVP,MVVM等程序架构模式,会约束程序员在处理事件时,做到 :有所为,有所不为;代码该放在哪里就放在哪里,使程序具有清晰的结构和条理

### 使用 VOFA 上位机通过蓝牙调试 PID 参数 #### 配置硬件连接 为了实现通过蓝牙模块 HC05 进行 PID 参数的无线调整,需确保单片机与蓝牙模块之间的波特率匹配[^1]。通常情况下,HC05 的默认波特率为 9600 bps。 #### 初始化蓝牙通信接口 在程序初始化阶段,应配置 UART 接口以便于后续的数据交换。对于 STM32 平台而言,可以借助 HAL 库简化这一过程: ```c UART_HandleTypeDef huart1; void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } ``` #### 实现 PID 参数接收处理函数 定义 `Bluetooth_Operate` 函数来解析来自上位机的指令并更新相应的 PID 控制器系数。该函数会周期性地检查是否有新的消息到达,并从中提取 P、I 和 D 值赋给对应的控制器成员变量[^3]。 ```c #define CantFind (-1) float String_FindNum(char *str, char type); void Bluetooth_Operate(void) { static bool send_state = false; if (!send_state && GetSendState()) { float data = String_FindNum(GetMessage(), 'P'); if (data != CantFind) LeftSpeedPID.Kp = data; data = String_FindNum(GetMessage(), 'I'); if (data != CantFind) LeftSpeedPID.Ki = data; data = String_FindNum(GetMessage(), 'D'); if (data != CantFind) LeftSpeedPID.Kd = data; SetSendState(false); } } ``` #### 设置 VOFA 上位机软件 启动 VOFA 调试工具后,在其界面内指定正确的 COM 端口号以及设定好相同的波特率设置。之后便可以通过图形化界面对目标设备发送命令字符串以改变 PID 参数值[^4]。 #### 测试验证 一旦上述准备工作就绪,则可通过实际运行测试整个系统的响应情况。观察电机性能变化的同时记录最佳参数组合,最终将其固化至固件之中保存下来作为最优解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值