与Arduino交谈:在C#中工作,在Python中失败

我需要与连接到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程序不得到回应。

回答:

原来,我的控制器设备出现故障。我仍然不知道为什么它不响应Python发送的请求,而使用C#和Arduino IDE进行响应,但在用新设备替换之后,我在所有环境中都得到了所需的响应。

回答:

尝试msg = msg.decode('ascii')msg = msg.decode('utf-16')然后再打印结果。那是在行print("Writing:", msg)之前。 我遇到了类似的问题,并尝试了这一点,它为我工作。

回答:

您正在使用带有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()

以上是 与Arduino交谈:在C#中工作,在Python中失败 的全部内容, 来源链接: utcz.com/qa/264581.html

回到顶部