定时器开关失效问题

云外缘 2019-05-16 04:57:40
现象:
当与下位机通信正常,且上位机设定参数与下位机内部参数不一致、再发送修改参数命令成功、再重启(重启下位机无返回,只能用超时继续下一步)时,超时时钟便无法正常进入Tick处理,此时超时时钟可以修改Interval,但不能修改Enable。超时时钟一直处于开状态。
而当下位机不存在时,超时时钟可以在“内部命令.读取全参数”时超时进入Tick处理。

请教这是什么情况?

声明:

private System.Windows.Forms.Timer 超时时钟 = new System.Windows.Forms.Timer();


到时处理:

private void 超时处理(object sender, EventArgs e)
{
内部命令 临时 = 命令;
命令 = 内部命令.无;
超时时钟.Enabled = false;
switch (临时)
{
case 内部命令.核对全参数:
MessageBox.Show("读出无响应!", "超时", MessageBoxButtons.OK, MessageBoxIcon.Error);
break;
case 内部命令.写入全参数:
// 出错提示
break;
case 内部命令.读取全参数:
// 出错提示
break;
case 内部命令.写入网号:
// 出错提示
break;
case 内部命令.写入信道:
// 出错提示
break;
case 内部命令.模块重启:
{
byte[] 协议_查询主从机状态 = new byte[5] { 0xAA, 0xA1, 0x00, 0x00, 0xFF };
超时时钟.Interval = 300;
命令 = 内部命令.重启检测;
超时时钟.Enabled = true;
串口.Write(协议_查询主从机状态, 0, 协议_查询主从机状态.Length); // 发重启检测查询命令
}
break;
case 内部命令.重启检测:
// 出错提示
break;
}
if (!超时时钟.Enabled) 引用委托更新状态(false);
}


串口接收:

private void 串口接收数据(object sender, SerialDataReceivedEventArgs e)
{
try
{
Thread.Sleep(15); // 避免帧读断情况
串口接受的数据 = new byte[串口.BytesToRead];
串口.Read(串口接受的数据, 0, 串口接受的数据.Length);
串口.DiscardInBuffer();
switch (命令)
{
case 内部命令.无:
引用委托发送一个消息(MSG.消息_收到串口数据);
break;
case 内部命令.写入全参数:
{
超时时钟.Enabled = false;
bool 写入成功 = true;
if (串口接受的数据[6] != 0x00) 写入成功 = false;

if (写入成功)
{
byte[] 协议_重启命令 = new byte[4] { 0xAA, 0xC9, 0x00, 0xFF};
超时时钟.Interval = 1500; // 实测重启时间很短
命令 = 内部命令.模块重启;
for (int i = 0; i < 8; i++) 协议_重启命令[8] += 协议_重启命令[i];
超时时钟.Enabled = true; // 重启等待重启完成
串口.Write(协议_重启命令, 0, 协议_重启命令.Length); // 重启模块
}
else
{
// 出错提示
}
}
break;
case 内部命令.读取全参数:
{
if (串口接受的数据.Length >= 全参数字节数)
{
for (int i = 0, j = 0; i < 串口接受的数据.Length; i++, j++) 全参数[i] = 串口接受的数据[j];
超时时钟.Enabled = false;
if (全参数与配置不同())
{
修改全参数();
命令 = 内部命令.写入全参数;
超时时钟.Interval = 800;
超时时钟.Enabled = true;
串口.Write(全参数, 0, 全参数.Length); // 写全参数
}
else
{
// 进入正常工作
}
}
else
无线模块自检结束后("读信息错误");
}
break;
case 内部命令.重启检测:
if (串口接受的数据.Length >= 6)
{
if (重启反馈正确())
{
// 进入正常工作
}
else
{
// 出错提示
}
}
else
{
// 出错提示
}
break;
case 内部命令.写入信道:
// 出错提示
break;
}
}
catch (System.Exception ex)
{
// 出错提示
}
}



打开串口时:

public void 打开串口(string 串口名)
{
串口 = new SerialPort(串口名, 19200, Parity.None, 8, StopBits.One);
try
{
串口.Open();
串口.DiscardInBuffer();
串口.DiscardOutBuffer();
打开 = true;
串口.DataReceived += 串口接收数据;

超时时钟.Enabled = false;
超时时钟.Interval = 1800;
命令 = 内部命令.读取全参数;
超时时钟.Enabled = true;
串口.Write(协议_读取全参数, 0, 协议_读取全参数.Length);
}
catch
{
串口.Dispose();
串口 = null;
// 出错提示
}
}


创建时:

超时时钟.Tick += new System.EventHandler(超时处理);
超时时钟.Enabled = false;
...全文
540 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
云外缘 2019-05-23
  • 打赏
  • 举报
回复
引用 8 楼 水边2 的回复:
没认真看你的代码,给你提个调试的思路, 你启动一个独立线程,每秒输出一下Timer的状态, 看看什么时间点,它被启动了, 基本上,肯定是你的程序在某个地方启动了它。
代码全在上面了。现在我已经用窗体拖的定时器加委托(方法完全同类内部申请的定时器)解决了这个问题,但是作为一个程序猿,我对类内部申请的定时器有问题表示困惑。
游北亮 2019-05-20
  • 打赏
  • 举报
回复
没认真看你的代码,给你提个调试的思路, 你启动一个独立线程,每秒输出一下Timer的状态, 看看什么时间点,它被启动了, 基本上,肯定是你的程序在某个地方启动了它。
云外缘 2019-05-20
  • 打赏
  • 举报
回复
这问题没人回答么?真的可惜了。我尝试过代理,FORM中拖入的定时器可以正常工作,类中声明的定时器还是不行。真希望有一个合理的解释。
云外缘 2019-05-18
  • 打赏
  • 举报
回复
引用 5 楼 m0_37646670 的回复:
进断点一步步看呗,我估计是你窗口上点关闭timer,但是程序里又打开了timer,只是看起来想无法关闭
单步调试过的,不是那种情况
m0_37646670 2019-05-18
  • 打赏
  • 举报
回复
进断点一步步看呗,我估计是你窗口上点关闭timer,但是程序里又打开了timer,只是看起来想无法关闭
云外缘 2019-05-17
  • 打赏
  • 举报
回复
引用 2 楼 以专业开发人员为伍 的回复:
await Task.Delay 异步机制可以完全取代 timer 编程机制,而且编程简单直接,不大会纠结那么多问题和 bug。用直接的 await Task.Delay 异步编程重新描述问题解决思路伪代码更好。
感觉await处理两个相互独立的耗时事件比较方便,而我这个在计时上是相互独立,但是阶段上是紧密关联,想来想去总觉得await实现上很困难…… 而关于Timer的使用,或许也就是个使用上存在违例的问题,希望能有高手慧眼识BUG,这样我也省事……
  • 打赏
  • 举报
回复
await Task.Delay 异步机制可以完全取代 timer 编程机制,而且编程简单直接,不大会纠结那么多问题和 bug。用直接的 await Task.Delay 异步编程重新描述问题解决思路伪代码更好。
云外缘 2019-05-17
  • 打赏
  • 举报
回复
C#此处十分诡异,为了验证意外代码段对定时器的影响,我特地从视窗拉了一个Timer,然后尝试打开并MessageBox一个信息,出现了各种不确定结果。此时截图是,下一句打红下划线的语句不能去掉,去掉,则定时器不能进入到时处理,加上就可以。 而此前的调试时,Timer1只要在if(写入成功)中即不可触发,而必须写在if之上。 从这个现象来看,不知道是不是这里因为代码优化方面的问题导致了什么意外……
云外缘 2019-05-16
  • 打赏
  • 举报
回复
调试时,当“超时时钟”异常后,可修改Interval的值,但是不能修改Enable的值,也就是无法关闭。
《单片机应用与实践指导》重点介绍了MCS-51、MSP430和AVR系列单片机的器件应用选型指南、硬件资源、工作原理和实践指导,并从应用角度出发详细介绍了三种单片机的应用特点、C语言编程规则、中断系统、串口技术、接口电路、系统扩展和低功耗设计等内容。实践指导部分都是经过作者精心设计、从科研工作与长期教学活动中优选出来的、对学习和掌握单片机具有指导性的实验例子,包括基本实践指导、综合实践指导和应用系统等实例。利用某些实例可直接解决工作中的实际问题。 第1章 概述 1.1 单片机的发展趋势 1.2 单片机的结构特点与应用 1.2.1 单片机的结构特点 1.2.2 单片机的应用 1.3 常用单片机系列简介 1.4 单片机系统的设计方法与要点 1.5 单片机的学习方法 1.6 单片机开发技能的提高 第2章 典型单片机应用选型指南 2.1 单片机的选择方法 2.2 系列单片机介绍 2.3 系列单片机应用选型指南 2.3.1 Atmel系列单片机选型 2.3.2 WinBond系列单片机选型 2.3.3 STC系列单片机选型 2.3.4 Philips系列单片机选型 2.3.5 C8051(Silicon Labs)系列单片机选型 2.3.6 μPSD3xx(ST)系列单片机选型 2.4 AVR系列单片机介绍 2.5 AVR系列单片机应用选型指南 2.6 MSP430系列单片机介绍 2.7 MSP430系列单片机应用选型指南 第3章 系列单片机应用基础 3.1 MCS-51系列单片机的硬件结构 3.1.1 单片机的基本组成 3.1.2 单片机的存储器结构 3.1.3 单片机的I/O端口逻辑结构 3.1.4 单片机的时钟与复位电路 3.2 MCS-51系列单片机的中断系统 3.2.1 中断的概念 3.2.2 MCS-51中断系统 3.2.3 中断程序的设计 3.3 MCS-51单片机的定时器/计数器 3.3.1 定时器/计数器的工作原理 3.3.2 定时器/计数器所用到的寄存器 3.3.3 定时器/计数器的控制 3.4 MCS-51单片机的异步通信和 串行接口 3.4.1 单片机的异步通信 3.4.2 MCS-51的串行接口 3.4.3 RS232通信电平 3.5 单片机系统的扩展与接口技术 3.5.1 单片机系统扩展的原理 3.5.2 外部存储器的扩展 3.5.3 输入/输出接口的扩展 3.5.4 键盘的接口技术 3.5.5 显示器的接口技术 3.5.6 A/D转换器的接口技术 3.5.7 D/A转换器的接口技术 3.5.8 开关电路接口及光电耦合器接口 第4章 AVR系列单片机应用基础 4.1 AVR单片机ATmega64/128的性能与结构 4.2 ATmega64/128的引脚功能与存储器 4.3 ATmega64/128的系统管理 4.3.1 时钟系统与复位 4.3.2 电源管理与睡眠模式 4.4 ATmega64/128的中断系统 4.4.1 中断向量 4.4.2 中断资源描述 4.4.3 复位和中断向量位置的确定 4.5 ATmega64/128的I/O端口与 外围接口 4.5.1 ATmega64/128的I/O端口 4.5.2 总线扩展 4.5.3 A/D转换器接口与模拟比较器 4.6 ATmega64/128的定时器/计数器 4.6.1 8位定时器/计数器0(T/C0) 4.6.2 16位定时器/计数器1和3 4.6.3 看门狗定时器 4.7 ATmega64/128的通用串行接口 4.7.1 TWI(I2C)接口 4.7.2 USART串行接口 第5章 MSP430系列单片机应用基础 5.1 MSP430单片机的结构和寄存器资源 5.2 MSP430的存储结构和地址空间 5.3 MSP430的系统复位与中断结构 5.3.1 系统复位 5.3.2 中断结构 5.4 MSP430单片机的低功耗 5.5 MSP430单片机的时钟系统 5.5.1 时钟源 5.5.2 时钟模块寄存器设置 5.5.3 时钟失效及安全操作 5.6 MSP430的通用I/O端口 5.6.1 I/O端口的主要功能 5.6.2 I/O端口的设置 5.7 MSP430的定时器 5.7.1 看门狗定时器 5.7.2 基本定时器 5.7.3 16位定时器A 5.7.4 16位定时器B 5.8 MSP430的比较器A 5.9 MSP430的串口通信 5.9.1 波特率的产生 5.9.2 MSP430的通用串行通信模块的异步模式 5.10 MSP430的模/数、数/模转换模块 5.10.1 ADC12模/数转换器 5.10.2 DAC12数/模转换器 第6章 单片机的C语言程序设计 6.1 C51语言特点 6.2 C51的标识符与关键字 6.3 C51程序设计的基本规则 6.3.1 数据类型与存储模式 6.3.2 对硬件主要资源的定义 6.3.3 运算符与表达式 6.4 基本语句 6.4.1 说明语句与表达式语句 6.4.2 复合语句 6.4.3 条件语句 6.4.4 开关与跳转语句 6.4.5 循环语句 6.4.6 函数调用语句与返回语句 6.4.7 空语句 6.5 函数 6.5.1 函数的定义 6.5.2 函数的调用 6.5.3 main函数 6.5.4 C51中断函数 6.5.5 C51库函数 6.6 C51的数据结构 6.6.1 数组 6.6.2 指针 6.6.3 结构 6.7 预处理 6.7.1 文件包含指令 6.7.2 宏定义 6.7.3 条件编译 6.7.4 其他预处理命令 6.8 AVR单片机的C程序设计基础 6.9 MSP430的C程序设计基础 6.9.1 IAR C430语言基础 6.9.2 IAR C430的函数 第7章 单片机的实践指导 7.1 基本实践指导 7.1.1 流水灯功能的实现与编程实验 7.1.2 按键与数码管静态显示实验 7.1.3 数码管动态显示实验 7.1.4 UART串行通信接口实验 7.1.5 A/D转换器接口与编程实验 7.1.6 D/A转换器接口与编程实验 7.1.7 I2C、SPI接口实验 7.1.8 数字钟接口实验 7.1.9 微型打印机接口实验 7.1.10 简易数字频率计的设计与编程实验 7.1.11 脉冲测宽电路与编程实验 7.1.12 温度测量与控制实验 7.2 综合实践指导 7.2.1 XD2008单片机I/O串口实验 7.2.2 XD2008单片机点阵汉字显示实验 7.2.3 XD2008单片机A/D、D/A综合实验 7.2.4 XD2008单片机秒表、报警综合实验 7.2.5 XD2008单片机温度测量、通信综合实验 7.3 应用系统 7.3.1 GSM/GPRS无线通信模块的典型应用 7.3.2 高性能GPS模块与单片机的典型应用 附录A 51系列单片机相关器件封装 附录B AVR系列单片机相关器件封装 附录C MSP430系列单片机相关器件封装 参考文献
德力西产品说明pdf,前   言   感谢您选用德力西(杭州)变频器有限公司生产的CDI 9600系列小功率矢量变频器。 在使用CDI9600系列小功率矢量变频器之前,请您仔细阅读本手册,以保证正确使用。不正确的使用可能会造成变频器运行不正常、发生故障或降低使用寿命,乃至发生人身伤害事故。因此使用前应认真阅读本说明书,严格按说明使用。本手册为标准附件,务必请您阅读后妥善保管,以备今后对变频器进行检修和维护时使用。 本手册除叙述操作说明外,还提供接线图供您参考。如果您对本产品的使用存在疑难或有特殊要求, 可以联系本公司各地办事处或经销商,当然您也可以直接致电我公司总部客户服务中心,我们将竭诚为您服务。 本手册包含0.75kW~5.5kW功率等级的CDI9600系列小功率矢量变频器使用说明,内容如有变动,恕不另行通知。   开箱时,请认真确认以下内容: 1、产品在运输过程中是否有破损,零部件是否有损坏、脱落,主体是否有碰伤现象。 2、本机铭牌所标注的额定值是否与您的订货要求一致,箱内是否包含您订购的机器、产品合格证、用户操作手册及保修单。   本公司在产品的制造及包装出厂方面,质量保证体系严格,但若发现有某种检验遗漏,请速与本公司或您的供货商联系解决。                     目  录   前 言 第一章  安全运行及注意事项 1 第二章 产品信息 3 2.1 铭牌数据及命名规则 3 2.2 技术规范 4 2.3 CDI9600系列小功率矢量变频器 6 2.4 外型及安装尺寸 7 2.5 日常使用的保养与维护 8 第三章 变频器的安装及接线 12 3.1 变频器前盖与数字操作键盘的安装 12 3.1.1 变频器前盖的安装 12 3.1.2 数字操作键盘的安装 12 3.2 安装地点及空间的选择 13 3.3 安装地点及空间的选择 15 3.3.1 主回路输入侧的接线注意事项 15 3.3.2 主回路输出侧的接线注意事项 16 3.3.3 主回路输出侧的接线注意事项 18 3.4 控制电路的接线 20 3.4.1控制电路端子排列及接线图 20 3.4.2 控制电路端子的功能 22 3.5 接地 24 第四章 键盘操作与运行 25 4.1 操作方式的选择 25 4.2 试运行及检查 25 4.2.1 试运行前的注意事项及检查 25 4.2.2 试运行 26 4.2.3 运行时的检查 26 4.3 键盘的操作方法 27 4.3.1 键盘按键及功能 27 4.3.2 键盘显示方式 27 4.3.3 查看/设定参数的方法(用数字键盘) 29 4.3.4 键盘设定频率的方法 30 第五章 功能参数表 31 第六章 功能参数说明 47 6.1 基本功能参数P00组 47 6.2 辅助功能参数P01组 64 6.3 输入输出端子与多段速运行功能P02组 78 6.4多段速运行功能P03组 97 6.5 其他功能参数P04组 106 6.6 显示功能参数P05组 110 第七章 故障排除 111 7.1 故障的诊断与排除措施 111 7.2 报警显示和解释 113 7.3 电机故障和排除措施 113 附录 RS-485通讯协议修正 115   第一章  安全运行及注意事项   CDI9600系列小功率矢量变频器安装、运行、维护和检查之前要认真阅读本说明书。 为了确保您的人身、设备及财产安全,在使用我公司的CDI9600系列小功率矢量变频器之前,请务必仔细阅读本章内容。说明书中有关安全运行的注意事项分类成“警告”和“注意”。       :指出潜在的危险情况,如果没有按要求操作,可能会导致人身重伤或者死亡的情况。     :指出潜在的危险情况,如果没有按要求操作,可能会导致人身轻度或中度的伤害和设备损坏。这也可对不安全操作进行警戒。     安全运行的注意事项:   1. 安装、维护作业只能由专业人员进行操作。 2. 核实变频器的额定电压必须和AC电源电压等级相一致。   3. 切勿使AC主回路电源和输出端子U,V和W相连接。连接时变频器会损坏,并且保修单失效

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧