VB与串行通信编程实例
代码如下:
Private Sub Command1_Click()
MSComm1.Output = "123456"
End Sub

Private Sub Form_Load()
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InputMode = comInputModeText
Text1 = ""
End Sub

Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvSend
Text1 = "comEvSend"
Case comEvReceive
Text1 = "comEvReceive"
Case comEvCTS
Text1 = "comEvCTS"
Case comEvDSR
Text1 = "comEvDSR"
Case comEvCD
Text1 = "comEvCD"
Case comEvRing
Text1 = "comEvRing"
Case comEvEOF
Text1 = "comEvEOF"
End Select
End Sub

以下参考MSDN
OnComm 常数
常数 描述
comEvSend 1 发送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 线变化。
comEvDSR 4 data-set ready 线变化。
comEvCD 5 carrier detect 线变化。
comEvRing 6 振铃检测。
comEvEOF 7 文件结束。

MSComm 控件提供下列两种处理通讯的方式:


事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在 Carrier Detect (CD) Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的确定响应。
SThreshold 属性
MSComm 控件设置 CommEvent 属性为 comEvSend 并产生 OnComm 事件之前,设置并返回传输缓冲区中允许的最小字符数。
说明
若设置 Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。若设置 St
hreshold 属性为 1,当传输缓冲区完全空时,MSComm 控件产生 OnComm 事件。
如果在传输缓冲区中的字符数小于 valueCommEvent 属性设置为 comEvSend,并产生 OnComm 事件。comEvSend 事件仅当字符数与 Sthreshold 交叉时被激活一次。例如,如果 Sthreshold 等于 5,仅当在输出队列中字符数从 5 降到 4 时,comEvSend 才发生。如果在输出队列中从没有比 Sthreshold 多的字符,comEvSend 事件将绝不会发生。

CommEvent 属性包含实际错误或产生 OnComm 事件的数码。注意,设置 Rthreshold Sthreshold 属性为 0,分别使捕获 comEvReceive comEvSend 事件无效。
以下是阿正发表于以下网址关于RS-232RS-485的说明:
iask.sina/b/625544.html?SHID=1154086044.682
RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。

RS-232采取不平衡传输方式,即所谓单端通讯.收、发端的数据信号是相对于信号地,如从DTE设备发出的数据在使用DB25连接器时是2脚相对7脚(信号地)的电平。

典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5+15V,负电平在-5-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。

接收器典型的工作电平在+3+12V-3-12V。由于发送电平与接收电平的差仅为2V3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/sRS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为37kΩ。所以RS-232适合本地设备之间的通信。

RS-485RS-232不一样,数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B,通常情况下,发送驱动器AB之间的正电平在+2+6V,是一个逻辑状态,负电平在-26V,是另一个逻辑状态。另有一个信号地C,在RS-485中还有一使能端。使能端是用于控制发送驱动器与传输线的切断与连接。当使能端起作用时,发送驱动器处于高阻状态,称作第三态,即它是有别于逻辑“1”“0”的第三态。 接收器也作与发送端相对的规定,收、发端通过平衡双绞线将AABB对应相连,当
在收端AB之间有大于+200mV的电平时,输出正逻辑电平,小于-200mV时,输出负逻辑电平。接收器接收平衡线上的电平范围通常在200mV6V之间。

Modbus协议分为modbus RTU ,modbus ASCII,modbus PLUS,其中modbus RTU modbus ASCII可运行在RS-485 RS-232上,modbus协议主要定义的是软件规约,RS-485RS-232定义的是硬件规约.
前一段时间主要做了几个小项目,都是单片机与PC机的串行通信,采用RS485,上位机采用VB6.0语言编写软件。
自己看VB有一段时间了,终于等到用的机会,现在学习的程度还可以完全够用。
单片机采用了51单片机,多机通信中采用了利SM2来区分是数据还是地址,效果还可以。其中RS485部分采用了隔离转换电路,采用高速光耦6N137,效果很好。
通信规则:
波特率9600  11位异步串行通信  1位起始位,8位数据位,1为地址/数据控制位  一位停止位 
  采用和校验不采用奇偶校验  地址、数据控制位是1为地址,0为数据。
例如实验采用2台下位机:
第一号机地址为01H
第二号机地址为02H
上位机程序流程:
1.      发送地址帧:A6+地址+
2.      简单的vb程序代码接受下位机应答:地址+0+校验和+
3.      若应答正确发送请求数据命令:A5+地址+
4.      上位机返回数据:A5+数据+校验和+
5.      上位机计算数据并显示
注:A6A5为命令起始字节。?为结束字节。初始化所有的从机都采用接受状态,接受上位机的数据判断若地址与本机相符,就清SM2否则继续监听。
实验中主要遇到了以下几个问题:
1.      建议PC机采用的RS232RS485转换头最好采用带隔离的那种,否则有时在实验室就能发现通信不正常现象。
2.      在上位机或下位机发送数据时发送的数据要采用延时,当发完数据后也要加一段延时再进行接收,而这些时间我发现不同的系统是不一样的,我是经过实验来确定的时间的。
3.      单片机中我采用的是中断的方式进行发送和接收。
4.      VB6.0中发送地址时控件MSCOMM控件采用9600,M,8,1然后改为9600,S,8,1状态准备接受单片机的数据,发送数据时就采用9600,S,8,1状态。
5.      在进行多机通信时发现有时发送数据出现错误,例如先进行一号机进行通信,通信正常,再通信2号机发现通信错误,通过仿真器观察2号机接受的数据不读,多接受数据的个数
不对,研究很长时间没有到病根,后来发现网上别人也出现过问题,不过他好像是改成查询方式就好了,而我最后在VB中采用了出错自动重发解决了这个问题。
6.  看了很多的电路图,都是在485的输出端冰上120欧的匹配电阻,这是对的,但是挂多机时要还挂个120的电阻形成回路,这个我实验时发现不对,只能挂一个120欧的电阻

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。