2017-08-07 236 views
0

我必須使用串口處理四個電機鏈。 的用戶手冊,表明在初始化過程中我需要發送(例如)字符串c#通過串口發送命令

Z 
1ECHO 
2ECHO 
3ECHO 
4ECHO 

,並告訴我要做到這一點,在我不認識的代碼,用命令

PRINT(#128, "Z", #13) 
PRINT(#129, "ECHO", #13) 
PRINT(#130, "ECHO", #13) 
PRINT(#131, "ECHO", #13) 
PRINT(#132, "ECHO", #13) 

要解釋這一點,手動還增加了一個句話我不明白:

與你上面的字符串可以通過電機 軟件,但主機公關初始化電機需要發送不同的相同命令 前綴:0,1,2,3和4實際上分別是0x80,0x81,0x82,0x83,0x84, 。十六進制值的十進制等價物128, 129,130,131和132

一個同事寫了Visual Basic中的工作代碼如下:

SerialPort.Output(chr(128) & "Z" & chr(13)) 
SerialPort.Output(chr(129) & "ECHO" & chr(13)) 
SerialPort.Output(chr(130) & "ECHO" & chr(13)) 
SerialPort.Output(chr(131) & "ECHO" & chr(13)) 
SerialPort.Output(chr(132) & "ECHO" & chr(13)) 

我翻譯成.NET與:

SerialPort.Write((char)128 + "Z" + (char)13); 
SerialPort.Write((char)129 + "ECHO" + (char)13); 
SerialPort.Write((char)130 + "ECHO" + (char)13); 
SerialPort.Write((char)131 + "ECHO" + (char)13); 
SerialPort.Write((char)132 + "ECHO" + (char)13); 

但它不起作用。

現在我不能嘗試,但我不知道是否可以工作,重寫我的代碼是這樣的:

SerialPort.Write("Z" + (char)13); 
SerialPort.Write("1ECHO" + (char)13); 
SerialPort.Write("2ECHO" + (char)13); 
SerialPort.Write("3ECHO" + (char)13); 
SerialPort.Write("4ECHO" + (char)13); 

如果它會工作,爲什麼它的工作原理? 如果它不起作用,我該如何正確翻譯我的同事的代碼?

+0

歡迎來到堆棧溢出,請更具體_does不work_。程序是否編譯?它是否在串口輸出任何東西?另請從[this]開始(https://stackoverflow.com/help/mcve)。 – vasek

+0

那麼第一次翻譯應該工作。我建議你試着看看你的輸出使用這樣的東西: https://freeserialanalyzer.com/ 它是一個很長的tima前,但當我擺弄串行通信,我做了一個嗅探器電纜來監測通信通過我已安裝的secont com端口: https://www.lammertbies.nl/comm/cable/RS-232-spy-monitor.html –

+0

@HenrikClausen實際上翻譯將無法正常工作,並且[這些言論](https ://msdn.microsoft.com/en-us/library/y2sxhat8(v = vs.110).aspx#Anchor_2)解釋原因。 – vasek

回答

0

您不能使用SerialPort.Write(string)默認編碼發送字節> 128(0x80),更多信息請參閱this。如果你需要確保你的數據匹配任何二進制協議,應該發送的數據爲byte列數組:

var data = new byte[] { 129, (byte)'E', (byte)'C', (byte)'H', (byte)'O', 13 }; 
SerialPort.Write(data, 0, data.Length); 

那麼你一定會沒有多餘的轉換在發送之前進行。

+0

謝謝,它發揮作用,如果我發送一個數組! – Andrea