急!!!多窗体控制一个串口进行数据的收发

gao_chen 2018-08-16 11:57:51
功能介绍:我做的是单片机的上位机,所以要求系统对串口进行控制。
有4个窗体,每个窗体都要对单一串口进行发送数据,每次发送都会有回馈信息,所以要实时的接收数据。
4个窗体的使用都是分开的,每次只用到一个。是控制4种机器。

试了csdn上的一些做法
1.在主窗体Form1()
public static SerialPort serialPort1 = new SerialPort();
然后,其他窗体,Form1.serialPort1这样去用。
发数据很快。
收数据就很慢了。延迟很大。
收数据的方法是,打开一个窗体,处理一种接收事件,关闭的时候取消订阅。

2.每次都打开,关闭,还没试,听说也不太好。
3.后台一个线程读串口,前台窗体读线程数据 。。这个是从网上看的,不懂。。其实线程不会用。只会用基本的挂起操作。。让它睡一会儿。
单界面的收发数据可以实现。

求明白人给说说,怎么去实现我要的功能,谢谢

功能介绍:我做的是单片机的上位机,所以要求系统对串口进行控制。
有4个窗体,每个窗体都要对单一串口进行发送数据,每次发送都会有回馈信息,所以要实时的接收数据。
4个窗体的使用都是分开的,每次只用到一个。是控制4种机器。
...全文
391 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2018-08-17
  • 打赏
  • 举报
回复
简单封装一下
「已注销」 2018-08-17
  • 打赏
  • 举报
回复
https://www.cnblogs.com/zzfstudy/p/5313577.html
gao_chen 2018-08-17
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
各个宿主(窗口)应该是捕获所封装的串口设备抛出的事件,当捕获到事件时才来读取已经准备好的数据参数。所以这是两层设计。一层是串口处理对象自己捕获数据到来事件、解析数据判断是否收到了一条完整消息,一旦收到完整消息则抛出事件通知。
另一层是所有的宿主(窗口)捕获串口处理对象抛出的事件,处理自己的业务逻辑。


谢谢你的回复,很感谢。

另一层是所有的宿主(窗口)捕获串口处理对象抛出的事件,处理自己的业务逻辑。
这句话不太明白。

各个宿主(窗口)应该是捕获所封装的串口设备抛出的事件,当捕获到事件时才来读取已经准备好的数据参数。

我现在想着,一会儿试下。我每个窗体,每次按button,发送一次数据,然后收到设备反馈的数据之后,就把之前定义的接收事件取消。

还是有点懵懵的。。
gao_chen 2018-08-17
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
SerialPort 控件能胜任所有操作,并不需要你去画蛇添足


首先谢谢你的回复~很感谢。

你说这。。对我没有帮助啊。。哈哈。
我要是会用,我不就用了。。
gao_chen 2018-08-17
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
收数据就很慢了。延迟很大。
这个我觉得不是方法的问题,而是设备本身回复慢吧,要么你的解包代码有问题

把串口操作代码(打开关闭读写)放在一个单独的串口辅助类里最好,然后做成单例让几个窗口都引用它,用事件分发数据


首先谢谢你的回复~很感谢。
昨天用的串口助手替代的回复数据操作。一会儿我再弄弄。

~把串口操作代码(打开关闭读写)放在一个单独的串口辅助类里最好,然后做成单例让几个窗口都引用它,用事件分发数据

昨天,想做成三层结构那样的,专门的Common层,发现用不了。。不知道为啥

这样引用,具体呢。每次开串口,发数据,收数据,关串口?

gao_chen 2018-08-17
  • 打赏
  • 举报
回复
确实,按照我的功能,在4个窗口上,分别,每个窗口用SerialPort控件,就可以实现。
晨易夕 2018-08-17
  • 打赏
  • 举报
回复
4楼的核心思想就是要告诉你使用事件驱动,没有数据来的时候就也需要阻塞一个线程吗。
jhone99 2018-08-17
  • 打赏
  • 举报
回复
除了SerialPort控件,还有SerialPort类,后台处理串口可以用这个SerialPort类来做

如果4个都要同时使用,需要注意调用不打架
依然冷暖 2018-08-17
  • 打赏
  • 举报
回复
我觉得是你自己思路问题 思路不对 基本串口操作就只有打开 关闭 接收事件这三个! 四个窗口控制同一个下位机串口 那么四个窗口必然只有一个串口是打开的 ,如果四个窗口都是独立的 最好办了!就算是四个窗口共用 那也是只有一个接收事件 其余的窗口只是处理接收数据 只需要 弄一个四个窗口共享的一个数组之类的空间就可以了
  • 打赏
  • 举报
回复
引用 楼主 gao_chen 的回复:
3.后台一个线程读串口,前台窗体读线程数据 。。这个是从网上看的,不懂。。其实线程不会用。只会用基本的挂起操作。。让它睡一会儿。

滥用线程是个坑,滥用两个线程就是指数关系——跑步入坑——更加变本加厉了。

当没有数据来的时候,任何线程也不可能占用。当串口数据,在打开串口时当初注册的事件处理方法就会被自动调用,这时候处理数据。

各个宿主(窗口)应该是捕获所封装的串口设备抛出的事件,当捕获到事件时才来读取已经准备好的数据参数。所以这是两层设计。一层是串口处理对象自己捕获数据到来事件、解析数据判断是否收到了一条完整消息,一旦收到完整消息则抛出事件通知。另一层是所有的宿主(窗口)捕获串口处理对象抛出的事件,处理自己的业务逻辑。
stherix 2018-08-16
  • 打赏
  • 举报
回复
收数据就很慢了。延迟很大。
这个我觉得不是方法的问题,而是设备本身回复慢吧,要么你的解包代码有问题

把串口操作代码(打开关闭读写)放在一个单独的串口辅助类里最好,然后做成单例让几个窗口都引用它,用事件分发数据

  • 打赏
  • 举报
回复
没有数据到来时,不占用任何线程。

先把这个基本的编程模式搞明白。
xuzuning 2018-08-16
  • 打赏
  • 举报
回复
SerialPort 控件能胜任所有操作,并不需要你去画蛇添足

110,538

社区成员

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

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

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