搜索
bottom↓
回复: 37

过度设计的串口调试器-学习WPF和MVVM分享

[复制链接]

出0入0汤圆

发表于 2016-1-18 19:16:52 | 显示全部楼层 |阅读模式
最近有接触简单的上位机串口应用,学习了一段时间的C#和WPF,

看的是刘铁猛老师的:[深入浅出WPF].刘铁猛

在youku看了刘铁猛关于MVVM模式的教程,把串口调试器改造了一下,

现在的代码和界面还很粗糙,

界面和逻辑/数据脱开。界面部分就只有一个显示到文本最后一行的事件。

以下是代码,有感兴趣的可以看看,但,对菜鸟要温柔,



附截图一张:


我打算再往上加功能
2016-01-18_19:15

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-1-18 20:51:34 | 显示全部楼层
支持一下

出100入85汤圆

发表于 2016-1-19 11:04:31 | 显示全部楼层
为啥叫过度设计,我看像过渡设计。

出0入0汤圆

 楼主| 发表于 2016-1-19 13:17:25 来自手机 | 显示全部楼层
whatcanitbe 发表于 2016-1-19 11:04
为啥叫过度设计,我看像过渡设计。

串口调试器没必要上代码模式,事件驱动就可以很好工作,所以过度了

出0入0汤圆

 楼主| 发表于 2016-1-30 17:28:04 | 显示全部楼层
版本v1.0.0.1
更新说明:
1、相对初版对变量的结构进行了重新的规划,命名进行简化,后有大概的关系图奉上
2、对命令的命名进行了统一。
3、界面取消重置,进行了重新的Binding,
4、增加about窗口
5、放弃退出命令的绑定,在ViewMode一个命令搞定,

代码结构规划(实际的会有变动/主要是数据接口开放)


代码:(界面取消了重置)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-1-30 17:36:52 | 显示全部楼层
看了一下,挺不错的。
我也有用wpf,不过基本没有mvvm这个模式。
楼主哪里的? 希望大家有机会多多交流。

出0入0汤圆

 楼主| 发表于 2016-1-30 17:43:02 | 显示全部楼层
codefish 发表于 2016-1-30 17:36
看了一下,挺不错的。
我也有用wpf,不过基本没有mvvm这个模式。
楼主哪里的? 希望大家有机会多多交流。 ...

成都的wpf菜鸟,自学,

MVVM是想把业务逻辑和显示逻辑完全分开。优势是最小成本的实现界面修改。感觉比做事件响应要好处理。

出0入0汤圆

发表于 2016-1-30 21:47:29 来自手机 | 显示全部楼层
我来学习的,不过我用的是winform

出0入0汤圆

发表于 2016-1-31 07:27:21 来自手机 | 显示全部楼层
还没用过这种模式,不过先确保串口接收不丢数,定时准确

出0入0汤圆

 楼主| 发表于 2016-1-31 08:17:13 来自手机 | 显示全部楼层
tdh03z 发表于 2016-1-31 07:27
还没用过这种模式,不过先确保串口接收不丢数,定时准确

丢数不会,
对于接收,参考的是官方帮助,
单独的线程,死循环一直读,用c#的异常处理

出0入0汤圆

 楼主| 发表于 2016-1-31 14:43:04 | 显示全部楼层
本帖最后由 zyqcome 于 2016-1-31 22:37 编辑

版本v1.0.0.3
更新说明:
1、添加类似皮肤切换功能(无记忆,下次启动会还原)
2、解决串口不存在时软件崩溃,改为窗口提示,“串口打开失败”

资料:
教程来源:
1、http://v.youku.com/v_show/id_XMjA1Mjk0OTY=.html?from=y1.7-1.2
2、源文件软件版本VS2012+MVVM底层Prism4_1
效果大概:


软件:


源文件:


修改:增加软件版本提示
二次修改:改正软件缺陷

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2016-1-31 14:50:03 | 显示全部楼层
不得不说“过度”这个词让人琢磨。

出0入0汤圆

 楼主| 发表于 2016-1-31 15:20:05 | 显示全部楼层
fulitun 发表于 2016-1-31 14:50
不得不说“过度”这个词让人琢磨。

自学的,缺东西练手,加到这个上

出0入0汤圆

发表于 2016-1-31 16:08:12 | 显示全部楼层
本帖最后由 kinsno 于 2016-1-31 16:10 编辑
zyqcome 发表于 2016-1-31 15:20
自学的,缺东西练手,加到这个上


我刚用点打开,死机崩溃退出了,我也是醉了;



PS: 下载源文件,想找开一下,进行调试,看看啥毛病? 结果,我的2010打不开这个版本,放弃作罢;


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入25汤圆

发表于 2016-1-31 16:20:57 | 显示全部楼层
kinsno 发表于 2016-1-31 16:08
我刚用点打开,死机崩溃退出了,我也是醉了;

VS2010 打开更高级解决方案 更改.sln 文件的
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012

部分成vs2010解决方案一样的就行了, 不知道的话VS2010新建一个解决方案对比更改过来就行了。

出0入0汤圆

发表于 2016-1-31 16:26:07 | 显示全部楼层
墨非 发表于 2016-1-31 16:20
VS2010 打开更高级解决方案 更改.sln 文件的
Microsoft Visual Studio Solution File, Format Version 12 ...

谢了,懒得折腾了;

出0入0汤圆

 楼主| 发表于 2016-1-31 22:02:30 | 显示全部楼层
kinsno 发表于 2016-1-31 16:08
我刚用点打开,死机崩溃退出了,我也是醉了;

你好,我看了代码,是我的问题。

我一直用虚拟串口调试没注意到这个问题。

问题出在当串口号不存在时,现在直接打开,应该有异常处理。

出0入0汤圆

发表于 2016-2-1 22:42:51 | 显示全部楼层
这东西还用自己编吗。。

出0入0汤圆

 楼主| 发表于 2016-2-1 22:59:21 | 显示全部楼层
bli19 发表于 2016-2-1 22:42
这东西还用自己编吗。。

完全不用自己写,是用来练习编程的。肯定有bug和不完善的地方

出0入0汤圆

发表于 2016-2-2 10:18:13 | 显示全部楼层
USB 转串口,不小心拔掉以后再插回去,能继续工作吗?

出0入0汤圆

发表于 2016-2-2 12:22:00 | 显示全部楼层
支持一下~~~

出0入0汤圆

 楼主| 发表于 2016-2-2 15:51:52 | 显示全部楼层
mangocity 发表于 2016-2-2 10:18
USB 转串口,不小心拔掉以后再插回去,能继续工作吗?

不能,现在的代码在读取数的时候没有判断端口是否存在。所以硬拔的话会出现楼上的软件死掉或则系统死掉的问题。可以在下一个版本加上。想想确实应该这样处理。每次读之前,至少要判断逻辑是不是正常,这样能尽量人性化

出0入0汤圆

发表于 2016-2-2 16:12:24 | 显示全部楼层
zyqcome 发表于 2016-1-31 08:17
丢数不会,
对于接收,参考的是官方帮助,
单独的线程,死循环一直读,用c#的异常处理 ...

【个人理解】:无论是发送还是接收数据,都没有必要另开启一个线程;用while循环一直读更不可取....
C#的.net框架里,MSDN文档对于事件处理那段需要看一看....SerialPort类里自带Data_Received(拼写了大概,具体文档可查),在那个事件的响应里【确实,和MCU里的中断很接近了】读取数据就行....没有必要另开一个线程....

出0入0汤圆

发表于 2016-2-2 16:17:15 | 显示全部楼层
https://msdn.microsoft.com/zh-cn ... d%28v=VS.80%29.aspx

出0入0汤圆

发表于 2016-2-2 16:59:02 | 显示全部楼层
zyqcome 发表于 2016-1-30 17:28
版本v1.0.0.1
更新说明:
1、相对初版对变量的结构进行了重新的规划,命名进行简化,后有大概的关系图奉上

这个图是用什么软件画的啊?

出0入0汤圆

 楼主| 发表于 2016-2-2 23:37:28 | 显示全部楼层
M1379 发表于 2016-2-2 16:17
https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.datareceived%28v=VS.80%29.aspx

SerialPort.DataReceived 事件这个我知道,在winform里,直接点控件就可以注册。

通过comment绑定再注册它就没有尝试,应该也可以。

但是如果要解析串口数据的话,也要在DataReceived里,遍历读到的数据,找到需要的。效果差不过,

另外我的用法的来历:
https://msdn.microsoft.com/ZH-CN/library/30swa673(v=VS.110,d=hv.2).aspx  下面的例程。

出0入0汤圆

 楼主| 发表于 2016-2-2 23:41:22 | 显示全部楼层
sbk100 发表于 2016-2-2 16:59
这个图是用什么软件画的啊?

图是用在线的画图软件做的

https://www.processon.com

用的是Org组织结构图,中的Sample Organization Template模板上改的

出0入0汤圆

发表于 2016-2-3 08:43:26 | 显示全部楼层
zyqcome 发表于 2016-2-2 23:37
SerialPort.DataReceived 事件这个我知道,在winform里,直接点控件就可以注册。

通过comment绑定再注册 ...

官方例程是让我们爱恨两难的东西....好处是能说清API怎么用,但是真的不见得就能直接应用....

谷歌关键词 "C# Async Serial Port Read".....

http://stackoverflow.com/questio ... nc-serial-port-read

-------------------------------------------------------------------------------------------------------------------

上位机接收数据后解析,不一定非要用一个while循环。。。while循环执行时是无条件的占用CPU,而串口是一个慢速设备,9600的波特率真正需要CPU的时段很少。。。中间间隔一个 while 就全浪费了。。。。开启另一个线程在我看是更划不来的做法,同样要占CPU。。。潜在的还会引出其他BUG。。。。

最优的解决方法不清楚,但有一个变通的办法。。。。前提是你通常的应用和我的差不太多。。。。

上位机---下位机的主从模式下。。。

在主机(PC端)的DataReceived事件里,读取当前串口缓存的数据后,开启一定时器,time_out 值根据波特率以及据包的平均长度算一个适中的值。。。

定时器一旦超时,就进超时的那个事件里去解析整个数据包。。。

整个过程中,serial Port 和 Timer 的资源分配,事件响应,相关临时线程的开启/销毁,都有.net自己照顾到。。。一行代码都不用加。。。。

大概这样。。。。

为了100%可靠一般还要自定义些其他的逻辑。。。

出0入0汤圆

 楼主| 发表于 2016-2-3 10:17:15 来自手机 | 显示全部楼层
M1379 发表于 2016-2-3 08:43
官方例程是让我们爱恨两难的东西....好处是能说清API怎么用,但是真的不见得就能直接应用....

谷歌关键 ...

定时处理确实是一个省事的办法,通信帧长度固定就更好了。
周立功can板卡的C#例子就是这样处理的

出0入0汤圆

 楼主| 发表于 2016-3-3 14:26:42 | 显示全部楼层
临时更详:2016-03-03       

1、打包安装包:
       
        安装包说明:现在这个安装包很粗糙,没有集成net安装包,只做了net判断,我在xp环境测试,没有net无法安装
        安装包是NSIS软件生成

更新计划:
        1、在安装包内集成net文件,在安装界面时可以选择(待学)

        2、串口调试器增加协议配置,希望达到效果是按协议设定下发和读入/显示数据(已在搭建)

        3、增加显示数据的控件支持(只是计划)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2016-3-7 22:43:57 | 显示全部楼层
*制作安装包更新:已集成net环境
*代码协议(正在学习/完全没有概念)
*
*上传日期:2016-03-07
*
*代码说明:1、编写软件nsis,向导生成主框架,现在还不能读出net安装进程,net可能会安装时间较长
*                 2、集成软件net4.0
*                 3、安装包在安装阶段会判断是否安装net4.0,已安装或有高版本会略过安装
*                 4、加入了我的小广告,
*                 5、自学中,但,独学而无友,则孤陋而寡闻,欢迎大家提意见
*

制作出的安装包:




安装包源码:



图片:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2017-2-17 09:50:29 | 显示全部楼层
本帖最后由 zyqcome 于 2017-2-17 09:53 编辑
M1379 发表于 2016-2-3 08:43
官方例程是让我们爱恨两难的东西....好处是能说清API怎么用,但是真的不见得就能直接应用....

谷歌关键 ...


今天重新读了下你的回复,
发现我当时回复的时候,
根本就没有理解你的意思,

过了段时间,回过来看,确实是事件处理更加安全和方便,

你回帖中提到的思路,也能解决串口数据异常的问题,可以用在 modbus 的回复 数据超时中,在串口接收事件中,通过超时来触发数据解析,也能在最大程度上,保证接收数据的帧完整

thanks,

出0入0汤圆

发表于 2017-2-17 09:55:08 | 显示全部楼层
支持,学习看看

出0入0汤圆

发表于 2017-2-17 12:43:10 | 显示全部楼层
zyqcome 发表于 2017-2-17 09:50
今天重新读了下你的回复,
发现我当时回复的时候,
根本就没有理解你的意思,

还有最新版本吗?
想弄一个学习一下,哈哈,WPF。。。原来一直使用winform的。。。
在设计中,确实是要将逻辑和界面分开,这样会比较方便操作。。。
另外请教,WPF下有什么合适的波形显示控件,这样可以做一个协议解析配合波形。。。


出0入0汤圆

 楼主| 发表于 2017-2-17 13:49:14 | 显示全部楼层
kinsno 发表于 2017-2-17 12:43
还有最新版本吗?
想弄一个学习一下,哈哈,WPF。。。原来一直使用winform的。。。
在设计中,确实是要将 ...

https://lvcharts.net/

我用过,这个资料比较齐,

wpf 的静态图表还好,

动态图表,如果多开一两个就相当卡,也有可能是我编程的原因,我大量依赖绑定(菜鸟)

波形显示控件,这样可以做一个协议解析配合波形 可以用这个 Step Line



图片资料链接: https://lvcharts.net/App/examples/v1/wpf/Step%20Line

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2017-4-24 00:37:13 来自手机 | 显示全部楼层
winform太简单了,一直想学wpf,发现界面不懂怎么弄啊,很容易摆乱。

出0入0汤圆

发表于 2017-4-24 12:01:27 | 显示全部楼层
有营养的帖子都要顶~~
谢谢分享~

出0入0汤圆

发表于 2017-5-23 20:37:43 | 显示全部楼层
不错的学习参考资料。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 06:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表