同学让我帮他们单位做个背景软件!
主要功能就是显示从单片机中发出的数据!
我详细说一下要干什么:
1、一共有六个单片机。
2、计算机发出一个低电平,一段时间后(这段时间一直保持低电平)送出数据,呼叫某个单片机。
3、单片机收到信号后,与自身的指比较。与这个信号对应的单片机开始发送数据,我这边开始接受。
4、单片机发送数据结束后,在发送一个结束信号,计算机得到这个结束信号后,在呼叫下一个单片机,如此循环下去...我用mscomm开发,现在遇到几个问题:
1、用mscomm可以发送搞/低电平么?而且要保持低电平的时间是1.5位那么长!(这点最关键)
2、用mscomm接收到二进制怎么转换成十进制显示呀?
最好有点码,谢谢了
主要功能就是显示从单片机中发出的数据!
我详细说一下要干什么:
1、一共有六个单片机。
2、计算机发出一个低电平,一段时间后(这段时间一直保持低电平)送出数据,呼叫某个单片机。
3、单片机收到信号后,与自身的指比较。与这个信号对应的单片机开始发送数据,我这边开始接受。
4、单片机发送数据结束后,在发送一个结束信号,计算机得到这个结束信号后,在呼叫下一个单片机,如此循环下去...我用mscomm开发,现在遇到几个问题:
1、用mscomm可以发送搞/低电平么?而且要保持低电平的时间是1.5位那么长!(这点最关键)
2、用mscomm接收到二进制怎么转换成十进制显示呀?
最好有点码,谢谢了
解决方案 »
- 请教高人如何使用 Excel VBA设置数据线的宽度
- 用vb对指定路径下的文件进行读取后保存
- 如何改变Msgbox中"确定"和"取消"的选择光标
- 关于获取活动窗体句柄======================急==================在线等待===========回答就给分
- 面试题,紧急求救,马上给分
- 水晶报表9运行产生的临时文件如何清除
- 讨论,VB程序员到了非常关键的时刻,我们应该怎么做?
- 如何使VB运行出现错误的时候留在窗口,而不是直接退出
- 如何用VB程序来实现动化? 谢谢!!!
- 要做一个程序比较紧,有点关于Wsock疑问,请大家赐教,高分求教!
- Datereport的问题
- 请教各位,怎么用SQL语句添加布尔型字段?
或自己写主板上的并口
可以用并口也可用串口
单片机用什么口,你就用什么口
单片机用485,你也可用232,不过要用到485/232转化头
能具体点么
一个串口最好只和起控制作用的单片机(A)通讯,用A来控制选择与具体的哪一个单片机交换数据.关于高低电平的问题,不要用MSComm来搞,把它交给A来处理,而计算机用约定好的指令来控制这个A:比如让它选择哪个单片机,发送什么数据等.关于二进制数据到十进制数据的转换:
比如对于二进制10000001(&H81)对应显示十进制为129,可参见下面的过程
Private Function ctrByte2StringD(ByVal bytSrc As Byte, ByRef strDest As String) As Boolean
On Error GoTo ErrHandler
Dim blnR As Boolean
Dim bytT As Byte, lngI As Long, lngT As Long
Dim strT As String
strDest = ""
'因为一个Byte最多表示到255,所以选择2做为初始条件
For lngI = 2 To 0 Step -1
bytT = Fix(bytSrc / (10 ^ lngI))
bytSrc = bytSrc Mod (10 ^ lngI)
'此处可以判断如果为0时不进行累加
strDest = strDest & CStr(bytT)
Next
blnR = True
ErrHandler:
If Err Then
'DbDisplayError "ctrByte2StringD"
blnR = False
End If
ctrByte2StringD = blnR
End Function
to AechoJohn(江江) :谢谢了!可是硬件环境已经定下来了,用低电平触发单片机的事情就有我这边来做!没办法!应该怎么办呀?
mscomm接收到二进数后,无需操作,系统自动转换成10进数。
Carrier Detect (CD) 线?Clear To Send (CTS) 线?Data Set Ready (DSR) 线?Data Terminal Ready (DTR) 线?Request To Send(RTS)?
是不是你只用了3根:Vcc,GND,数据。这样的话,肯定没法保持的。如果是高电平,会出现什么问题?
我现在能够收到数据和发送数据!但同学昨天让我加上输出高低电平的功能!
我不知该怎么实现,不会前功尽弃吧!
这个活对我很重要!
分不够可以在加!
麻烦大家了!
你是用mscomm,就是串口方式,这方法错误,他那边!
MSCOMM1.RTSEnable = True
适当延时
MSCOMM1.RTSEnable = FALSE
单片机用开中断方式,当RXD(P3.0)上有数据到达时,会产生中断,进入中断服务
单片机用开中断方式,当RXD(P3.0)上有数据到达时,会产生中断,进入中断服务
串行口控制寄存器SCOM(98H)上的98H.0是接收中断标识位,98H.1是发送中断标识位。
所以没有必要置高低电平----除非有别的目的----有的话,得再加一条线,来做标志线,否则
数据位不可能实现
你的意识是:由于串行中断,我发过去单片机应该能接到,是把?如果要发高低电平的话,必须要在开一个口(一共九个,现在用到三个)来传输,不能只用2、3、5这三个口是吧?
其实让 数据线 保持低电平或高电平也不是不可能的。比如单片机要实现数据线的高低电平保持实在是easy,可是在计算机上,你要用vb,尤其是用vb的mscomm控件,那是很难,方法就是再加
线,要在计算机上实现就要访问硬件,也就是说操作串口(访问串口驱动),用api肯定能实现。而相比 修改单片机部分就简单多了,推荐。
或者是直接bit通信,还要明白这是串行,还是并行通信。
在windows平台开发bit流的通信是不可靠的(它是消息机制,时间无法控),用纯DOS环境汇编开发,还算可以。我们公司一般做一个中间硬件板卡,一端为标准485口,一端为bit流
DSR:此脚位由单片机控制,他用这支脚位的高电位通知计算机一切准备就绪,可以传送数据过来。
RTS:此脚位由计算机控制,用以通知单片机马上传送数据至计算机;而当单片机收到此信号后,便会将数据传送给计算机。
CTS:此脚位由单片机控制,用以通知计算机将预传送的数据送至单片机;当计算机收到此脚位的讯号,即将准备送出的数据送至单片机。所以你只需控制mscomm1.DTREnable=true 和mscomm1.RTSEnable=true 即可
zpwly(选你所爱,爱你所选) to tangyang8061(大保姆):
“你的意识是:由于串行中断,我发过去单片机应该能接到,是把?如果要发高低电平的话,必须要再开一个口(一共九个,现在用到三个)来传输,不能只用2、3、5这三个口是吧?”
三条线!
你以为你很聪明吗?:(
我当然知道怎么设置了,要不然我早失业了
要实现你的功能也不难。
多看看书。
串口第五脚是地线。
我现在才发现我确实笨的可以,能不能麻烦您老多废点口水开导开导我:
DTR、DSR、RTS、CTS 在串口9针D形口上的编号分别是什么?他们是几根线,如果您老还没有失业的话,最好抓张图教教我这个菜鸟所有的引脚的定义,名称、作用等等... ...
我在期待您的“帮助”,希望您不吝赐教。
还有个重要的问题,就是只用2、3、5引脚的电平触发,也就是楼主的问题,如果您能够的解决的话,能给大家看看代码操作吗?非常感谢!非常感谢!
Pin2 RXD 接收字符(Receive)。
Pin3 TXD 传送字符(Transmit)。
Pin4 DTR 数据端备妥(Data Terminal Ready)。
Pin5 GND 地线(Ground)。
Pin6 DSR 数据备妥(Data Set Ready)。
Pin7 RTS 要求传送(Request To Send)。
Pin8 CTS 清除以传送(Clear To Send)。
Pin9 RI 响铃侦测(Rind Indicator)。用不用把25针的也给你写上?
根据串口每针的含义控制Mscomm1.DTREnable=true 、Mscomm1.RTSEnable=true
Mscomm1.CTSHolding=True 、MSComm1.DSRHolding=true
根据串口每针的含义控制Mscomm1.DTREnable=true 、Mscomm1.RTSEnable=true
Mscomm1.CTSHolding=True 、MSComm1.DSRHolding=true
Private Sub Form_Load()
MSComm1.CommPort = 2 '使用COM2。
MSComm1.Settings = "2400,N,8,1"
MSComm1.InputLen = 0
MSComm1.PortOpen = True
End SubPrivate Sub Form_Click()
Text1.Text = MSComm1.Input '从串行端口读内容。
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False
End Sub
但要是字节,就会收乱码
Private Sub Form_Load()
MSComm1.CommPort = 2 '使用COM2。
MSComm1.Settings = "2400,N,8,1"
MSComm1.InputLen = 0
Mscomm1.inputmode=1
Mscomm1.Rthreshold=1
MSComm1.PortOpen = True
End SubPublic Sub MSComm1_OnComm()
Dim Buffer As Variant
Dim i As Integer
' 依据 CommEvent 属性进行分支
Select Case MSComm2.CommEvent
' 事件信息
Case comEvReceive
i = MSComm1.InBufferCount
Buffer = MSComm1.Input
ShowData txtTerm, (StrConv(Buffer, vbUnicode)), Buffer, i
end select
end sub
Private Static Sub ShowData(Term As Control, Data As String, Buffer As Variant, DataLenth As Integer)
On Error GoTo Handler
Const MAXTERMSIZE = 320000
Dim TermSize, i As Long
Dim s2 As String
Dim s1 As Byte
Dim n3, n1, n2, StrLen As Integer
' DoEvents
' 确定现存的文本不会太大。
TermSize = Len(Term.Text)
If TermSize > MAXTERMSIZE Then
Term.Text = Mid$(Term.Text, 4097)
TermSize = Len(Term.Text)
End If
For n3 = 0 To DataLenth - 1
s1 = Buffer(n3)
s2 = Hex(s1)
s2 = "0" & s2
s2 = Right(s2, 2)
Term.SelText = s2 & " "
Term.SelStart = Term.SelStart + 3
HexWhere = HexWhere + 3
If HexWhere > HexWhid * 3 - 2 Then
Term.Text1.SelText = Chr(13) & Chr(10)
Term.Text1.SelStart = Term.SelStart + 2
HexWhere = 0
End If
Next n3
end sub
这样就可以接收字节了
这可是你说的啊(等这句话等了半天了,呵呵):
"你需要完整的9针串口根据串口每针的含义控制Mscomm1.DTREnable=true、Mscomm1.RTSEnable=true Mscomm1.CTSHolding=True 、MSComm1.DSRHolding=true "
哦,你既然知道 3针是不行的。而 楼主都说了:
2003-7-25 17:16:41 zpwly(选你所爱,爱你所选):
“to tangyang8061(大保姆): 你的意思是:由于串行中断,我发过去单片机应该能接到,是把?如果要发高低电平的话,必须要在开一个口(一共九个,现在用到三个)来传输,不能只用2、3、5这三个口是吧?”
注意上面括号里的:“现在用到三个”,而且这是在你说下面这些话之前楼主说的吧!?
2003-7-28 8:39:50 startvb(共同学习) :
“所以你只需控制mscomm1.DTREnable=true 和mscomm1.RTSEnable=true 即可”
难道“现在只用三个”,“只需控制mscomm1.DTREnable=true scomm1.RTSEnable=true 即可”就能行???
我说的:
“你知道他的通讯用了几条线吗?”就是针对上面的这些说的:人家楼主都说了3针了,你还在吆喝什么只需控制什么什么即可,能吗?你没理解?我的中文一向不好?不过也够清楚了吧!?难道你是留学生?
另:如果不嫌麻烦的话,嘿嘿,最好把25针的也列出来。我资料不在手头,刚好需要参好参考,感激不尽。
老大,要镇静,呵呵
MSComm1.Settings = "2400,M,8,1" '<-据说这样可以发出串行字节的第九个位,这九位的编码就是用来做地址的,单片有专门处理这个位的指令,你可以去看一下,这样做效果会比较好,但我也是听说的,没弄过,只好自己找资料啦,至少这样最多可以有256台单片机来通讯