串口通信问题的模拟与实际怎么不一致?

dh243210877 2012-09-14 09:22:57
我编写了一个串口通信程序,和串口调试助手可以正常通信。但是连接上实际的设备之后无法通信,是哪的问题请大家帮忙解决一下!不胜感激.
...全文
389 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
现在还是人类 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 的回复:]

C语言倒是学了点,但是实际中根本没用过。感觉会写点程序,但是除了单片机其他根本就没用过。
[/Quote]
用过单片机写mcu上的程序你应该更加容易写pc的程序呀,看看我给你的例子你应该能理解的。
sosoben 2012-09-27
  • 打赏
  • 举报
回复
还有 今天我也试过一个测量仪器通信, 发觉要有开始信号和结束信号 最后还要一个BCC校验码(按位取XOR)

后来经过试验 只需要output= CHR(2) & data & chr(3)&"00" 就行了,根本不需要正确的BCC校验码,但是没有这两个00就是不行

看看对楼主有没有启示?

其实很多向仪器发送单个字符 也是按ASCII码相对应的16进制发送的啊,不需要特别发送16进制
dh243210877 2012-09-27
  • 打赏
  • 举报
回复
C语言倒是学了点,但是实际中根本没用过。感觉会写点程序,但是除了单片机其他根本就没用过。
dh243210877 2012-09-27
  • 打赏
  • 举报
回复
嗯,主要我是学硬件的,自学了一点VB,怕自己编程基础不够啊!许多软件方面东西都不怎么懂,所以不太敢碰。呵呵!
现在还是人类 2012-09-25
  • 打赏
  • 举报
回复
做小程序玩玩可以,如果你真想把这种东西运用到工程里,建议换 VC 来做把,这种建议是有依据的,不相信你可以看看你在搞平凡的串口通讯时的 CPU 占用率就明白了。如果工程中同时还需要处理图形、网络、数据库等资源,这样的工程是没法继续下去的。建议采用多线程处理方案,但因为 VB 对多线程处理起来比较复杂,很难做到兼容性、稳定性比较好的程度,所以建议使用 C 语言来开发,效率高,稳定性也不错。
你可以参考我的这个例子,其实也是很简单的,我还用了很多 VB 的开发思路进去,你应该能看懂。最重要的是实现了多线程,比用 Microsoft 的控件效率高很多,在几年前的电脑上跑,这种技术 CPU 占用峰值也就是1%,通常是看不出有什么占用率,为同样是 VC ,跑 Microsoft 的控件,CPU 占用峰值可以跑到 100%,通常是 80% 以上,所以这种方案的效率是很不错的,你可以看一下。
http://download.csdn.net/detail/SupermanKing/2690778
sosoben 2012-09-25
  • 打赏
  • 举报
回复
Private Sub Form_KeyPress (KeyAscii As Integer)
Dim Buffer as Variant

' 设置并打开窗口
MSComm1.CommPort = 1
MSComm1.PortOpen = True

Buffer = Chr$(KeyAscii)
MSComm1.Output = Buffer
End Sub


这是msdn的例子, 没查到什么OutputSignal
dh243210877 2012-09-24
  • 打赏
  • 举报
回复
OutputSignal = TxtSend.Text 和output=txtSend.text有区别吗?在别人的代码里看到这个和我的不一样,别人的可以和下位机通信!
zfl2k 2012-09-24
  • 打赏
  • 举报
回复
没有和下位机握手
worldy 2012-09-23
  • 打赏
  • 举报
回复
和串口助手已经能通信,说明的的下位机软硬件都没有问题了,问题肯定是出在电脑端的串口访问程序上
dh243210877 2012-09-22
  • 打赏
  • 举报
回复
嗯,好的,我试试!
sosoben 2012-09-22
  • 打赏
  • 举报
回复
Frm2.MSComm1.InputMode = comInputModeBinary '以文本方度接收
Frm2.MSComm1.RThreshold = 1 '产生MSComm事件

这些东西放在打开串口之前设置试试看


sj(i / 3) = Val("&H" & Mid(sj_Txt, i + 1, 2))

这句不妥 Val 返回的是一个double吧(我忘记了是什么类型了)
你最好确保它是byte的输出
dh243210877 2012-09-22
  • 打赏
  • 举报
回复
Private Sub Form_Load()
TextCL.Visible = False






If Combo1.Text = "COM1" Then
Frm2.MSComm1.CommPort = 1
End If
If Combo1.Text = "COM2" Then
Frm2.MSComm1.CommPort = 2
End If
If Combo1.Text = "COM3" Then
Frm2.MSComm1.CommPort = 3
End If
If Combo1.Text = "COM4" Then
Frm2.MSComm1.CommPort = 4
End If
If Combo2.Text = "2400" Then
Frm2.MSComm1.Settings = "2400,n,8,1"
End If
If Combo2.Text = "4800" Then
Frm2.MSComm1.Settings = "4800,n,8,1"
End If
If Combo2.Text = "9600" Then
Frm2.MSComm1.Settings = "9600,n,8,1"
End If
If Combo2.Text = "14400" Then
Frm2.MSComm1.Settings = "14400,n,8,1"
End If
If Combo2.Text = "155200" Then
Frm2.MSComm1.Settings = "155200,n,8,1"
End If
End Sub

下面石达开串口的:
Private Sub Commddkck_Click()




If Frm2.MSComm1.PortOpen = False Then

Frm2.MSComm1.PortOpen = True '打开通信口

Commddkck.Caption = "关闭串口"
shpconnect.FillColor = &HFF&



ElseIf MSComm1.PortOpen = True Then

Frm2.MSComm1.PortOpen = False '关闭通信口

Commddkck.Caption = "开启串口"
shpconnect.FillColor = &HFF00&


End If

Frm2.MSComm1.InputMode = comInputModeBinary '以文本方度接收
Frm2.MSComm1.InBufferCount = 0 '清空接受缓冲区
Frm2.MSComm1.OutBufferCount = 0 '清空传输缓冲区
Frm2.MSComm1.RThreshold = 1 '产生MSComm事件
End Sub

接收的:
Dim strBuff As String
Select Case MSComm1.CommEvent
Case 2
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
Dim i As Integer
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i)) & " "

Else
strData = strData & Hex(BytReceived(i)) & " "
End If
Next
Textreceive.Text = strData
TextCL.Text = strData

lenInput = Len(strData)

'Text2 = lenInput \ 2
'数据处理代码
End Select
发送的:
Private Sub Command1_Click() ' 发送


If Textsend.Text = "" Then
MsgBox "发送的数据不能为空!", vbOKOnly, 16
Exit Sub
End If
Dim sj() As Byte
Dim sj_Txt As String
Dim i As Integer
sj_Txt = Textsend
If (Len(Textsend) Mod 3 = 0) Or ((Len(Textsend) + 1) Mod 3 = 0) And Len(Textsend) <> 0 Then '检验16进制字符串长
ReDim sj(Len(sj_Txt) / 3 - 1)
For i = 0 To Len(sj_Txt) Step 3
sj(i / 3) = Val("&H" & Mid(sj_Txt, i + 1, 2))
Next
If MSComm1.PortOpen = True Then
MSComm1.Output = sj
Else
MSComm1.PortOpen = True

MSComm1.Output = sj
End If
Else
MsgBox ("格式不对!")
End If
End Sub
现在是明显串口是存在的,把本本上的USB转串口都不用了!直接在台式上实验,提示8002无效的串口!不知道是怎么回事。
sosoben 2012-09-21
  • 打赏
  • 举报
回复
改了后的程序拿出来看看,跟打开串口怎么会有关系呢,一定是你串口被占用或者改了端口号
dh243210877 2012-09-20
  • 打赏
  • 举报
回复
嗯,这样改了,改成字节形式接收了。现在变成打开串口时,显示无效串口8002了,我再检查下看哪又出问题了!
dh243210877 2012-09-20
  • 打赏
  • 举报
回复
恩,使用助手选择16进制就可以正常通信,用程序就不行,我也不清楚是收不到还是发不到,因为用程序就没反应!
sosoben 2012-09-20
  • 打赏
  • 举报
回复
不明白你什么意思? 就是说你用调试助手就能跟下位机通信??
程序就不行?? 是收不到还是发不到??
sosoben 2012-09-20
  • 打赏
  • 举报
回复
MSComm1.Output = Trim(Textsend.Text)
这句要改,你一个字一个字地获取,然后一个一个地转成 byte型 再一个个地发送


或者直接发送 MSComm1.Output = Chr(&H5) & Chr(&H52) & Chr(&H1) & Chr(&H3) & Chr(&H0) & Chr(&H1) & Chr(&H4) & Chr(&H50)
dh243210877 2012-09-19
  • 打赏
  • 举报
回复
改成二进制形式了!16进制接收发送,模拟可以,实际还是通不上,悲催!
dh243210877 2012-09-19
  • 打赏
  • 举报
回复
我用的是模拟串口,将两个串口接通!
sosoben 2012-09-19
  • 打赏
  • 举报
回复
Output 属性可以传输文本数据或二进制数据。用 Output 属性传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的 Variant 到 Output 属性。

正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等等的数据,要以二进制形式发送。
加载更多回复(10)

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧