C# 我可以使用SerialPort.Write发送字节数组吗
C# 我可以使用SerialPort.Write发送字节数组吗,c#,serial-port,C#,Serial Port,SerialPortWrite的文档说明 默认情况下,SerialPort使用AscienceODing对字符进行编码。 AscienceODing将大于127的所有字符编码为(字符)63或 '?'. 要支持该范围内的其他字符,请将“编码”设置为 UTF8编码、UTF32编码或Unicode编码 另见。这是否意味着我无法使用write发送字节数组 默认情况下,SerialPort使用AscienceODing对字符进行编码 您将读/写字符串s或字符s的方法与读/写字节的方法混淆了 例如,当您将其
SerialPort
Write
的文档说明
默认情况下,SerialPort使用AscienceODing对字符进行编码。
AscienceODing将大于127的所有字符编码为(字符)63或
'?'. 要支持该范围内的其他字符,请将“编码”设置为
UTF8编码、UTF32编码或Unicode编码
另见。这是否意味着我无法使用write
发送字节数组
默认情况下,SerialPort使用AscienceODing对字符进行编码
您将读/写字符串
s或字符
s的方法与读/写字节
的方法混淆了
例如,当您将其称为:
端口写入(“аббб”)
默认情况下,您将在端口缓冲区中获得“?”(0x3F
0x3F
0x3F
)。另一方面,这一呼吁:
// this is equivalent of sending "абв" in Windows-1251 encoding
port.Write(new byte[] { 0xE0, 0xE1, 0xE2 }, 0, 3)
将直接写入序列0xE0
0xE1
0xE2
,而不将字节替换为0x3F
值
UPD
让我们看看源代码:
public void Write(string text)
{
// preconditions checks are omitted
byte[] bytes = this.encoding.GetBytes(text);
this.internalSerialStream.Write(bytes, 0, bytes.Length, this.writeTimeout);
}
public void Write(byte[] buffer, int offset, int count)
{
// preconditions checks are omitted
this.internalSerialStream.Write(buffer, offset, count, this.writeTimeout);
}
你看到区别了吗?方法接受
字符串
,使用端口的当前编码将字符串转换为字节
数组。方法,该方法接受字节
数组,将其直接写入流,流是本机API的包装器
是的,文档愚弄了你。这
port.Encoding = System.Text.Encoding.UTF8;
string testStr = "TEST";
port.Write(testStr);
还有这个
byte[] buf = System.Text.Encoding.UTF8.GetBytes(testStr);
port.Write(buf, 0, buf.Length);
将导致传输相同的字节。在后一种情况下,串行端口的编码可以是任何内容
串行端口编码只对读取或写入字符串的方法起作用。是的,你可以@Roy:Yes,但这是一份文件,上面说“ascienceoding将大于127的所有字符编码为(char)63或“?”-这有点让人困惑,为什么我问你,如果你继续阅读,你会发现你可以改变编码。这是串行端口的命名恰当的编码属性。@dbasnett:因此,如果我将编码更改为UTF8,我应该能够发送字节数组?@dbasnett:Btw。您认为此实现合理吗:?是的,但我引用的(“ascienceoding将大于127的所有字符编码为(char)63或“?”)来自以字节数组为参数的Write文档,这就是我感到困惑的原因。那又怎样?不,这会是一种非常奇怪的行为。我会更新答案。好的,谢谢。也许你可以给我一些建议:,我似乎无法得到正确的回应。我应该试试SerialPort还是PInvoke?@user300224:对链接问题进行了评论,但我认为,如果您发布一个具体问题,它会更有用。我也回复了您的评论,请查看。是的,但我还没有转到测试部分。因为我需要编写一些读/写方法。首先选择方法是的,但我引用的(“AscienceODing将大于127的所有字符编码为(char)63或“?”)来自以字节数组为参数的Write文档-这就是为什么我感到困惑的原因。是的,端口的默认值为ASCII。您可以更改编码。