串口读写问题

zjhz2014 2014-06-19 08:58:49
设备A通过485接线连接两个子设备A1和A2
A要接收A1和A2的数据,如果是不同时间内的数据接收,那处理没问题。
开一个线程,收到什么就处理什么。

但是 当A1和A2同时发送数据至A的时候
我想通过多线程让A接收, 可是领导说485是串口通讯,串口是串行的,无法并发
所以要么接收到A1的数据,要么接收到A2的数据
同时单独处理A1和A2的数据是不可能的

请问他这个说法对吗?我不能收到A1+A2的一串数据吗?然后把它分解成A1和A2,再单独处理



...全文
182 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
dabinnc 2014-06-19
  • 打赏
  • 举报
回复
485总线是 半双工的。同一时间只能有一个设备发送数据,要不会有冲突。 你可以上位机主动发送数据,下边的设备回复请求。
於黾 2014-06-19
  • 打赏
  • 举报
回复
引用 14 楼 zjhz2014 的回复:
[quote=引用 13 楼 L_lxc 的回复:] 你可以通过反馈字符串不一样来区分吧,A1设备反馈结尾加上A...标志,B1设备反馈结尾加上B...标志,通过字符串可以区分的啊
这个没法做。因为A1设备和A2设备都是第三方的产品,人家只管发送数据 而且发送过来的数据类型格式几乎一样的 比如 00104B3212 这种10位的数据 [/quote] 那你如何区分数据是谁发来的? 设备总要有个地址吧...
zjhz2014 2014-06-19
  • 打赏
  • 举报
回复
引用 13 楼 L_lxc 的回复:
你可以通过反馈字符串不一样来区分吧,A1设备反馈结尾加上A...标志,B1设备反馈结尾加上B...标志,通过字符串可以区分的啊
这个没法做。因为A1设备和A2设备都是第三方的产品,人家只管发送数据 而且发送过来的数据类型格式几乎一样的 比如 00104B3212 这种10位的数据
L_lxc 2014-06-19
  • 打赏
  • 举报
回复
你可以通过反馈字符串不一样来区分吧,A1设备反馈结尾加上A...标志,B1设备反馈结尾加上B...标志,通过字符串可以区分的啊
於黾 2014-06-19
  • 打赏
  • 举报
回复
当然这是在设备本身给你发了校验的前提下,你去验证这个校验 如果设备没有校验,你加上也没用. 一般设备会有设置有无校验和校验类型.
於黾 2014-06-19
  • 打赏
  • 举报
回复
串口校验通常有SUM(累加),CRC(modbusRTU),XOR(异或),LRC(modbusASCII) 因为干扰一般只会干扰传输中的1位,不大可能同时干扰多位并使干扰后的结果也刚好能符合校验 所以加校验一般可避免线路内(其他设备发数据)和线路外(比如有个380V的设备突然启动了)的干扰.
於黾 2014-06-19
  • 打赏
  • 举报
回复
引用 9 楼 zjhz2014 的回复:
[quote=引用 7 楼 Z65443344 的回复:] 不过还要看设备本身通信协议做的怎么样了. 如果就是很傻的隔一段时间就发送,就很有可能会出现我前面说过的情况 但是如果设备能够识别出线路上有其他设备在发送数据,从而自身进入等待状态,也可以正常通信. 不过如此一来,A1和A2根本不可能同时发数据,你开多线程接收是没有意义的. 而且你两个线程能同时打开COM1?同一个端口只能打开一次. 就算你用了2个线程同时监视COM1,你线程又如何分辨来的数据应该是哪个线程去处理? 所以说不要费那个劲了,根本没有意义.
对,你说的是对的 我这两个子设备A1和A2就是隔一段时间就发送数据过来(当然发送频率是不规律的,当A1和A2自己有触发的时候就发送数据到A)。我现在就是一个接收线程,接收A1和A2 我就怕A1和A2同时到达A,所以考虑用两个线程(根据你的解释,我明白了,我这里只有一个COM1端口能用,所以是根本无法打开两个接收线程的),这样的话,我一个接收线程很可能同时收到A1和A2的数据,看来处理的时候我得判断一下是不是同时到达(根据BYTE的位数判断一下是否同时到达,A1和A2正常情况只发送10位数据,如果A接收到20位数据那应该是A1和A2同时到达了) 谢谢你的解释,我理解了[/quote] 最好是再加个校验.TCP/IP的数据包校验是在底层实现的,所以socket去处理的时候可以认为数据包本身就是完整的且没有数据错误(TCP有自己的校验和错误重发机制) 而485通信如果不加校验,数据可能会受外界电磁波干扰,比如明明给你发的是01,你却收到个02 而且2个设备同时在一条线路上发数据,你很可能收到的并不是20个byte,而是10个或10几个,但是数据全部是错乱的. 你需要一个校验机制去判断数据是否合法.
zjhz2014 2014-06-19
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
不过还要看设备本身通信协议做的怎么样了. 如果就是很傻的隔一段时间就发送,就很有可能会出现我前面说过的情况 但是如果设备能够识别出线路上有其他设备在发送数据,从而自身进入等待状态,也可以正常通信. 不过如此一来,A1和A2根本不可能同时发数据,你开多线程接收是没有意义的. 而且你两个线程能同时打开COM1?同一个端口只能打开一次. 就算你用了2个线程同时监视COM1,你线程又如何分辨来的数据应该是哪个线程去处理? 所以说不要费那个劲了,根本没有意义.
对,你说的是对的 我这两个子设备A1和A2就是隔一段时间就发送数据过来(当然发送频率是不规律的,当A1和A2自己有触发的时候就发送数据到A)。我现在就是一个接收线程,接收A1和A2 我就怕A1和A2同时到达A,所以考虑用两个线程(根据你的解释,我明白了,我这里只有一个COM1端口能用,所以是根本无法打开两个接收线程的),这样的话,我一个接收线程很可能同时收到A1和A2的数据,看来处理的时候我得判断一下是不是同时到达(根据BYTE的位数判断一下是否同时到达,A1和A2正常情况只发送10位数据,如果A接收到20位数据那应该是A1和A2同时到达了) 谢谢你的解释,我理解了
於黾 2014-06-19
  • 打赏
  • 举报
回复
如果说处理数据很费时,需要开多线程 你可以接收数据用一个线程 处理数据另外开两个线程 数据接收到先放缓冲区里(比如全局的byte数组) 然后处理线程去缓冲区中取数据并处理 多线程对同一个对象操作要加锁,避免你处理了一半的时候数据变化了.
於黾 2014-06-19
  • 打赏
  • 举报
回复
不过还要看设备本身通信协议做的怎么样了. 如果就是很傻的隔一段时间就发送,就很有可能会出现我前面说过的情况 但是如果设备能够识别出线路上有其他设备在发送数据,从而自身进入等待状态,也可以正常通信. 不过如此一来,A1和A2根本不可能同时发数据,你开多线程接收是没有意义的. 而且你两个线程能同时打开COM1?同一个端口只能打开一次. 就算你用了2个线程同时监视COM1,你线程又如何分辨来的数据应该是哪个线程去处理? 所以说不要费那个劲了,根本没有意义.
zjhz2014 2014-06-19
  • 打赏
  • 举报
回复
引用 1 楼 L_lxc 的回复:
A1和A2不是2个端口号么? 分端口号接受有问题吗?
A1和A2是两个子设备,通过485线连接到主设备A的485接口上(A只有一个485接线口,所以相当于A1和A2是并在一起的) 端口号我这里开的是COM1, 主设备只能打开COM1端口接收,其它接口都接收不了。 所以实际是一个端口接了2个设备
於黾 2014-06-19
  • 打赏
  • 举报
回复
串口通信和以太网数据包不同 以太网数据包,即使多个客户端向服务端的同一个端口发送数据,网卡可以识别客户端的IP和端口,因此不会粘包 但是如果是485,不存在IP的概念,也没有交换机转发,数据都是实时的在2根线里传输,就会造成干扰 比如A1给你发010101,A2给你发020202 你可能收到的是010201020102,也可能收到的是乱码 假如你波特率设置的是9600,A1和A2同时发数据的时候,波特率相当于大了一倍,变成19200
zjhz2014 2014-06-19
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
不能. 串口通信A必须作为主站,A1和A2作为从站 就是A必须主动发送请求到A1或A2读取数据 如果A不发送请求,A1和A2主动向A发送数据,数据会互相干扰,无法收到有效数据
这个没有吧,我现在是A主动打开COM1端口,等待接收 A1和A2主动发送数据过来,A能正常收到。我就是没测试过A1和A2同时到达A,会不会出问题,没法测试啊。
於黾 2014-06-19
  • 打赏
  • 举报
回复
或者你可以将A1和A2分别连到A的两个串口上,比如COM1和COM2,就可以开多线程接收了
於黾 2014-06-19
  • 打赏
  • 举报
回复
不能. 串口通信A必须作为主站,A1和A2作为从站 就是A必须主动发送请求到A1或A2读取数据 如果A不发送请求,A1和A2主动向A发送数据,数据会互相干扰,无法收到有效数据
L_lxc 2014-06-19
  • 打赏
  • 举报
回复
A1和A2不是2个端口号么? 分端口号接受有问题吗?
於黾 2014-06-19
  • 打赏
  • 举报
回复
引用 17 楼 zjhz2014 的回复:
[quote=引用 16 楼 dabinnc 的回复:] 485总线是 半双工的。同一时间只能有一个设备发送数据,要不会有冲突。 你可以上位机主动发送数据,下边的设备回复请求。
我的应用环境是,必须下边的设备主动发送数据上来,如果上位机主动去发送数据,那么上位机太累了 下边的设备检测到某些场景,触发事件,就发送数据上来;如果上位机主动发,我并不知道下边设备什么时候检测到特定场景 [/quote] 太累?不会.它闲着也是闲着. 如果设备可以设置成从站,那么它应该会有个标识表示是否检测到某些场景. 而且为什么一定要纠结于某些场景呢,如果没有某些场景,获得数据会怎么样?
zjhz2014 2014-06-19
  • 打赏
  • 举报
回复
引用 16 楼 dabinnc 的回复:
485总线是 半双工的。同一时间只能有一个设备发送数据,要不会有冲突。 你可以上位机主动发送数据,下边的设备回复请求。
我的应用环境是,必须下边的设备主动发送数据上来,如果上位机主动去发送数据,那么上位机太累了 下边的设备检测到某些场景,触发事件,就发送数据上来;如果上位机主动发,我并不知道下边设备什么时候检测到特定场景

110,567

社区成员

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

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

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