如何同时接收多个串口的数据

kbt54654 2017-03-03 08:01:03
一个程序需要外接8个串口,那么必须写八个串口接受函数么?就是每个com口对应的DataReceived必须都不一,必须写8个么?能不能一个让所有comm的 DataReceived 都等于同一个接收函数?
...全文
3974 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kbt54654 2017-03-03
  • 打赏
  • 举报
回复
我脑子进水了…… 突然发现了…… 结帖…… 谢谢两位
kbt54654 2017-03-03
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
[quote=引用 2 楼 kbt54654 的回复:] 委托一个函数里的话 那接受数据并进入函数之后 怎么判断 这次来的数据是哪儿个串口发来的呢
事件类型参数声明(以及对应的委托)的第一个参数就是串口对象。所以识别“是哪个串口”还是很容易的。 不过这是不同层次的考虑。一种是“底层”零碎的去“识别窗口”的 sender 对象,而另一种是从业务角度尽可能封装为搞内聚的业务领域class。[/quote] 第一次发帖=_= 不太会用这个贴代码的功能 大概意思就是楼上标注的地方 那个位置怎么判断现在哪儿个串口…… sender 那个参数我貌似看不到串口号啊=_= C#我用的不太熟 麻烦您了!
kbt54654 2017-03-03
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
[quote=引用 2 楼 kbt54654 的回复:] 委托一个函数里的话 那接受数据并进入函数之后 怎么判断 这次来的数据是哪儿个串口发来的呢
事件类型参数声明(以及对应的委托)的第一个参数就是串口对象。所以识别“是哪个串口”还是很容易的。 不过这是不同层次的考虑。一种是“底层”零碎的去“识别窗口”的 sender 对象,而另一种是从业务角度尽可能封装为搞内聚的业务领域class。[/quote]
            void abc()
            {
                SerialPort[] cAcomm = new SerialPort[8];
                ///////////////////////////////
                for (int i = 0; i < 8; i++)
                {
                    rASAllComm.cAcomm[i].DataReceived += rASDataReserve;
                }
            }
        void rASDataReserve(object sender, SerialDataReceivedEventArgs e)//串口接受函数
        {
            // 就这里…… 这个函数 如何判断现在是哪儿个串口发来的数据……………………
            int n = comRead.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
            byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
            comRead.Read(buf, 0, n);//读取缓冲数据
            comReadbuilder.Clear();//清除字符串构造器的内容
            comReadbuilder.Append(Encoding.ASCII.GetString(buf));
            if ((comReadbuilder.ToString() != null && comReadbuilder.ToString().IndexOf(" V, ") <= -1))//&& comReadbuilder.ToString()!="")//如果成立了就是特殊字符
                specialReadQueue.Enqueue(comReadbuilder.ToString());
            else //if(comReadbuilder.ToString()!="")
                commonReadQueue.Enqueue(comReadbuilder.ToString());
        }
  • 打赏
  • 举报
回复
通常,一个受过训练的程序员,已经不去担心不会识别 object sender 等于哪一个串口对象的问题了,他实际上不去考虑“如何同时接收多个串口的数据”这样表述问题,而是重构为更高层次的业务领域设计。比如说他把“上位机控制油泵管理器”作为一个对象、“上位机入侵检测”作为另一个对象.....尽管有8种管理器都是用串行通讯的、因此可以抽象相同的串口封装机制,但是是从这样的层面进行业务设计的,每一个管理器对象内部都深入一个串口。而不是把“8个串口”单独拿出来说事儿、进行设计的。
  • 打赏
  • 举报
回复
引用 2 楼 kbt54654 的回复:
委托一个函数里的话 那接受数据并进入函数之后 怎么判断 这次来的数据是哪儿个串口发来的呢
事件类型参数声明(以及对应的委托)的第一个参数就是串口对象。所以识别“是哪个串口”还是很容易的。 不过这是不同层次的考虑。一种是“底层”零碎的去“识别窗口”的 sender 对象,而另一种是从业务角度尽可能封装为搞内聚的业务领域class。
  • 打赏
  • 举报
回复
代码是代码,对象是对象,你搞混了。 比如说人家写一个类型 ABC,其中有对象方法 M,假设有100个ABC实例,那么这个 M 运行时它所知道的一切(this相关)都是跟每一个ABC实例相关的,并不会“串”。 也就是说,其实设计一个程序用不着去纠结什么“sender”,假设你面向对象而设计程序,把“串口对象”封装为一个“串口处理器”对象的属性,那么你的所有的“接收”代码也就是使用“this.串口、this.XXXX”这类方式访问自身封装的一切东西就行了。 如果你只是结构化地面向方法来设计程序,而不是面向对象来设计程序,看似挺“底层的”,实际很乱,封装性比较差,将来也没有很好地将“串口管理器”进行继承扩展、多态使用的潜力。
xuggzu 2017-03-03
  • 打赏
  • 举报
回复
……怎么区分?这问题问的。 任何对象都有特征,比如名字,某个属性值等
kbt54654 2017-03-03
  • 打赏
  • 举报
回复
引用 1 楼 xuggzu 的回复:
事件可委托同一个处理函数,函数里处理好逻辑即可。
委托一个函数里的话 那接受数据并进入函数之后 怎么判断 这次来的数据是哪儿个串口发来的呢
kbt54654 2017-03-03
  • 打赏
  • 举报
回复
委托一个函数里的话 那接受数据并进入函数之后 怎么判断 这次来的数据是哪儿个串口发来的呢
xuggzu 2017-03-03
  • 打赏
  • 举报
回复
事件可委托同一个处理函数,函数里处理好逻辑即可。

110,534

社区成员

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

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

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