MSComm 控件的Input 属性及InputMo…

Unicode和ASCII的区别?《加密与解密》第一页讲的“Unicode中,所有的字符都是16位,包括所有的7位ASCII码都被扩充为16位(注意,高位扩充的是零\X0).如英文字串“pediy”,它的ASCII码是:0X70 0X65 0X64 0X69 0X79 其Unicode码的16进制是 0X0070 0X0065 0X0064 0X0069 0X0079”
问:
1、“所有的7位ASCII码”是什么?
2、“扩充为16位”是什么意思?
3、“高位扩充的是零\X0”其中X0是什么?为什么“0X70 0X65 0X64 0X69 0X79 ”中都是0X?

ASCII码见书的表1.1,这些ASCII是7位,扩充到16位,就是将7位ASCII码前面填0,让它成为16位。
0x表示这个数是16进制。
逍遥散人
2005-08-20, 21:45:25
“高位扩充的是零\X0”中X0是什么意思?
逍遥散人
2005-08-20, 21:47:15
“ASCII码见书的表1.1,这些ASCII是7位”没有7位的啊?
nig
2005-08-21, 00:06:43
慢慢学,不要急。
我来帮你解释一下:
ASCII 是美国定义的字符标准,用数值0~~7F 表示常见的英文字符,10进制的范围就是0-127了,比如我们常见的大写字母A ,ASCII值就是41(16进制) 65(10进制)。可以参见书中给的。

因为表示的字符并不多,所以只用一个字节就可以表示了。而我们说的一个字节是8个二进制位(如:1111 1111,此数的10进制是255,16进制是FF),而7F的二进制形式为(0111 1111) 所以老大说的7位就指有效的7位。扩充成16位二进制位,就是把7F(0111 1111)中的最高位0向更高位扩展了,当然更高位就成了0了,这就是老大说的意思。

因为UniCode用16个二进位来表示字符了。
\X 70 或0X 是指当前的数据的进制为16进制 0x \x指前导符。

MSComm 控件的Input 属性及InputMode 属性探究

最近对MSComm 控件的Input 属性研究得出一些观点,提供给各位关心串口通信的爱好者。

当设置MSComm 控件的InputMode 属性为comInputModeText时,串口是按返回接收到的ASCII码在MSComm 控件转换成Unicode码。

以下代码可揭示上述结论:

Option Explicit

    Dim strData As Variant

 

Private Sub Command1_Click()

    Text2 = ""

End Sub

 

Private Sub Form_Load()

    Text1 = ""

    Text2 = ""

    MSComm1.CommPort = 1

    MSComm1.InputMode = comInputModeText '数据通过 Input 属性以文本形式取回。

    MSComm1.RThreshold = 1

    MSComm1.Settings = "9600,N,8,1"

    MSComm1.PortOpen = True

    MSComm1.InputLen = 1

End Sub

 

Private Sub MsComm1_OnComm() '接收数据

    Dim BytReceived() As Byte

    Dim strBuff As String

    Select Case MSComm1.CommEvent

        Case 2

            Text1 = ""

            Text3 = MSComm1.InBufferCount '接收缓冲区的字节数

            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

            '数据处理代码

            Dim sj As String

            sj = Right(strData, 2) & Left(strData, 2)

            Text1 = strData

            Text2 = Text2 & ChrW(Val("&H" & sj))

            strData = ""

    End Select

End Sub

注意上述代码中设置MSComm 控件的InputMode 属性为comInputModeText,而接收是按2进制Byte字节的数组取出。

用一串口调试程序发送文本字节,单个汉字或单个ASCII字符(英文字母或0-9数字),你会发现,接收到汉字时MSComm1.InBufferCount值为2,接收A-Za-z,0-9)时MSComm1.InBufferCount值为1。同时Text2中显示分别是调试串口程序发送的单个汉字或单个ASCII字符(英文字母或0-9数字)。

当设置MSComm 控件的InputMode 属性为comInputModeBinary时,串口是按返回一数据组的二进制数据(Byte)字节的数组,但MSComm1.Input可赋值给一个String变量strBuff,在转赋值给Byte数组BytReceived(),而不会出现歧义,其接收代码如下:

Option Explicit

    Dim strData As String

Private Sub Form_Load()

    Text1 = ""

    Text2 = ""

    MSComm1.CommPort = 1

    MSComm1.InputMode = comInputModeBinary '数据通过 Input 属性以文本形式取回。

    MSComm1.RThreshold = 1

    MSComm1.Settings = "9600,N,8,1"

    MSComm1.PortOpen = True

End Sub

 

Private Sub MSComm1_OnComm() '接收数据

    Dim BytReceived() As Byte

    Dim strBuff As String

    Select Case MSComm1.CommEvent

        Case 2

            MSComm1.InputLen = 0

            Text1 = ""

            Text2 = ""

            Text3 = MSComm1.InBufferCount

            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

            Dim sj As String

            sj = strData

            Text1 = sj

            Text2 = Chr(Val("&H" & sj))

            strData = ""

            '数据处理代码

    End Select

End Sub


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值