通过RS232

时间:2015-07-23 14:57:20

标签: vb.net unicode serial-port

我的应用程序在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的数据?

3 个答案:

答案 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