c#串口上位机通信问题,无法触发接收数据事件的原因

艾薇儿More 2015-05-28 09:28:11
碰到一个很奇怪的事情,用C#自带的串口类,实例化对象后,注册数据回调事件,然后,按照通信原则,设置好相关的数据格式,打开串口,然后发送。发送是成功的,这个在助手上测试过,因为有返回数据,所以能显示出来。但是同理,用c#发送的时候,它连触发接收事件都没有。

然后,自己有开始用多线程延迟处理,发现读到的数据长度始终是0长度,而发送明明是成功的啊。搞了一下午还是没弄明白,或许初次用C#搞,也是第一次做,经验不足,希望各位大虾们帮助一下,感激不尽啊
...全文
1013 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
艾薇儿More 2015-05-29
  • 打赏
  • 举报
回复
引用 30 楼 Z65443344 的回复:
byte.TryParse(tempStr, System.Globalization.NumberStyles.HexNumber, null, out Program.TempByte[i]); 这只是把字符串按16进制转成字节罢了 如果你本来就是字节数组,就不需要转换的 如果你字节数组里真的和助手发送的一模一样,没道理不行的啊 助手界面上没写校验,应该是有个校验的选项,你点了之后弹出个窗口,再选是哪种类型的校验. 一般设备都需要校验的,要么CRC,要么SUM.否则很容易就数据错乱了. 检错但不能纠错 检错就足够了,起码不会按照错误的指令瞎执行,大不了出错了重发呗
感谢你的源码学习还是有效果的,就是数据发送的不对,事件可以正常触发了,剩下的就是细节问题,我自己慢慢搞吧。谢谢,十分感谢你,还有所有人。
艾薇儿More 2015-05-29
  • 打赏
  • 举报
回复
引用 32 楼 piaopiao_lucky 的回复:
串口通信就是不容易把握,你多试几种方法,如果有可能的话,看看硬件官方有没有提供可参考的程序,以前遇到过一个项目,就是官方提供的示例程序,拿过来就好用!
这个是自己的协议,没有官网可查的,依然感谢
  • 打赏
  • 举报
回复
串口通信就是不容易把握,你多试几种方法,如果有可能的话,看看硬件官方有没有提供可参考的程序,以前遇到过一个项目,就是官方提供的示例程序,拿过来就好用!
tcmakebest 2015-05-29
  • 打赏
  • 举报
回复
16进制和字符串是有区别的,楼主发送的东东明显弄错格式了.
largeskymengsk 2015-05-28
  • 打赏
  • 举报
回复
bushound,硬件调试的最佳助手。
於黾 2015-05-28
  • 打赏
  • 举报
回复
你先拿我发给你的程序当串口助手来测试一下.看到底是什么问题.
於黾 2015-05-28
  • 打赏
  • 举报
回复
mjp1234airen4385 2015-05-28
  • 打赏
  • 举报
回复
虽然,C#的串口用起来很方便。但有几次做项目,确实有问题。 你再多调试调试,实在不行,再换组件。
艾薇儿More 2015-05-28
  • 打赏
  • 举报
回复
引用 11 楼 Z65443344 的回复:
再就是看openport的时候串口波特率,数据位,校验位,停止位,都设置对了吗
这些我保证全都设定对了,,,完全和助手的一样,发送的都是16进制的,唯一纠结就是 数据返回怎么没有
於黾 2015-05-28
  • 打赏
  • 举报
回复
再就是看openport的时候串口波特率,数据位,校验位,停止位,都设置对了吗
於黾 2015-05-28
  • 打赏
  • 举报
回复
还用串口调试助手 先确定你发送的是16进制数据还是ASCII码,有选项的
艾薇儿More 2015-05-28
  • 打赏
  • 举报
回复
引用 8 楼 Z65443344 的回复:
如果Rx闪,但是事件不触发,说明你事件代码写的有问题了.你需要把如何注册事件的代码放出来看 正常你从工具箱里拖个SerialPort,然后在属性里双击DataReceive,就自动给你生成事件函数 如果你事件函数是手敲的,那么你需要代码注册这个事件
返回的灯不闪,,事件注册了,, 就是C#提高的代理,原因就在不返回的灯不闪,无数据
於黾 2015-05-28
  • 打赏
  • 举报
回复
如果Rx闪,但是事件不触发,说明你事件代码写的有问题了.你需要把如何注册事件的代码放出来看 正常你从工具箱里拖个SerialPort,然后在属性里双击DataReceive,就自动给你生成事件函数 如果你事件函数是手敲的,那么你需要代码注册这个事件
於黾 2015-05-28
  • 打赏
  • 举报
回复
USB转485设备,有2个指示灯 TX是发送,RX是接收 你先确定RX到底闪不闪,也就是说到底设备有没有返回数据
艾薇儿More 2015-05-28
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
必须发送字节数组 后面的发送方式是对的,但是你内容和上面字符串的内容也不符啊 字符串里以353500结尾 后面字节数组里 0x30,0x31,0x03,0x40};是要闹哪样
是这样的 40就是最后的了,后面多余的会自动不识别的,被注释的是标准的,上面是测试用的。因为通信是通过USB转485的,每次只要发对数据,它会闪一下,但是如果你第一次发错的话,第一会闪,以后就不闪,即使发的命令是对的。而我这个发送的话会一直闪,这个跟助手测试结果一直的都,唯一区别,是无法触发数据返回的事件,就是那个DataReceive。所以说命令是对的
於黾 2015-05-28
  • 打赏
  • 举报
回复
还有,不要把多条指令一下都发出去 必须分别发 串口协议要求指令之间至少要间隔3.5个字符传输周期
於黾 2015-05-28
  • 打赏
  • 举报
回复
你必须发送正确的指令,设备才会给你反馈数据 胡乱发些东西出去,设备不会应答的 因为实际应用中,串口可以并连许多设备 收到的数据不是给自己的,自己就必须沉默
於黾 2015-05-28
  • 打赏
  • 举报
回复
必须发送字节数组 后面的发送方式是对的,但是你内容和上面字符串的内容也不符啊 字符串里以353500结尾 后面字节数组里 0x30,0x31,0x03,0x40};是要闹哪样
艾薇儿More 2015-05-28
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
这个在助手上测试过,因为有返回数据,所以能显示出来 已经连接了实际的设备?就是说串口线已经接好了?
助手测试就是连接实际的设备,c#也是连接实际同样的设备,我是这样子,先统一命令,在助手测试时通过的,然后用c#去实现的,。
  sp.Write("02 3031 3030 30 30313031 433030303030 3030 30303031 03 400045345353500");
           //开启接收数据线程
         //  ReceiveData(sp);
       // byte[] datas ={ 0x02,0x30,0x31,0x30,0x30,0x30,0x30,0x31,0x30,0x31,0x43,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x03,0x40};
          // sp.Write(datas,0,datas.Length);
不知道是不是发的字符串的原因,我又试着发字节,效果一样,还是连接收事件触发不了
於黾 2015-05-28
  • 打赏
  • 举报
回复
这个在助手上测试过,因为有返回数据,所以能显示出来 已经连接了实际的设备?就是说串口线已经接好了?
加载更多回复(14)

111,098

社区成员

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

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

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