C# 串口DataReceived始终不触发,但是用串口助手能够正常接收数据

yaoxiaofei1220 2020-12-08 09:25:19
最近在与三菱PLC(FX3U)通信时用到了RS485通信(用485转232转换器连接到PC串口端口上),
PLC发送数据为(0x0A 0x06 0x00 0x01 0x00 0x01 0x18 0xB1),
在测试时,碰到以下问题:

1.用串口助手可以正常收到PLC发出的数据,但是用c#写的串口功能,始终收不到数据(注册的DataReceived事件始终没有触发)。
2.尝试不注册DataReceived事件,改用循环主动读取(对应以下Scan方法代码),能够获取到_serialPort.BytesToRead=8,但是读到的数据都是无效数据(0x3F 0x3F 0x3F 0x3F 0x3F 0x3F 0x3F 0x3F)。


在论坛查了一些类似问题后,尝试在初始化时分别将DTREnableRTSEnable设置为True,但是测试下来没有效果。

如果有朋友了解或碰到这个问题,还请不吝指教,您的建议或许可以帮我解决这个大问题。

以下为相关代码:

		//串口初始化
public void Initialize()
{
_serialPort.PortName = "COM1";
_serialPort.BaudRate = 19200;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.Two;
_serialPort.Parity = Parity.Odd;
_serialPort.ReadTimeout = 3000;
_serialPort.WriteTimeout = 3000;

//尝试分别将RtsEnable和DtrEnable设置为True,但是没有效果
//_serialPort.RtsEnable = true;
//_serialPort.DtrEnable = true;
//_serialPort.Handshake = Handshake.None;

_serialPort.ReadBufferSize = 8;
_serialPort.ReceivedBytesThreshold = 1;
_serialPort.DataReceived -= CommDataReceived;
_serialPort.DataReceived += CommDataReceived;

_serialPort.Open();
}


//数据监听
private void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
{
int len = _serialPort.BytesToRead;
Byte[] readBuffer = new Byte[len];
_serialPort.Read(readBuffer, 0, len);
}


//主动读取数据
private void Scan()
{
while (true)
{
int len = _serialPort.BytesToRead;
//在主动读取时,能够获取到len为8,但是读到的数据为无效数据(0x3F 0x3F 0x3F 0x3F 0x3F 0x3F 0x3F 0x3F)
if (len >= 8)
{
Byte[] readBuffer = new Byte[len];
_serialPort.Read(readBuffer, 0, len);
}
Thread.Sleep(30);
}
}
...全文
4658 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fiona&fairy 2022-09-20
  • 打赏
  • 举报
回复

我也遇到了这个问题,.用串口助手可以正常收到PLC发出的数据,但是用c#写的串口功能,始终收不到数据(注册的DataReceived事件始终没有触发)。
我也是试了主动读取数据全部都是0x3F

但是我试了DtrEnable或者RtsEnable为True, 没有效果,而且串口助手里面能收到数据,也没有配置这两个值。
有大神知道什么原因吗?

yaoxiaofei1220 2020-12-09
  • 打赏
  • 举报
回复 1
问题解决了,经过测试,以上问题可以通过设置DtrEnable或者RtsEnable为True解决; 之前不知道是什么原因导致设置后没有效果,但是PC重启后再测试,就能正常接受数据了; 感谢各位帮忙!
yaoxiaofei1220 2020-12-08
  • 打赏
  • 举报
回复
引用 4 楼 glen30 的回复:
_serialPort.BaudRate = 19200; _serialPort.DataBits = 8; _serialPort.StopBits = StopBits.Two; _serialPort.Parity = Parity.Odd 确认这些参数设置和串口助手一致吗? 串口助手的默认设置不是这样的,是不是设置了校验位后,接收的数据校验失败导致没有进入接收处理函数?
参数的配置和串口助手保持一致,设备发送的也是同一条指令,但是串口助手能够正常接收,但是自己写的功能无法正常接收
yaoxiaofei1220 2020-12-08
  • 打赏
  • 举报
回复
引用 2 楼 Hobo丶 的回复:
在本PC虚拟串口调试可以的传输,说明可以接收。 用正式设备获取不了,可以看下波特率等等这些的配置是不是对的。 因为串口的代码就一些配置,然后打开串口而已,没有其他的了。
配置参数确认过,和设备保持一致
andy_wanhl 2020-12-08
  • 打赏
  • 举报
回复
这个遇到过,时间过去太久了。好像是跟硬件相关。有的不支持USB插口。
ziqi0716 2020-12-08
  • 打赏
  • 举报
回复
截图你的串口助手工具的设置参数来看看
glen30 2020-12-08
  • 打赏
  • 举报
回复
_serialPort.BaudRate = 19200;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.Two;
_serialPort.Parity = Parity.Odd

确认这些参数设置和串口助手一致吗?
串口助手的默认设置不是这样的,是不是设置了校验位后,接收的数据校验失败导致没有进入接收处理函数?
wanghui0380 2020-12-08
  • 打赏
  • 举报
回复
看看,波特率,停止位设置是否正确 至于你用8作为判定条件,然后说数据不对。这个逻辑有问题,stream是连续的,而且读到了就移除了,所以如果是8+8,前读3被扔掉,后读9你认为不对,其实他是对的
Hobo丶 2020-12-08
  • 打赏
  • 举报
回复
在本PC虚拟串口调试可以的传输,说明可以接收。 用正式设备获取不了,可以看下波特率等等这些的配置是不是对的。 因为串口的代码就一些配置,然后打开串口而已,没有其他的了。
yaoxiaofei1220 2020-12-08
  • 打赏
  • 举报
回复
补充一下,在测试时,在本机(PC端)配置虚拟串口对(COM3-COM4),通过虚拟的串口之间,可以正常接收到数据。
liuding214cs 2020-12-08
  • 打赏
  • 举报
回复
之前遇到过同事出现过这个问题,你看下是不是你的serialPort对象new了两次
李时珍地皮 2023-06-29
  • 举报
回复
@liuding214cs 感谢感谢,确实是new了两次
「已注销」 2020-12-08
  • 打赏
  • 举报
回复
你下位机是不是设置了接收到换行符才给上位机发送数据?如果是这样的话, 上位机发送指令时要在后面加换行符'\r', 串口调试助手是默认勾上了这个选项的
glen30 2020-12-08
  • 打赏
  • 举报
回复
https://blog.csdn.net/chenhongwu666/article/details/40142513?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase

试下这个呢

111,131

社区成员

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

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

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