我的应用程序在Windows CE 6.0中使用Compact Framework,用于通过RS-232向设备发出远程命令。使用具有特定十六进制值的字节发送这些命令,例如,发送0x22 0x28 0x00 0x01作为命令序列。我一次发送一个字节。十六进制值在内部存储在每个命令序列的字符串中,例如, " 22,28,00,01&#34 ;.我使用以下代码发送字节。
Dim i As Integer
Dim SendString() As String
Dim SendByte, a As String
DutCommand = "22,0A,00,02,E7,83" 'Sample command string
SendString = Split(DutCommand, ",") 'Split the string
For i = 0 To UBound(SendString) 'Send each byte after encoding
SendByte = Chr(CInt("&H" & SendString(i)))
CommPort.Write(SendByte)
Next
即使对于大于0x7F的值,SendByte也被正确编码,但发送的最后两个字节(0xE7和0x83)被发送为0x3F,"和#34;的ASCII码。因为它大于0x7F。
我是否错过了Comm端口处理编码的设置?是否有一种简单的方法来发送值大于0x7F的数据?
答案 0 :(得分:1)
您只是忘了将十六进制值转换为字节。它需要看起来像这样:
For i = 0 To UBound(SendString) 'Send each byte after encoding
Dim b = Byte.Parse(SendString(i), Globalization.NumberStyles.HexNumber)
CommPort.BaseStream.WriteByte(b)
Next
非串行方式是:
Dim DutCommand As Byte() = {&H22, &H0A, &H00, &H02, &HE7, &H83}
CommPort.Write(DutCommand, 0, DutCommand.Length)
答案 1 :(得分:0)
我假设你正在使用SerialPort.Write。
如果是这样,请注意文档说的内容:
默认情况下,SerialPort使用ASCIIEncoding对字符进行编码。 ASCIIEncoding将大于127的所有字符编码为(char)63或'?'。要支持该范围内的其他字符,请将“编码”设置为UTF8Encoding,UTF32Encoding或UnicodeEncoding。
似乎解决方案很清楚。您需要将CommPort.Encoding
属性设置为所需的值。
有关详细信息,请参阅SerialPort.Encoding。
答案 2 :(得分:0)
根据SerialPort.Write
的{{3}}:
默认情况下,SerialPort使用ASCIIEncoding对字符进行编码。 ASCIIEncoding将所有大于127的字符编码为(char)63或 '?'。要支持该范围内的其他字符,请将the documentation设置为 UTF8Encoding,UTF32Encoding或UnicodeEncoding。
您还可以考虑实际只写原始字节的Encoding。