VB与485多机通信,怎样设置第九位呢? 点击:10252 | 回复:15



daoguang25

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:8帖 | 6回
  • 年度积分:0
  • 历史总积分:35
  • 注册:2004年4月27日
发表于:2004-05-19 12:37:00
楼主
我现在用VB做串行通信(毕业设计)采用Mscomm控件,上位机怎么发送第九位数据呢? 如果采用settings=9600,8,m,1这样怎么确定发送地址第九位为1呢?Email:daoguang25@sina.com 谢谢高手指教! 下面是原理: 单片机多机通信系统是依靠第9位来进行的,主机在发送地址字节时是必须将第9位置1的,发送数据字节时必须将第9位置0。在单片机中有一个可编程的SM2位,当该位被置1时,单片机只能接收第9位为1的数据;当该位被置0时,单片机均能接收第9位为0或1的数据。利用此特性,在多机通信的开始时,主机将自己的SM2位置0,以保证能收到从机发来的任何9位数据,从机将自己的SM2位置1,用以接收主机发来的寻址字节。假设在这个系统中有1个主机和32个从机,开始时所有从机都在侦听主机发来的地址帧,假设主机想访问10号从机,那么主机首先将第9位(TB8位)置1,然后把字节10发出;所有的从机这时候都能收到地址帧10,然后和自己的编号比较,是10的话可以通信



GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2004-05-19 14:11:00
1楼
没错, 应该将 parity 设为 mark. 您可用示波器去量测实际发出的信号.

岁月流金

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 168回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2003年11月19日
发表于:2004-05-19 22:59:00
2楼
PC机的串行通讯接口是以8250为核心不见组成的。虽然8250本身并不具备MCS-51系列单片机的多机通讯功能,但通过软件的办法,可使得8250满足MCS-51单片机多机通讯的要求。8250可发送11位数据帧,这11位数据帧由一位起始位,八位数据位,一位奇偶校验位和一位停止位组成。MCS-51单片机多机通讯的数据帧格式就和8250的差在奇偶校验位上,用TB8来区分数据帧和地址帧。通过软件的方法可以编程8250的奇偶校验位,使得发送地址时为“1”,发送数据时为“0”,则8250的奇偶校验位完全模拟了单片机多机通讯的TB8位,这就是实现方法。但在VB中却不能设置为采用奇偶校验,这样的话地址和数据分不清,但Mscomm控件却不能设置。可以采用汇编语言来实现,若要求8250发送帧的奇偶校验位为“1”,只需执行 MOV DX,3FBH MOV AL,2BH OUT DX,AL 若要求8250发送帧的奇偶校验位为“0”,只需执行 MOV DX,3FBH MOV AL,3BH OUT DX,AL 我觉得在你发送地址帧之前可以把8250的奇偶校验位置1,发送数据帧时置0,这样就实现了多机通讯。但是我不知道在VB中是否支持汇编语言,VC中是肯定支持。 如果你做出结果的话,咱们一起讨论一下,共同进步吧。如果你有QQ的话我们可以在QQ上讨论。

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2004-05-20 10:32:00
3楼
多机通信应答问题 http://www.gongkong.com/tech/detail.asp?id=121906

岁月流金

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 168回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2003年11月19日
发表于:2004-05-20 13:41:00
4楼
请教GaryLin大侠,是不是在发送地址前重新设置一下CMSComm控件的Settings?发送地址时m_ctrlComm.SetSettings("9600,M,8,1"); 发送数据时m_ctrlComm.SetSettings("9600,S,8,1"),这样肯定会降低传输速度的,请问这样实现可否?另我所说的插入一段汇编语言是否可行?

GaryLin

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 1186回
  • 年度积分:0
  • 历史总积分:1263
  • 注册:2003年4月15日
发表于:2004-05-20 14:16:00
5楼
1. Parity 是设为 M/S(Mark/Space). 2. 改变输出模式前, 重设一下 Mark/Space, 对于效能来说应该不会有太大的影响吧! 3. VB 应该是无法插入汇编语言的. 4. 虽说 VC 中可以插入汇编, 但这仅限于 Win9x 系统. 而 Win NT/2K/XP/2003 下, 是不予许直接 I/O 的. 直接设定 MSComm, 应该就能达到目的.

岁月流金

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 168回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2003年11月19日
发表于:2004-05-20 14:23:00
6楼
谢谢GaryLin兄,这两天我做一个实验试一试,看行不行。

getdocument

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2004年6月25日
发表于:2004-06-25 11:45:00
7楼
在vc中设置一下CMSComm控件的Settings可以实现 在vb中好像不行 有谁实现了能告诉我吗 要注意那些问题啊

不辣老姜

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:111
  • 注册:2002年10月21日
发表于:2004-07-07 15:49:00
8楼
做串口编程可以使用MOXA 的PCOMM LIB库函数啊,使用起来很方便,如果需要可以到www.moxa.com.cn下载pcomm lite程序安装后你在安装目录就可以看到这些库函数了。

岁月流金

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 168回
  • 年度积分:0
  • 历史总积分:195
  • 注册:2003年11月19日
发表于:2004-07-08 11:01:00
9楼
VB也可以实现串口设置呀,都是settings属性。

danasun

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 7回
  • 年度积分:0
  • 历史总积分:19
  • 注册:2004年1月07日
发表于:2004-11-09 19:45:00
10楼
PC对多单片机通信时,在VC中我用“9600,m,8,1"发送地址,后改成“9600,m,8,1"来接收数据,结果正确;而在VB中同样用“9600,m,8,1"发送地址,后改成“9600,m,8,1"来接收数据怎地结果不对呀?!!help!!

人间一笑

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 18回
  • 年度积分:0
  • 历史总积分:18
  • 注册:2005年10月18日
发表于:2005-07-04 18:33:00
11楼
当要用到TB8时,关于VB的串口设置很麻烦. 因为VB发送数据时,发到第九位时才检测奇偶校验位,并根据"此时"奇偶校验位设置发送第九位.而不是以发送前的设置为准. 比如: 1: Dim Arr(0) As Byte 2: MSComm1.Settings = "9600,m,8,1" 3: Arr(0) = 1 4: MSComm1.Output = Arr 'Delay X 5: MSComm1.Settings = "9600,s,8,1" 6: Arr(0) = 1 7: MSComm1.Output = Arr 8: MSComm1.Settings = "9600,m,8,1" 此时发出是0/10000000/0/1*0/10000000/1/1, 而不是0/10000000/1/1*0/10000000/0/1. 因为执行第4行命令时,当发送到奇偶校验位时,第5行已经执行过了并将校验位改为"Space"了. 如果在第四行后面加上一个超过较长的延时X(比如超过16E4秒),就可能保证第4行的输出设置由第2行决定.但是如果延时X<15E秒,第4行的输出设置将由第5行决定.如果16E4秒>X>15E4秒,校验位有可能在1位的时间里出现有高有底的情况. 奇怪的是,如果用Timer来延时,延时后的数据位可能丢失,即不被发送了.

人间一笑

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 18回
  • 年度积分:0
  • 历史总积分:18
  • 注册:2005年10月18日
发表于:2005-07-04 18:38:00
12楼
16E-4秒和15E-4秒,Sorry.我的电脑是P4 2.26的,2000的系统.测试的时间16E-4秒和15E-4秒不一定很准.似乎和电脑的速度有关系.

紫禁城

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 8回
  • 年度积分:0
  • 历史总积分:8
  • 注册:2008年5月28日
发表于:2008-05-28 14:34:27
13楼
 做毕业设计的朋友,可以到www.art-control.com,下载DAM-3000系列或RTU系列产品,其中包括了部分VB下访问串口的例程
阿尔泰科技的技术支持人员也可以给您发送部分产品的串口通讯的VB演示程序

徐丽敏

  • 精华:10帖
  • 求助:0帖
  • 帖子:11帖 | 6回
  • 年度积分:0
  • 历史总积分:36
  • 注册:2008年8月06日
发表于:2008-08-06 12:54:38
14楼
诺博克(中国)工控产品维修中心专业芯片级主板维修:工业级全长卡、半长卡、嵌入式主板、网络安全主板、工业级底板等平板电脑与一体化工作站维修:黑屏、花屏、屏暗、整机不工作、键盘、通信不畅等各品牌工业级原装整机:不开机、死机、不认硬盘、键盘、通信不畅、安装不上各种软件等工业级电源:电源供电不稳定,电源不工作等。
主要产品:
工业计算机销售:
工业计算机平台Industrial PC Platforms
嵌入式计算机平台Embedded Computing Platfroms
平板电脑与一体化工作站Panel Computers &Industrial Workstations
网络安全平台Network Security Platforms
工业控制计算机原装整机Industrial PCs


诺博克(中国)工控产品维修中心

24小时服务电话:158 2188 4188

http://www.notblog.net.cn

崔磊

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2008年7月28日
发表于:2010-03-16 16:15:14
15楼
回复内容:
对:人间一笑 关于当要用到TB8时,关于VB的串口设置很麻烦. 因为VB发送数据时,发到第九位时才检测奇偶校验位,并根据"此时"奇偶校验位设置发送第九位.而不是以发送前的设置为准. 比如: 1: Dim Arr(0) As Byte 2: MSComm1.Settings = "9600,m,8,1" 3: Arr(0) = 1 4: MSComm1.Output = Arr ‘Delay X 5: MSComm1.Settings = "9600,s,8,1" 6: Arr(0) = 1 7: MSComm1.Output = Arr 8: MSComm1.Settings = "9600,m,8,1" 此时发出是0/10000000/0/1*0/10000000/1/1, 而不是0/10000000/1/1*0/10000000/0/1. 因为执行第4行命令时,当发送到奇偶校验位时,第5行已经执行过了并将校验位改为"Space"了. 如果在第四行后面加上一个超过较长的延时X(比如超过16E4秒),就可能保证第4行的输出设置由第2行决定.但是如果延时X<15E秒,第4行的输出设置将由第5行决定.如果16E4秒>X>15E4秒,校验位有可能在1位的时间里出现有高有底的情况. 奇怪的是,如果用Timer来延时,延时后的数据位可能丢失,即不被发送了. 内容的回复:



热门招聘
相关主题

官方公众号

智造工程师