以下代码按固定时间间隔发送ASC在0-255数值的单字节,接收端收到511字节耗时间10.87s,除字节ASC为0,接收到1字节外,其它都为2字节。 Option Explicit Dim i As Integer Dim sj(0) As BytePrivate Sub Command1_Click() Timer1.Enabled = True Print Timer End SubPrivate Sub Command2_Click() Timer1.Enabled = False End SubPrivate Sub Form_Load() MSComm1.Settings = "9600,s,8,1" MSComm1.PortOpen = True Timer1.Interval = 5 Timer1.Enabled = False End SubPrivate Sub Timer1_Timer() sj(0) = i MSComm1.Output = sj i = i + 1 If i >= 256 Then Print Timer Timer1.Enabled = False i = 0 End If End Sub以下代码按固定时间间隔发送ASC在0-255数值的单字节与字节ASC为0单字节组成的双字节,接收端收到768字节耗时间10.55s,除第二字节ASC为0,接收到2字节外,其它都为3字节。 Option Explicit Dim i As Integer Dim sj(1) As BytePrivate Sub Command1_Click() Timer1.Enabled = True Print Timer End SubPrivate Sub Command2_Click() Timer1.Enabled = False End SubPrivate Sub Form_Load() MSComm1.Settings = "9600,s,8,1" MSComm1.PortOpen = True Timer1.Interval = 5 Timer1.Enabled = False End SubPrivate Sub Timer1_Timer() sj(1) = i MSComm1.Output = sj i = i + 1 If i >= 256 Then Print Timer Timer1.Enabled = False i = 0 End If End Sub
MSComm 控件的属性除CommPort 属性必须在打开端口之前设置,它的Settings 属性可以在运行中改变。关键是单片机的响应时间,上位机可瞬间改变Settings 属性,接收可在MSComm1_OnComm事件中完成. Option Explicit Dim strHex As StringPrivate Sub Command1_Click() Print Timer Dim sendSj() As Byte ReDim sendSj(1) sendSj(0) = &H1 sendSj(1) = &HA0 MSComm1.Settings = "9600,o,8,1" 'o奇校验 Print Timer MSComm1.Output = sendSj Print Timer MSComm1.Settings = "9600,e,8,1" 'e偶校验 ReDim sendSj(5) sendSj(0) = &HFF sendSj(1) = &HA0 sendSj(2) = &H1A sendSj(3) = &HA0 sendSj(4) = &H1B sendSj(5) = &HA0 Print Timer MSComm1.Output = sendSj Print Timer End SubPrivate Sub Form_Load() MSComm1.Settings = "9600,e,8,1" 'e偶校验 MSComm1.RThreshold = 1 MSComm1.InputMode = comInputModeBinary MSComm1.PortOpen = True End SubPrivate Sub MSComm1_OnComm() Dim buffer() As Byte Dim i As Integer Select Case MSComm1.CommEvent Case comEvReceive buffer = MSComm1.Input For i = 0 To UBound(buffer) strHex = strHex & Right("0" & Hex(buffer(i)), 2) Next '写数据处理代码 Text1 = strHex End Select End Sub
Option Explicit Dim strHex As StringPrivate Sub Command1_Click() Print Timer Dim sendSj() As Byte ReDim sendSj(1) sendSj(0) = &H1 sendSj(1) = &HA0 MSComm1.Settings = "9600,o,8,1" 'o奇校验 Print Timer MSComm1.Output = sendSj Print Timer MSComm1.Settings = "9600,e,8,1" 'e偶校验 ReDim sendSj(5) sendSj(0) = &HFF sendSj(1) = &HA0 sendSj(2) = &H1A sendSj(3) = &HA0 sendSj(4) = &H1B sendSj(5) = &HA0 Print Timer MSComm1.Output = sendSj Print Timer End SubPrivate Sub Form_Load() MSComm1.Settings = "9600,e,8,1" 'e偶校验 MSComm1.RThreshold = 1 MSComm1.InputMode = comInputModeBinary MSComm1.PortOpen = True End SubPrivate Sub MSComm1_OnComm() Dim buffer() As Byte Dim i As Integer Select Case MSComm1.CommEvent Case comEvReceive buffer = MSComm1.Input For i = 0 To UBound(buffer) strHex = strHex & Right("0" & Hex(buffer(i)), 2) Next '写数据处理代码 Text1 = strHex End Select End Sub
Dim Rec_Data as byte
Rec_data=MSComm1.Input
怎么判断第9位
http://zhidao.baidu.com/question/48607087.html?si=3
能否有帮助,不得而知.
一般来说,第 9 位不会是真正的数据,一般表示一种状态。RS-232 的数据位只能是 4-8 位,不可能设置为 9。此外,串口的缓存也是 8 位组,无法保存第 9 位。上位机发送第 9 位一般是通过 Parity 位,置为 Mark 或 Space。接收的时候,上位机应该是通过协议可以预知第九位的状态,并事先设置 Parity 属性、
MSComm1.Settings = "9600,n,8,1"
来接收。
发送字节第9位是1的话,单片机按S校验发送
发送字节第9位是0的话,单片机按N校验发送
以下是测试:
01 02 03 03 05 06 07 08 09 0A 0B 0C 0D 0E 0F
S校验 01FF 02FF 03FF 04FF 05FF 06FF 07FF 08FF 09FF 0AFF 0BFF 0CFF 0DFF 0EFF 0FFF
O校验 01FF 02FF 03 04FF 05 06 07FF 08FF 09 0A 0BFF 0C 0DFF 0EFF 0F
E校验 01 02 03FF 04 05FF 06FF 07 08 09FF 0AFF 0B 0CFF 0D 0E 0FFF
10 20 30 40 50 60 70 80 90 A0 B0 C0 D0 E0 F0
S校验 10FF 20FF 30FF 40FF 50FF 60FF 70FF 80FF 90FF A0FF B0FF C0FF D0FF E0FF F0FF
O校验 10FF 20FF 30 40FF 50 60 70FF 80FF 90 A0 B0FF C0 D0FF E0FF F0
E校验 10 20 30FF 40 50FF 60FF 70 80 90FF A0FF B0 C0FF D0 E0 F0FF表格数据说明第9位是1接收到2字节,第9位是0,接收到1字节。
你的想法是对的 赞一个先
Option Explicit
Dim i As Integer
Dim sj(0) As BytePrivate Sub Command1_Click()
Timer1.Enabled = True
Print Timer
End SubPrivate Sub Command2_Click()
Timer1.Enabled = False
End SubPrivate Sub Form_Load()
MSComm1.Settings = "9600,s,8,1"
MSComm1.PortOpen = True
Timer1.Interval = 5
Timer1.Enabled = False
End SubPrivate Sub Timer1_Timer()
sj(0) = i
MSComm1.Output = sj
i = i + 1
If i >= 256 Then
Print Timer
Timer1.Enabled = False
i = 0
End If
End Sub以下代码按固定时间间隔发送ASC在0-255数值的单字节与字节ASC为0单字节组成的双字节,接收端收到768字节耗时间10.55s,除第二字节ASC为0,接收到2字节外,其它都为3字节。
Option Explicit
Dim i As Integer
Dim sj(1) As BytePrivate Sub Command1_Click()
Timer1.Enabled = True
Print Timer
End SubPrivate Sub Command2_Click()
Timer1.Enabled = False
End SubPrivate Sub Form_Load()
MSComm1.Settings = "9600,s,8,1"
MSComm1.PortOpen = True
Timer1.Interval = 5
Timer1.Enabled = False
End SubPrivate Sub Timer1_Timer()
sj(1) = i
MSComm1.Output = sj
i = i + 1
If i >= 256 Then
Print Timer
Timer1.Enabled = False
i = 0
End If
End Sub
Option Explicit
Dim strHex As StringPrivate Sub Command1_Click()
Print Timer
Dim sendSj() As Byte
ReDim sendSj(1)
sendSj(0) = &H1
sendSj(1) = &HA0
MSComm1.Settings = "9600,o,8,1" 'o奇校验
Print Timer
MSComm1.Output = sendSj
Print Timer
MSComm1.Settings = "9600,e,8,1" 'e偶校验
ReDim sendSj(5)
sendSj(0) = &HFF
sendSj(1) = &HA0
sendSj(2) = &H1A
sendSj(3) = &HA0
sendSj(4) = &H1B
sendSj(5) = &HA0
Print Timer
MSComm1.Output = sendSj
Print Timer
End SubPrivate Sub Form_Load()
MSComm1.Settings = "9600,e,8,1" 'e偶校验
MSComm1.RThreshold = 1
MSComm1.InputMode = comInputModeBinary
MSComm1.PortOpen = True
End SubPrivate Sub MSComm1_OnComm()
Dim buffer() As Byte
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
buffer = MSComm1.Input
For i = 0 To UBound(buffer)
strHex = strHex & Right("0" & Hex(buffer(i)), 2)
Next
'写数据处理代码
Text1 = strHex
End Select
End Sub
Dim strHex As StringPrivate Sub Command1_Click()
Print Timer
Dim sendSj() As Byte
ReDim sendSj(1)
sendSj(0) = &H1
sendSj(1) = &HA0
MSComm1.Settings = "9600,o,8,1" 'o奇校验
Print Timer
MSComm1.Output = sendSj
Print Timer
MSComm1.Settings = "9600,e,8,1" 'e偶校验
ReDim sendSj(5)
sendSj(0) = &HFF
sendSj(1) = &HA0
sendSj(2) = &H1A
sendSj(3) = &HA0
sendSj(4) = &H1B
sendSj(5) = &HA0
Print Timer
MSComm1.Output = sendSj
Print Timer
End SubPrivate Sub Form_Load()
MSComm1.Settings = "9600,e,8,1" 'e偶校验
MSComm1.RThreshold = 1
MSComm1.InputMode = comInputModeBinary
MSComm1.PortOpen = True
End SubPrivate Sub MSComm1_OnComm()
Dim buffer() As Byte
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
buffer = MSComm1.Input
For i = 0 To UBound(buffer)
strHex = strHex & Right("0" & Hex(buffer(i)), 2)
Next
'写数据处理代码
Text1 = strHex
End Select
End Sub