首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.net返回chr(255)作为chr(63)

VB.net返回chr(255)作为chr(63)
EN

Stack Overflow用户
提问于 2015-06-13 04:57:29
回答 1查看 3.2K关注 0票数 4

我正在用visual编写一个程序,遇到了一个奇怪的问题。我是通过串口发送字符串到望远镜安装。当我发送check字符串时,作用域可以返回chr(0)或chr(255)。这在python和c++返回chr(255)时工作得很好。但是,在visual中运行脚本时,它返回chr(0)或chr(63)。

下面是两个相同的函数,一个在python中,一个在visual中。

有人能告诉我为什么visual basic返回63而不是255吗?

python中的函数(返回正确的值0和255):

代码语言:javascript
复制
global d, check
d=chr(80)+chr(4)+chr(16)+chr(2)+chr(1)+chr(112)+chr(252)+chr(0)
check=chr(80) + chr(1) + chr(16) + chr(19) + chr(0) + chr(0) + chr(0)+chr(1)


def test():
    ser.write(d)
    time.sleep(.1)
    print ser.readline()
    ser.write(check)
    time.sleep(.1)
    out=ser.readline()[0]
    print "out=",ord(out)
    while out == chr(0):
            print "out = ", ord(out)
            ser.write(check)
        time.sleep(.1)
            out=ser.readline()[0]
        print "out=",ord(out)
    print "out is now", ord(out)
    ser.readline()

visual中的脚本(返回错误的值0和63)

代码语言:javascript
复制
Public Sub test()
    Dim out As Char
    Dim d As String = Chr(80) + Chr(4) + Chr(16) + Chr(2) + Chr(1) + Chr(112) + Chr(252) + Chr(0)
    Dim check As String = Chr(80) + Chr(1) + Chr(16) + Chr(19) + Chr(0) + Chr(0) + Chr(0) + Chr(1)
    port.Write(d)
    Threading.Thread.Sleep(100)
    Console.Write(port.ReadTo("#"))
    port.Write(check)
    Threading.Thread.Sleep(100)
    out = port.ReadTo("#")
    Console.Write(vbNewLine & "out=" & out)
    While out = Chr(0)
        Console.Write("out = " & Convert.ToInt16(out))
        port.Write(check)
        Threading.Thread.Sleep(0.1)
        out = port.ReadTo("#")
        Console.Write("out=" & Convert.ToInt16(out))
    End While
    Console.Write("out is now" & Convert.ToInt16(out))
    port.ReadLine()


End Sub
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-13 05:23:23

.NET SerialPort类具有用于在端口上发送的文本和字节之间转换的 associated with it。文档中说,它用于“文本的前、后传输转换”。还不清楚Encoding是否用于将接收到的字节转换为从t ReadTo()返回的string的文本(但这可能是“后传输”的意思)。

无论如何,我很确定这就是你的255角色正在发生的事情。ReadTo()方法使用Encoding将接收到的数据转换为文本以放入string中。默认的EncodingASCIIEncoding,它只处理范围0x00 - 0x7f中的字符。超出该范围的字节将被编码为'?'字符,这些字符恰好具有63的ASCII值。

而是使用ReadByte()方法从端口读取数据,而不涉及任何文本编码。

更新:我在BCL团队中发现了一篇博客文章,证实了这一点,并指出了一个未经修改的编码对象将传递8位数据。2006年5月26日,Ryan在一篇叫做"SerialPort Encoding" on the Base Class Library (BCL) Blog的文章中写道:

SerialPort类使用SerialPort.Encoding属性指定的编码将字符串和字符数组转换为通过串口发送的字节。这种编码在从串行端口读取以将串行端口接收的字节转换为字符串和字符数组时也会使用。 默认情况下,SerialPort类使用ASCII编码,它将值为0-127的所有字符转换为具有相同值的单个字节。因此,"Hello“被转换为字节数组{72,101,108,108,111}。但是,每个其他字符都被转换为一个值为63的字节或'?'字符。这也适用于读取,因此如果串行端口接收到字节数组{72、101、108、108、111},它将将其转换为"Hello“,任何值大于127的字节都将被转换为'?'字符。 对于大多数串行设备来说,ASCII编码工作非常好,但是仍然有相当多的设备发送值超过127的字节,或者需要发送值大于127的字节。您有两种选择;一种是使用处理byte[]的API并绕过Encoding,或者使用正确的编码。然而,找到正确的编码有点棘手,因为大多数处理127以上值的编码都将使用多个字节,而这些字节可能无法处理附加到串口的设备。将值为0-255的所有字符转换为具有相应值的单个字节的唯一编码方式是“西欧(ISO)”编码,反之亦然。使用以下代码对SerialPort类使用此编码: SerialPort mySerialPort =新SerialPort("COM1");mySerialPort.Encoding = Encoding.GetEncoding(28591);

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30815256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档