VB如何接收第九位数据

juniosan01 2009-03-23 04:25:07
我正在做VB串口与单片机的通信 单片机发送1位起始位 8位数据 还有TB8 1位停止位总共
11数据
我不知道如何接收单片机发送来的第九位数据是1还是0 呢?
怎么判断呢?
...全文
263 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdingyun 2009-03-24
  • 打赏
  • 举报
回复
以下代码按固定时间间隔发送ASC在0-255数值的单字节,接收端收到511字节耗时间10.87s,除字节ASC为0,接收到1字节外,其它都为2字节。
Option Explicit
Dim i As Integer
Dim sj(0) As Byte

Private Sub Command1_Click()
Timer1.Enabled = True
Print Timer
End Sub

Private Sub Command2_Click()
Timer1.Enabled = False
End Sub

Private Sub Form_Load()
MSComm1.Settings = "9600,s,8,1"
MSComm1.PortOpen = True
Timer1.Interval = 5
Timer1.Enabled = False
End Sub

Private 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 Byte

Private Sub Command1_Click()
Timer1.Enabled = True
Print Timer
End Sub

Private Sub Command2_Click()
Timer1.Enabled = False
End Sub

Private Sub Form_Load()
MSComm1.Settings = "9600,s,8,1"
MSComm1.PortOpen = True
Timer1.Interval = 5
Timer1.Enabled = False
End Sub

Private 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

juniosan01 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 of123 的回复:]

一般来说,第 9 位不会是真正的数据,一般表示一种状态。

RS-232 的数据位只能是 4-8 位,不可能设置为 9。此外,串口的缓存也是 8 位组,无法保存第 9 位。

上位机发送第 9 位一般是通过 Parity 位,置为 Mark 或 Space。

接收的时候,上位机应该是通过协议可以预知第九位的状态,并事先设置 Parity 属性、
[/Quote]
上位机应该是通过协议可以预知第九位的状态,并事先设置 Parity 属性、
你的想法是对的 赞一个先
zdingyun 2009-03-24
  • 打赏
  • 举报
回复
LZ:如果你只是发1个字节的话,接收端按
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字节。
zdingyun 2009-03-24
  • 打赏
  • 举报
回复
Option Explicit
Dim strHex As String

Private 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 Sub

Private Sub Form_Load()
MSComm1.Settings = "9600,e,8,1" 'e偶校验
MSComm1.RThreshold = 1
MSComm1.InputMode = comInputModeBinary
MSComm1.PortOpen = True
End Sub

Private 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
zdingyun 2009-03-24
  • 打赏
  • 举报
回复
MSComm 控件的属性除CommPort 属性必须在打开端口之前设置,它的Settings 属性可以在运行中改变。关键是单片机的响应时间,上位机可瞬间改变Settings 属性,接收可在MSComm1_OnComm事件中完成.
Option Explicit
Dim strHex As String

Private 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 Sub

Private Sub Form_Load()
MSComm1.Settings = "9600,e,8,1" 'e偶校验
MSComm1.RThreshold = 1
MSComm1.InputMode = comInputModeBinary
MSComm1.PortOpen = True
End Sub

Private 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
kxyzjm 2009-03-23
  • 打赏
  • 举报
回复
不能分成两组数据发吗
of123 2009-03-23
  • 打赏
  • 举报
回复

一般来说,第 9 位不会是真正的数据,一般表示一种状态。

RS-232 的数据位只能是 4-8 位,不可能设置为 9。此外,串口的缓存也是 8 位组,无法保存第 9 位。

上位机发送第 9 位一般是通过 Parity 位,置为 Mark 或 Space。

接收的时候,上位机应该是通过协议可以预知第九位的状态,并事先设置 Parity 属性、
zdingyun 2009-03-23
  • 打赏
  • 举报
回复
LZ的问题是个较特殊的串口通信问题,请参阅以下网址:
http://zhidao.baidu.com/question/48607087.html?si=3
能否有帮助,不得而知.
juniosan01 2009-03-23
  • 打赏
  • 举报
回复
有谁实际应用过,做过第9位
juniosan01 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 WallesCai 的回复:]
串口接受到的数据都是在INPUTBUFF里面,你每读取一次这个变量,就会自动清空,你用STRING或BYTE()去读,读完之后直接看BYTE(8)或者 mid(str,9,1)就是第9位
[/Quote]
不是很明白 能否举个例子
Dim Rec_Data as byte
Rec_data=MSComm1.Input
怎么判断第9位
熊孩子开学喽 2009-03-23
  • 打赏
  • 举报
回复
串口接受到的数据都是在INPUTBUFF里面,你每读取一次这个变量,就会自动清空,你用STRING或BYTE()去读,读完之后直接看BYTE(8)或者 mid(str,9,1)就是第9位
juniosan01 2009-03-23
  • 打赏
  • 举报
回复
还有个问题 如果上位机要发送9位数据 该怎么设置 这样4800,n,9,1?
juniosan01 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jhone99 的回复:]
mid(strtemp,9,1)
[/Quote]
strtemp指的是什么
jhone99 2009-03-23
  • 打赏
  • 举报
回复
mid(strtemp,9,1)
juniosan01 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chenyanm 的回复:]
你全部接收了.
然后直接截出第9位不就知道了
[/Quote]
不是很明白,能否举个例子
city_t 2009-03-23
  • 打赏
  • 举报
回复
那你又是怎么判断前几位数字是几啊?
串口不就是一个一个的接收的吗?
chenyanm 2009-03-23
  • 打赏
  • 举报
回复
你全部接收了.
然后直接截出第9位不就知道了

7,763

社区成员

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

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