C#使用serialPort1串口接收不到三菱PLC发出的M0信号

兔子家族-二哥 2015-02-03 02:51:32
如题求教,

这里是连窗口都没弹出来,对方硬件工程师说是数据时发出了的 求指教!
我这里不需要确定内容 就是接到这个指令就可以了,因为他就相当于一个按钮,只能发出一个点击指令。
我这样写到底有没得问题哦、、、全部代码如下:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){
serialPort1.PortName = SearchExcelCom();
serialPort1.Open();

byte[] data = Convert.FromBase64String(serialPort1.ReadLine());
serialPort1.Close();
if (!string.IsNullOrEmpty(Encoding.Unicode.GetString(data))){
MessBox.show("ssss");
}
}

没分了 求教
...全文
547 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢各位大哥的回复 谢谢各位大大 Z65443344
baobaodqh 2015-02-09
  • 打赏
  • 举报
回复
AccessPort跟踪下看有没有回复
於黾 2015-02-09
  • 打赏
  • 举报
回复
不要用byte[] 用List<byte> 否则如果接收到的数据不是43,而是2个包一起来了,接收到86个,不溢出了?
  • 打赏
  • 举报
回复
引用 28 楼 Z65443344 的回复:
要么就用同步方式读取,不要使用异步 用异步就没法控制到底什么时候会获取到数据,分几次获取 如果你只关心到底是否收到数据,而不关心收到的是什么数据 那么你也可以用个TimeSpan记录一下当前收到数据的时间,判断一下和上次收到的时间差小于多少,就直接丢弃.
恩 用时间确实是解决方法,但是我不知道间隔时间,那我想问问 ,现在我是分两次获取打完整数据,那有没得可能我后面在某些情况下 会分3次接收到完整数据? 我这样写的可以么? byte [] rs=new byte[43]; int Num = 0; while (true) { if (Num == 0) { Num = serialPort1.Read(rs, 0, rs.Length); } else if(Num < 43 && Num > 0) { byte[] rs2 = new byte[43-Num]; serialPort1.Read(rs2, 0, rs2.Length); for (int i = 0; i < 43-Num; i++) { rs[Num] = rs2[i]; } break; }
於黾 2015-02-09
  • 打赏
  • 举报
回复
要么就用同步方式读取,不要使用异步 用异步就没法控制到底什么时候会获取到数据,分几次获取 如果你只关心到底是否收到数据,而不关心收到的是什么数据 那么你也可以用个TimeSpan记录一下当前收到数据的时间,判断一下和上次收到的时间差小于多少,就直接丢弃.
於黾 2015-02-09
  • 打赏
  • 举报
回复
触发2次很正常,触发3次也有可能 先将读取到的内容放到List<byte>里,然后都放进去再判断长度
  • 打赏
  • 举报
回复
引用 24 楼 Z65443344 的回复:
[quote=引用 23 楼 ck400 的回复:] 写半天,弹出登陆框,结果写的都不见了, 如果是FX系列,波特率9600,数据位7位,停止位1位,偶校验 Open后,发送05H,如果回复06H说明通讯正常,回复15H说明有错误 FX读数据:起始+命令+首地址+位数+终+和校验 写数据:起始+命令+首地址+位数+数据+终+和校验 强制类:起始+命令+首地址+终+和校验 所有地址必须计算,
你是没习惯CSDN的尿性 点回复之前ctrl+a,ctrl+c是必不可少的步骤[/quote] 没啦 现在我获取到数据了,只是他分开两段获取到的 总长度是 43 ,我试了几次都是分成两次获取到的。就像触发了两次读取方法,这时候怎么获取啊?
於黾 2015-02-09
  • 打赏
  • 举报
回复
引用 22 楼 wyd1520 的回复:
看到这样的问题基本不想回复。。。唉。。。
哎,连我也不想回复了 已经回复过的东西,楼主连看都没看,还在那自言自语
於黾 2015-02-09
  • 打赏
  • 举报
回复
引用 23 楼 ck400 的回复:
写半天,弹出登陆框,结果写的都不见了, 如果是FX系列,波特率9600,数据位7位,停止位1位,偶校验 Open后,发送05H,如果回复06H说明通讯正常,回复15H说明有错误 FX读数据:起始+命令+首地址+位数+终+和校验 写数据:起始+命令+首地址+位数+数据+终+和校验 强制类:起始+命令+首地址+终+和校验 所有地址必须计算,
你是没习惯CSDN的尿性 点回复之前ctrl+a,ctrl+c是必不可少的步骤
amythic 2015-02-09
  • 打赏
  • 举报
回复
写半天,弹出登陆框,结果写的都不见了, 如果是FX系列,波特率9600,数据位7位,停止位1位,偶校验 Open后,发送05H,如果回复06H说明通讯正常,回复15H说明有错误 FX读数据:起始+命令+首地址+位数+终+和校验 写数据:起始+命令+首地址+位数+数据+终+和校验 强制类:起始+命令+首地址+终+和校验 所有地址必须计算,
本拉灯 2015-02-09
  • 打赏
  • 举报
回复
看到这样的问题基本不想回复。。。唉。。。
於黾 2015-02-09
  • 打赏
  • 举报
回复
我在16楼给你发的串口例子,你没看???
於黾 2015-02-09
  • 打赏
  • 举报
回复
serialPort1.Read读取byte数组 不要读字符串
  • 打赏
  • 举报
回复
引用 16 楼 Z65443344 的回复:
先用串口调试助手等第三方工具发指令,看到底有没有反馈 如果能连上PLC程序,你可以看看它里面到底发生什么情况了,是否接收到了你发送的数据 严重怀疑是你波特率之类的设置错误了 而且你确定PLC不管接到什么玩意都会给你返回数据? 串口例子可以看看这个
现在我能触发读取方法了,但是我获取不到数据。 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) MessageBox.Show(serialPort1.ReadLine());这个读取不行 没反应。 写上 MessageBox.Show("ffffff"); 这个可以弹出来 证明有数据进来 触发了该方法。 求指教读取 16进制数据的方法。
firedphoenix 2015-02-08
  • 打赏
  • 举报
回复
先用串口调试软件,按已知的通讯协议发送指令,确定指定正确,PLC才有响应。 然后再写代码。测试代码时,可以开串口监听工具比如ACCESSPORT,以便确认你发出的指令到底是什么——其中发送前设下断点,就能看出了。
lfqsy 2015-02-05
  • 打赏
  • 举报
回复
没触发接收,看来你的COM不正常,没打开,没设置对,端口不正确
於黾 2015-02-04
  • 打赏
  • 举报
回复
先用串口调试助手等第三方工具发指令,看到底有没有反馈 如果能连上PLC程序,你可以看看它里面到底发生什么情况了,是否接收到了你发送的数据 严重怀疑是你波特率之类的设置错误了 而且你确定PLC不管接到什么玩意都会给你返回数据? 串口例子可以看看这个
  • 打赏
  • 举报
回复
引用 13 楼 Z65443344 的回复:
Read的时候也直接使用Read接收byte数组,而不是收到什么都当字符串处理
现在的问题是 我收不到他返回给我的数据 就是说 serialPort1_DataReceived 没触发,需要怎么设置呢?
  • 打赏
  • 举报
回复
引用 13 楼 Z65443344 的回复:
Read的时候也直接使用Read接收byte数组,而不是收到什么都当字符串处理
如果我只是发送给PLC一个“1” ,那不论是阿斯克码 还是 16进制数 都可以拿到吧?我们双方都不存在解析指令内容的问题,只要收到数据就触发操作。 我这边是点击按钮就发给他一个“1”,他那边是收到数据可以不解析内容就返回一串16进制数,然后我这边收到数据不解析内容就触发弹窗。就是这么一个流程。
於黾 2015-02-03
  • 打赏
  • 举报
回复
Read的时候也直接使用Read接收byte数组,而不是收到什么都当字符串处理
加载更多回复(12)

111,092

社区成员

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

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

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