2017-12-27 68 views
3

我需要與連接到USB端口的Arduino Pro Micro控制器通話。在Arduino的IDE會從連接Arduino的正確響應與Arduino交談:在C#中工作,在Python中失敗

> #NAME 
>>> ARDUINO 

(請求字符串沒有換行終止符。)串行端口監視器:上傳給它的草圖應到一個標準的C#串做出響應與調試響應。

我寫了一個C#程序來測試通信自己,同時也得到適當的迴應:

using System; 
using System.IO.Ports; 
using System.Threading; 

class Program { 
    static SerialPort port; 

    // static void port_DataReceived(object sender, SerialDataReceivedEventArgs e) { 
    // // Show all the incoming data in the port's buffer 
    // Console.WriteLine(port.ReadExisting()); 
    //} 

    static void Main(string[] args) { 

     port = new SerialPort("COM5", 115200, Parity.None, 8, StopBits.One); 

     //   port.DataReceived += port_DataReceived; 

     Console.WriteLine("Port: " + port.PortName); 

     port.Open(); 

     if (!port.IsOpen) { 
      Console.WriteLine("Can't open port."); 
      return; 
     } 

     Console.WriteLine("Writing '#NAME' to port..."); 
     port.Write("#NAME"); 

     Thread.Sleep(500); 

     string ans = port.ReadExisting(); 
     Console.WriteLine("Response: " + ans + "| " + ans.Length); 

     port.Close(); 
    } 
} 

輸出:

Port: COM5 
Writing '#NAME' to port... 
Response: ARDUINO | 9 

我試圖說服使用Python和pySerial模塊控制器:

import serial 
from time import sleep 

# msg = b'\x00\x23\x00\x4e\x00\x41\x00\x4d\x00\x45\n' 
# msg = b'\x23\x4e\x41\x4d\x45\n' 
# msg = b'#NAME\n' 
# msg = b'\xff\xfe\x00\x00#\x00\x00\x00N\x00\x00\x00A\x00\x00\x00M\x00\x00\x00E\x00\x00\x00' 
# msg = b'\xff\xfe#\x00N\x00A\x00M\x00E\x00' 
# msg = bytes('#NAME', encoding="utf-8") 
# msg = bytes('#NAME', encoding="utf-16") 
# msg = bytearray([0x23, 0x4E, 0x41, 0x4D, 0x45]) 
# msg = bytearray(b"#NAME") 
msg = "#NAME".encode("utf-16") 

port = serial.Serial("COM5", baudrate=115200, parity=serial.PARITY_NONE, bytesize=8, stopbits=serial.STOPBITS_ONE, timeout=2) 

print("Port:", port.name) 
print("Is open?:", port.is_open) 
print("Writing:", msg) 

# port.writelines([msg]) 
port.write(msg) 

sleep(1) 

output = port.read_until(size=len(msg)) 
# output = port.read_all() 
print("Reading:", output) 

port.close() 

但我無法讓它正確響應:

Port: COM5 
Is open? True 
Writing: b'\xff\xfe#\x00N\x00A\x00M\x00E\x00' 
Reading: b'' 

pySerial的寫入方法不能使用字符串,只接受字節序列,所以我嘗試用不同的方法轉換字符串。

由於端口和控制器都能正常工作,我認爲這可能是我的Python或pySerial安裝的問題,所以我試着對它們進行測試。我有另一個控制器,它只是迴應它得到的任何輸入字節序列。測試使用相同的Python程序運行:

Port: COM5 
Is open? True 
Writing: b'\xff\xfe#\x00N\x00A\x00M\x00E\x00' 
Reading: b'\xff\xfe#\x00N\x00A\x00M\x00E\x00' 

有人可以,請解釋一下,發生了什麼,我怎麼可以跟使用Python第一控制器?

UPDATE:

我使用的串行端口監控程序來觀看的數據流:

Arduino的IDE串行監控數據交換日誌( '#NAME',沒有底線字節,波特率= 115200):

Port opened by process "javaw.exe" (PID: 2792) 

Request: 27.12.2017 16:24:37.38864 
23 4E 41 4D 45         #NAME   

Answer: 27.12.2017 16:24:37.58964 (+0.2010 seconds) 
41 52 44 55 49 4E 4F 0D 0A      ARDUINO..  

Port closed 

C#程序交換日誌( '#NAME',沒有底線字節,波特率= 115200):

Port opened by process "ConsoleApplication1.exe" (PID: 7004) 

Request: 27.12.2017 16:31:24.69564 (+26.5445 seconds) 
23 4E 41 4D 45         #NAME   

Answer: 27.12.2017 16:31:26.72564 (+2.0291 seconds) 
41 52 44 55 49 4E 4F 0D 0A      ARDUINO..  

Port closed 

Python程序Exchange日誌(B「#NAME」,沒有底線字節,波特率= 115200):

Port opened by process "python.exe" (PID: 2416) 

Request: 27.12.2017 16:39:32.00464 (+139.8020 seconds) 
23 4E 41 4D 45         #NAME   

Port closed 

所有三個程序寫相同的字節序列,我不明白,爲什麼Python程序不得到迴應。

回答

0

原來,我的控制器設備出現故障。我仍然不知道爲什麼它不響應Python發送的請求,而使用C#和Arduino IDE進行響應,但在用新設備替換之後,我在所有環境中都得到了所需的響應。

0

嘗試msg = msg.decode('ascii')msg = msg.decode('utf-16')然後再打印結果。那是在行print("Writing:", msg)之前。 我遇到了類似的問題,並嘗試了這一點,它爲我工作。

2

您正在使用帶有BOM的UTF16編碼,這很可能是不正確的。通常這些協議期望帶有換行符的ASCII:

import serial 
from time import sleep 

msg = "#NAME\r\n".encode('ascii') 
port = serial.Serial("COM5", baudrate=115200, parity=serial.PARITY_NONE, bytesize=8, stopbits=serial.STOPBITS_ONE, timeout=2) 

print("Port:", port.name) 
print("Is open?:", port.is_open) 
print("Writing:", msg) 

port.write(msg) 
sleep(1) 

output = port.read_until(size=len(msg)) 
print("Reading:", output) 

port.close() 
+0

是的,我擔心我輸入字節序列格式不匹配。不幸的是,這是一個遺留的草圖,它是在不考慮標準做法的情況下編寫的。測試序列不使用任何結束字節。原來,這個問題可能會比編碼不匹配更深層次。我已經更新了我的帖子,請看看是否有時間。 – Kef

相關問題