C# 使用serialPort,在Timertick里使用串口发送数据,同时再接收串口数据,发生冲突

骄阳可汗 2016-02-22 10:23:04
RT,有没有办法互不干扰,我的TimerTick设置的是200ms
...全文
988 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfqsy 2016-03-04
  • 打赏
  • 举报
回复
接收使用_DataRecevied事件,并不是在Timer_Tick中
tcmakebest 2016-03-03
  • 打赏
  • 举报
回复
楼主说的冲突,干扰太抽象了吧,等于啥都没说. 串口通讯是目前最慢又容易出错的通讯了,因为不能太快. 发送一个数据包后通常要安静一会儿对方才知道数据包结束了, 再进行相应的处理, 这通常会有一个最慢不超过多少毫秒的协定.
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
说清楚什么干扰,只能理解为你处理的不好
嗯,是这样的。可能是lz 自己的协议设计概念比较初级。 如果要发送多个消息,并且又要接收多个消息,那么自己应该设计消息的格式,例如消息中一定会有一个字段表示“序号”这类东西。发的消息知道它自己的编号,而收到的消息也知道是回复之前的哪一条消息的。
  • 打赏
  • 举报
回复
引用 6 楼 sunyoung1990 的回复:
[quote=引用 5 楼 oysy 的回复:] timer控件你就不要用来接收数据了
就是按你的说法啊,TIMER和串口都用的自带控件,在Timer_Tick事件中调用串口发送函数,在serialPort_DataRecevied事件里接收处理[/quote] 你的这种说法,就好像你认为凡是发送消息都应该放到 Timer_Tick 中似地。让人匪夷所思。
  • 打赏
  • 举报
回复
收和发数据跟timer毫无关系,也不应该写任何 sleep 语句。纠结什么“定时、延迟”之类的,你应该好好研究一下自己的通讯技术上出了什么严重的底层问题。
lccleo 2016-03-03
  • 打赏
  • 举报
回复
如果你休眠了50ms 你的串口接收难道就能出发了?
lccleo 2016-03-03
  • 打赏
  • 举报
回复
按理来说 datareceived事件实在辅助线程上完成的 这个msdn上面有 你的发送是用定时器控制的 这个实在主线程上完成的 理论上来说这个没有任何冲突 我做过串口 也是这么做的 没有任何问题
骄阳可汗 2016-02-22
  • 打赏
  • 举报
回复
引用 5 楼 oysy 的回复:
timer控件你就不要用来接收数据了
就是按你的说法啊,TIMER和串口都用的自带控件,在Timer_Tick事件中调用串口发送函数,在serialPort_DataRecevied事件里接收处理
飞天凤凰601 2016-02-22
  • 打赏
  • 举报
回复
timer控件你就不要用来接收数据了
飞天凤凰601 2016-02-22
  • 打赏
  • 举报
回复
兄弟,请使用 seriaPort控件,列表里有,不要手动建立 然后用控件里的DataRecevied事件获取数据 如果手动建立,你也要把事件 加进去
骄阳可汗 2016-02-22
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
说清楚什么干扰,只能理解为你处理的不好
具体情况是,接收事件触发不了
 private void timer_CheckPLC_Tick(object sender, EventArgs e)
        {
            ModbusRegisterRead_1(726);
            Thread.Sleep(50);//如果这里不休眠50ms,串口接收事件就不会被触发!!!
         }
骄阳可汗 2016-02-22
  • 打赏
  • 举报
回复
解释一下,接收使用_DataRecevied事件,并不是在Timer_Tick中
bdmh 2016-02-22
  • 打赏
  • 举报
回复
说清楚什么干扰,只能理解为你处理的不好
xian_wwq 2016-02-22
  • 打赏
  • 举报
回复
引用 楼主 sunyoung1990 的回复:
RT,有没有办法互不干扰,我的TimerTick设置的是200ms
所有的协议都是应答制,比如CDT,比如ModBus 发出请求,就要等回应 不等应答而是周期性发送数据其实是没有意义的。
hawke1234 2016-02-22
  • 打赏
  • 举报
回复
串口的MODBUS的命令发送和数据读取应当是同步消息。向从设备发送一条请求命令,就应当等待返回结果,当有结果(或者等待超时)后,再发送请求命令。 你的做法是异步消息,发送一条命令,不管有没有返回,计时器时间一到,再发送一条。这样的控制,本身就是有问题的。 MODUBS RTU(ASCII)的读取步骤: 将请求命令写入串口。(Wirte) 等待从设备返回数据(read) 当串口有数据返回,校验并解析数据。 当一定时间内串口没有数据返回(ReadTimeOut),判定为一次请求失败。

111,094

社区成员

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

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

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