MScomm与RS-232通讯,具体代码--诚心请教

crystalkeathy 2008-05-24 05:00:38
用VB做的配料系统,现在界面部分已经基本完成,就差通讯和数据库报表查询~~头疼中
用MCSomm与RS-232通讯,具体过程如下
系统主要是控制六路斗秤下料,由在系统中输入所需料重后,点击“运行”斗秤的开关门电机控制关门——控制电震机震动——斗秤的称重传感器称重并返回数据,当数据和输入的数值相等时,电震机停止震动——称重传感器再次称重并输出到文本框——斗秤的开关门电机控制开门,等到称重传感器的值不再变化——斗秤关门,所有斗秤都关门(6路)——控制皮带电机转动,到达设定时间又开始新的一轮循环

称重的实际值如果和给定值有差值,能在下一次循环中补偿,能用数据库记录每次每一路的数值

并可以手动控制,比如点击“1号下料”1路电震机下料,点击“3号停止”3号电震机停止,点击“4号开门”四号斗秤开门,点击“6号关门”六号斗秤关门



部分通讯代码如下:
串口初始化模块:
Private Sub Form_Initialize()
MSComm1.CommPort=1 使用COM1口
MSComm1.Settings=”9600,N,8,1”
MSComm1.InputLen=0 输入时读整个缓冲区
MSComm1.PortOpen=True 打开端口
End Sub
数据读取及显示模块:
Private Sub Command1_Click()
Dim Instring As String 第一变量
MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3) 计算机发送指令(这句是什么意思?)Do While MSComm 1.inbuffercount<14 等待接收全部数据
Doevents
Loop
Instring=MSComm 1.Input 取重量数据并显示
Text1=Instring
End sub
退出模块:
Private Sub Form_QueryunLoad()
MSComm1.PortOpen=False 关闭端口
End sub

以上是我找到的参考论文中的代码,这个是不是只能控制称重部分?只是1路的?我需要6路,并且可以完成上述复杂控制
而且可以在无料的时候测试秤的重量(皮重)测量到的数值可以被保存,并且发送给称重传感器的数据=输入数据+所侧皮重(6路分别都是)

虚心求教完整代码及说明,本人对VB很菜,希望好心人帮忙~!!!!!!!!!!!!
我手里的所有分都拿出来了,谢谢谢谢谢谢谢~~~~~~~~~~~~~~~~~!!!!!!!!!QQ:71780622
...全文
603 点赞 收藏 59
写回复
59 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
PGB 2008-06-15
串口的物理接口在你这里有用的就3根线:RXD,TXD,GND。只要保证从机的TXD都接在PC的RXD上,从机的RXD都接在PC的TXD上,GND都接在一起,就可以保证在信号线压在RS-232标准范围内PC和各从机都可以通讯。当然,这些是做硬件的才需要知道的。

通讯协议你可以全部采用ASCII码方式进行,这样对于纠错还有一定帮助(收到非法ASCII码即判为通讯错误),而且在VB里很容易处理(就是做下面的模块的人用C写单片机程序会累点)。

PC发送:"A" & str(地址变量) & 指令 & str(数据) & vbKeyReturn
从机返回:str(数据) & vbKeyReturn

这种协议很方便实用,当时我用的Faulhaber(没拼错的话)电机控制器的传输协议也差不多就这个样子。你可以上网找找这个东西的资料,德国的空心杯电机公司。

比如你要3号设备开始抖100下,可以这么定:
"A3Shake100" & vbKeyReturn

再如要获得1号设备状态可以这么定:
"A1GetStatus0" & vbKeyReturn
然后在接受事件里面将返回的字符串取出来

现在信息大爆炸,在搜索引擎搜“串口通讯”这么模糊的字眼会有很多重复信息和垃圾信息的。我们学校都快答辩了,你还有事件做么?
回复
wangzhouasp 2008-06-12
看看。
回复
crystalkeathy 2008-06-12
[Quote=引用 48 楼 CityBird 的回复:]
看来你还没明白什么意思!问你两个简单的问题:

1、假定从计算机的串口发送一个0xFF表示启动你所有的开关门电机,问:你的这三个模块将如何接收这个0xFF,以及如何知道收到的是0xFF而不是别的?

2、假定计算机从串口收到一个0xDD表示称重传感器侧出来的重量,问:你的这三个模块如何将0xDD发送到计算机的串口上?
[/Quote]




要弄清楚这些东西需要看哪些方面的资料呢?????
我在百度上搜 串口通讯 什么的找不到相关知识
回复
zongaijun 2008-06-09
我也需要知道哦
回复
zyg0 2008-06-08
发送 chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)
会返回 14位结果 这是 通讯协议
回复
crystalkeathy 2008-06-05
这么写可以吗?


Private Sub commCOM_OnComm()
Select Case commCOM.CommEvent
Case comEvReceive
Dim DataReceived() As Byte

If commCOM.CommEvent = "#K:000000@" Then ‘所有的开关门都打开的话
commCOM.InputLen = 0

commCOM.OutBufferCount = 0


commCOM.Output = "#KZ:111111@" ’打开所有电振机
End If
If commCOM.CommEvent = "#KZ:111111@" Then ‘所有电振机都是开的

ReDim DataReceived(i) As Byte
DataReceived() = commCOM.Input
End If


Command1(12).Caption = DataReceived(0) ’将输入数据显示到6个按钮
Command1(13).Caption = DataReceived(1)
Command1(14).Caption = DataReceived(2)
Command1(15).Caption = DataReceived(3)
Command1(16).Caption = DataReceived(4)
Command1(17).Caption = DataReceived(5)

End Select
End Sub
-----------------------------------------------------------------

Public Function funSendCommand(Command As String) As Boolean
On Error GoTo lopError
'------------------------------------------------
Dim vResult() As Boolean

vResult(0) = Command1(6).Caption
vResult(1) = Command1(7).Caption
vResult(2) = Command1(8).Caption
vResult(3) = Command1(9).Caption
vResult(4) = Command1(10).Caption
vResult(5) = Command1(11).Caption

If Not commCOM.PortOpen Then
GoTo lopError
Else

With commCOM
.OutBufferCount = 0
.Output = "#AD@" + vResult ‘输出控制称重传感器和6个称重的数值
End With
End If
vResult = True
funSendCommand = vResult


For i = 6 To 11
For j = 12 To 17
frmindex.Controls("command" & j).Caption = "command" & i ‘当称重数值和给定值相同时
Next
End Sub
commCOM.OutBufferCount = 0
commCOM.Output = "#KZ:000000@" + "#K:111111@" + "#P:1" ’输出关闭所有电振机,打开所有秤门,打开皮带传输电机
Dim Start As Single

Start = Timer6 ‘延时
Do While Timer6 < Start + PauseTime
DoEvents
Loop
commCOM.Output = "#K:000000@" ’关闭所有秤门


'------------------------------------------------
Exit Sub
'----------------
lopError:
funSendCommand = False
End Sub




Public Function funGetData() As String
funGetData = vResult
End Function

Public Function funClearData()
vResult = ""
End Function
------------------------------------------------------------------------------------------


请问~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这么写可以吗?~~~~~~~~~~~~~~~~
回复
crystalkeathy 2008-06-05
这些问题我都不知道,我该看哪些方面的资料呢?
回复
crystalkeathy 2008-06-03
谢谢,能给个例子吗~~~~~~~~~~~~~~
回复
crystalkeathy 2008-06-03
呵呵,哪两个问题~~~~~~~~~~~~~~我都不知道~汗~~~~~~~~~~
回复
PGB 2008-06-03
所谓的6路12个设备其实用一个COM口就可以。关键是用地址区分好各个设备。我以前给别人写的通过串口控制配液仪的程序,按照配液仪的通讯协议与指令集,就是一个Com口控制n个配液仪的。每个设备都分配一个Com口既不现实也没必要。

用Com口通讯有个实时性的问题,这个比较不好解决。如果你的毕设可以改用CAN通讯的话(感觉现在好像太晚了),用CAN会舒服很多(我用CAN做数据采集毕设时候的感觉。不过我是软硬件都做)而且用CAN比较有所谓的“学术、技术含量”。只要买个周立功的CAN卡就很容易解决,PC端看通那几十页函数库说明就可以了。

不知道你那个模块是你们自己做的还是从外面买现成的。外面买现成的话应该在说明书上有通讯协议和指令集信息。以前我参加学校机器人队用的一个国外的电机控制器就是这么一个情况,附带一百多页的指令说明。

此外,D/A乃数模转换,D为数(Digital),A为模(Analog)。模数转换应为A/D,论文里不要弄错了。
你那导师估计也没打算让你做出实际东西来,本科毕设过不过关键还是看工作量。工作量够了,答辩没严重问题就过了。只要你那套通讯协议包括 发送:设备地址、设备指令、指令参数 接收:设备地址、设备返回类型、设备返回参数 基本上就算完成任务了。我们毕业那年碰上本科教育评估,毕设检查得特严,但最后凡是工作量够的都过去了。
回复
crystalkeathy 2008-06-02
呵呵~~~~~~~~~~~~~~~
感谢大家的帮助~~~~~~~~·

那我就听取大家的意见,随便弄代码吧

不过,要是我这个控制6个东西的,代码应该怎么改呢?

Private Sub Command1_Click()
Dim Instring As String
MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)
Do While MSComm 1.inbuffercount <14
Doevents
Loop
Instring=MSComm 1.Input
Text1=Instring
End sub

比如说这个
Instring=MSComm 1.Input
Text1=Instring

我需要把读到的六路数据放到六个命令按钮里显示

回复
crystalkeathy 2008-06-02
呵呵~~~~~~~~~~~~~~~
感谢大家的帮助~~~~~~~~·

那我就听取大家的意见,随便弄代码吧

不过,要是我这个控制6个东西的,代码应该怎么改呢?

Private Sub Command1_Click()
Dim Instring As String
MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)
Do While MSComm 1.inbuffercount <14
Doevents
Loop
Instring=MSComm 1.Input
Text1=Instring
End sub

比如说这个
Instring=MSComm 1.Input
Text1=Instring

我需要把读到的六路数据放到六个命令按钮里显示

回复
红叶哥 2008-06-02
好強呀
還沒注意到,這原來是畢業設計.
沒有硬件,怎麼知道收發是正確的.你老生也會一句一句的來確認嗎?
只要理論上OK,就沒問題了嗎?還得配合硬件的時序.

如果有硬件,想自己生出通訊協議不是沒有辦法.用試波器就可以解決,不過難度相當高,專業人員也得花不少時間.
回复
波导终结者 2008-06-02
不用演示,你就随便拷一点代码,反正根本没设备,你就说“点击此按钮,发XXXX,实现XXXX功能”,就行了,不用这么较真。
我还真没听过没下位机,就要上位机凭空生出通讯协议,还要把东西做出来的,你们是什么学校什么专业什么老师啊,服了。
回复
三楼の郎 2008-06-02
那你那个老师就是个白痴,这种问题本身就应该是控制模块的设计人员的事,是下位机硬件开发人员的工作,和你上位机的开发人员一点关系也没有,也不是你这个上位机的开发人员能定得了的!
回复
crystalkeathy 2008-06-02
我也和老师说了,但是老师说不用演示,但是必须做出来~~~~~~~~~哭~~~~~~~~~~
怎么我也要有些代码,像那么回事啊
回复
波导终结者 2008-06-02
[Quote=引用 4 楼 crystalkeathy 的回复:]
我没有硬件~!!!!我不设计硬件,所以没有厂商,自己也不会写。我只设计软件,也没有具体的使用者,是做毕业设计,把软件设计出来就行。
[/Quote]

既然是毕业设计,没有硬件,那串口通讯这部分根本就不要做,做了也没硬件演示,你直接跟老师说,因为硬件问题,暂时不能演示,你把软件界面、数据库设计还有功能那些介绍一下就可以过了。
你把时间花在界面设计啊,功能新增啊,数据库设计啊这些东西上,比搞这个协议划算多了。你搞出再牛的协议,你没硬件演示给老师看,根本就是白做。
回复
crystalkeathy 2008-06-02
自己写了一个,
命令以#开始,以@结束,以:分隔

斗秤开关量输出:
功能码:01 1BYTE 0X01
地址:01-06 1BYTE 0X01——0X06
1为打开,0为关闭 1BYTE 0X01——0X00

开关量输入(查询)
功能码:02 1BYTE 0X02
地址:01-06 1BYTE 0X01——0X06
1为以打开,0为已关闭 1BYTE 0X01——0X00

电振机开关量输出:
功能码:03 1BYTE 0X01
地址:01-06 1BYTE 0X01——0X06
1为打开,0为关闭 1BYTE 0X01——0X00

开关量输入(查询)
功能码:04 1BYTE 0X02
地址:01-06 1BYTE 0X01——0X06
1为以打开,0为已关闭 1BYTE 0X01——0X00


数字量输出
功能码:05 1BYTE 0X03
地址:01-06 1BYTE 0X01——0X06
输出数据 2BYTE 0X0000——0XFFFF

数字量输入(查询)
功能码:06 1BYTE 0X04
地址:01-06 1BYTE 0X01——0X06
输入数据 2BYTE 0X0000——0XFFFF

格式:#0X010X010X01@

不知道还有什么欠缺或者不合理的地方~~~?

如果按上面的协议

应该怎么写呢?要检查所有开关是否关闭——如果关闭——称重传感器测皮重并把重量用10进制值显示在6个文本框(已经用D/A转换为数字量)——打开所有电振机——检测6个斗秤的重量和给定值(6个命令按钮中(我用的命令按钮显示数据)的10进制数据)相同时,哪一路相同了,关闭哪一路的电震机,等待电震机都关闭了,测所有斗秤重量,返回显示到另外6个命令按钮中。同时打开斗秤开关门,等待所有料都下完——斗秤关门,开始下一周期
回复
红叶哥 2008-06-02
感覺在硬件通訊上全要靠假想來做這畢業設計
對於從計算機,到單片機,再到硬件,
再回到單片機,最後到計算機.
三則之間的關係,你得多下點功能了解

回复
三楼の郎 2008-06-02
看来你还没明白什么意思!问你两个简单的问题:

1、假定从计算机的串口发送一个0xFF表示启动你所有的开关门电机,问:你的这三个模块将如何接收这个0xFF,以及如何知道收到的是0xFF而不是别的?

2、假定计算机从串口收到一个0xDD表示称重传感器侧出来的重量,问:你的这三个模块如何将0xDD发送到计算机的串口上?
回复
加载更多回复
相关推荐
发帖
控件
创建于2007-09-28

1428

社区成员

VB 控件
申请成为版主
帖子事件
创建了帖子
2008-05-24 05:00
社区公告
暂无公告