- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 Visual Basic 编写一个程序,遇到了一个奇怪的问题。我正在通过串行端口将字符串发送到望远镜安装座。当我发送 check
字符串时,作用域可以返回 chr(0) 或 chr(255)。这在返回 chr(255) 的 python 和 c++ 中工作得很好。但是,当我在 Visual Basic 中运行脚本时,它返回 chr(0) 或 chr(63)。
下面是两个相同的函数,一个在 python 中,一个在 Visual Basic 中。
谁能告诉我为什么 Visual Basic 返回 63 而不是 255?
Python 中的函数(返回正确值 0 和 255):
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 Basic 脚本(返回错误值 0 和 63)
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
最佳答案
.NET SerialPort
类有 an Encoding
associated with it用于在端口上发送的文本和字节之间进行转换。该文档称它用于“文本传输前和传输后转换”。目前尚不清楚 Encoding
用于将接收到的字节转换为从 ReadTo()
返回的 string
的文本(但这可能就是意思是“传输后”)。
无论如何,我很确定这就是您的 255
角色所发生的情况。 ReadTo()
方法使用Encoding
将接收到的数据转换为文本以放入string
中。默认的 Encoding
为 ASCIIEncoding
,它仅处理 0x00
- 0x7f
范围内的字符。超出该范围的字节将被编码为 '?'
字符,该字符的 ASCII 值恰好为 63
。
使用 ReadByte()
方法从端口读取数据,而不涉及任何文本编码。
更新:我发现 BCL 团队中某人发表的一篇博客文章证实了这一点,并指出了一个将传递未经修改的 8 位数据的编码对象。 Ryan Byington 在一篇名为 "SerialPort Encoding" on the Base Class Library (BCL) Blog 的文章中写道2006 年 5 月 26 日:
The
SerialPort
class uses the encoding specified by theSerialPort.Encoding
property to convert strings and character arrays to bytes to send across the serial port. This encoding also gets used when reading from the serial port to convert bytes received by the serial port to strings and character arrays.By default the
SerialPort
class uses ASCII encoding which converts all characters with the value of 0-127 to a single byte with the same value. So "Hello" gets converted to the byte array {72, 101, 108, 108, 111}. However every other character gets converted to a byte with the value of 63 or the'?'
character. This applies for reading as well so if the serial port received the byte array {72, 101, 108, 108, 111} it will convert this to "Hello" and any byte with a value greater then 127 will get converted to the'?'
character.The ASCII encoding works perfectly fine for most serial devices but there are still quite a few device that either send bytes with values beyond 127 or you need to send bytes with values greater then 127. You have two options; one would be to use the API’s that deal with
byte[]
and bypass theEncoding
, or to use the correct Encoding. However finding the correct encoding is a bit tricky as most encodings that deal with values above 127 will use multiple bytes which probably won’t work with the device attached to the serial port. The only encoding that converts all characters with a value 0-255 to a single byte with the corresponding value and vice versa when converting bytes to characters is the "Western European (ISO)" encoding. Use the following code to use this Encoding with the SerialPort class:SerialPort mySerialPort = new SerialPort("COM1");
mySerialPort.Encoding = Encoding.GetEncoding(28591);
关于VB.net 将 chr(255) 返回为 chr(63),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30815256/
chr(9)、chr(10)、chr(13)、chr(32)、chr(34) 所有关于 ASCII码的表格:[url]http://www.asciitable.com/[/url] chr(13)
一段简单的代码让我大吃一惊: if __name__ == '__main__': writen_text = chr(13) file = open('bug', 'w')
如果我编写以下代码,ReSharper 将建议我将第一个变量 chr3 转换为常量,但不将第二个变量 chr127 转换为常量。 Public Class ClassX Public Sub
我正在用 Visual Basic 编写一个程序,遇到了一个奇怪的问题。我正在通过串行端口将字符串发送到望远镜安装座。当我发送 check 字符串时,作用域可以返回 chr(0) 或 chr(255)
编辑:我说的是 Python 2.7 中的行为。 chr函数将 0 到 127 之间的整数转换为 ASCII 字符。例如 >>> chr(65) 'A' 我明白这在某些情况下是如何有用的,我明白为什么
我正在尝试通过我的串行端口传递一个直接的 ASCII 文本命令,如下所示: string cmd = "Hello World. "; template.Serial.WriteLine(cmd);
我正在使用 PL/SQL 中的电子邮件函数。单击按钮后 Javascript 调用该函数。这工作得很好。 我的问题是我使用 PL/SQL 变量在 Javascript 中生成电子邮件正文。代码看起来像
我必须解决应用程序中的问题。该应用程序是部署到应用程序服务器的 Oracle Form。最后的表格是按下按钮的过程,假设是发送电子邮件。在按钮代码的末尾,它有一个 PL/SQL 代码调用 C:\内的
我使用 Python 来解决来自 exploit-exercises 的原星挑战.我对这段代码在 python 3 中的不同输出感到惊讶。 payload = chr(0x24) + chr(0x84
例如,在西类牙,数字格式为:4.000.000,25(400 万又 1/4)。有没有一种方法可以在不将其更改为字符的情况下更改数字格式(最好是针对整个 R 项目)? 现在我在所有数据帧上执行一个函数。
我正在尝试编写一个简单的程序:在 while 循环中,它接受整数(保证在 0, 255 范围内),将其转换为相应的字符并将该字符写入文件,直到输入整数为 -1。我用 C++ 写的,效果很好。代码是:
c = list(range(97, 121)) 如果我打印它,它会给出 [97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
我在使用 chr() 函数时遇到问题。我的代码首先获取用户输入,将其放入一个数组中,然后使用 ord 函数将其转换为相应的数字值,并对关键字执行相同的操作。然后它使用 zip 函数将两个数组相加以获取
所以我很确定这是一个愚蠢的问题,但我正试图更深入地了解 python chr() 函数。另外,我想知道是否可以始终将整数参数设置为三位数字,或者所有 ascii 值的长度都是固定的? chr(20)
python的chr()相当于什么?和 ord() golang 中的函数? chr(97) = 'a' ord('a') = 97 最佳答案 它们被支持为简单的conversions : ch :=
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章PHP chr()函数讲解由作者收集整理,如果你对这篇文章有兴趣,记得点
我有一个 excel 表,其中的单元格具有可变数量的换行符,我想减少它,以便每个新行之间只有一个换行符。 例如 HELLO WORLD GOODBYE 将修改为: HELLO WORLD GOODBY
我有自己的带有加密功能的 D6 pas 库。今天在XE3下尝试使用,发现里面有很多bug,因为unicode的原因。我尝试移植到 AnsiString,但在 chr(nnn) 上失败了,在 Delph
假设我有 print [chr 0x49, chr 0x9f] 输出 "I\159" 当打印必须显示为转义序列的字符时,如何使 print 使用十六进制数字?这样我的输出就是: "I\x9f" 最佳答
我正在尝试通过串行连接发送文件(来自另一个开源项目)。然而,我在发送大文件时遇到了困难。文件长度无法正确转换。 我通过声明使用 int 数组 encoded = [] 然后找到文件长度。类似的东西 f
我是一名优秀的程序员,十分优秀!