我在做毕业设计,要用VB的MScomm控件进行PC与单片机的通讯。
但是貌似那个设计单片机固件程序的老师把协议材料给弄丢了,只剩下些已经编写过的通讯程序。我希望哪位编程达人能帮我推测下他的通讯协议内容,最好也帮我编程方法出出点子,谢谢各位了!
程序内容:
MSComm1.PortOpen = True ‘通讯模块打开
MSComm1.CommPort = 2 ‘通讯口打开
----------------------------------------------------------------
Private Sub Timer1_Timer()
buf = MSComm1.Input '将通信端输入的信号放入缓存器中
b1 = InStr(buf, "A") '输入信号中有标志位“A”,这样有利于信号的采集
b = Val(b1)
q1 = Mid(buf, b + 2, 8) '取标志位后的八位输入信号
Text1.Text = q1
End Sub
-----------------------------------------------------------------
q2 = Text9.Text
For ij = 0 To 7
aaa(ij) = Val(Mid(q2, ij + 1, 1))
Next ij
-----------------------------------------------------------------
'信号分离
''信号判断输出
For ij = 0 To 7
DD(ij) = 2 ^ (7 - ij)
If aaa(ij) = 1 Then
p(0) = p(0) Or DD(ij)
Else
DD(ij) = 255 - DD(ij)
p(0) = p(0) And DD(ij)
End If
Next ij
MSComm1.Output = p
End Sub
问题1. 程序接近最后使用了and,or来进行信号分离,但是and,or怎么来计算不是True,False的数字呢?
问题2.这个信号分离是什么意思?我可以用其他方法实现信号分离吗?
问题3.程序中在标志数A后面是空开一位再进行取数据的,那一位是停止位吗?协议中其他要求是什么?我只知道MSComm.Settings是使用默认值。
问题4.我使用的是MSComm的ComEvReceive事件来收集接收的数据。A是标志数,从接收到它开始取数据.
Case comEvReceive
ReceiveTemp = ReceiveTemp + MSComm.Input
If InStr(3, ReceiveTemp, "A") <> 0 Then
Call LoadInput
If Mid(ReceiveTemp, 2, InputAndOutputNumber + 1) <> InputValue Then
If Len(InputValue) = InputAndOutputNumber + 1 Then
InputValue = Mid(ReceiveTemp, 3, InputAndOutputNumber + 1)
Call ShowInput
Else
MsgBox "数据传输出错!"
ReceiveTemp = "A"
End If
End If
End If
InputValue是程序中存放输入数据的变量,InputAndOutputNumber是输入输出位数,ShowInput是将InputValue的值显示到窗体的子程序。
这样是否也可以进行数据接收呢?我这样就不需要Timer控件了。
拜托哪位给我答一下,希望哪位高手给我个答案!