Контекст
Я работаю над личным проектом, в котором мне нужно подключить сценарий Python (3.7) к приложению QML (Qt 5.2, C ++17), все они работают на дистрибутиве Linux RHEL8.
Аппаратные подключения
У меня есть два компьютера с двумя USB-порты и 2 самодельных кабеля с преобразователями USB/RS485 с каждой стороны.
Что работает
Я могу общаться от ПК1 к ПК2 по первому кабелю и в другую сторону по второму кабелю.
Что не так
Python сторона получает данные из С++, иногда в один прием, иногда в два. Поэтому я занимаюсь тем, что получаю данные один за другим и жду, пока символы SOF и EOF сообщат об управлении полученными данными. Но для меня есть что-то неправильное при получении данных иногда при множественном приеме.
То же самое происходит и на стороне C++, когда он читает данные, отправленные Python, иногда данные являются полными. при первом приеме иногда требуется два приема.
Пример: сообщение длиной 15 байт можно получить за один раз, или сначала я получаю 4 символа, затем 11 последующих.
Желаемая конфигурация RS485
[*]1 стартовый бит установлен на «0»,[*]8 бит, составляющих байт,
[*]1 бит четности,
[*]1 стоповый бит, установленный в «1»,
[*]1 стоповый бит, установленный в «1»,
[*] li>
Состояние ожидания линий данных между кадрами установлено на «1»,
[*]Скорость передачи данных: 115200 бод.
Вопрос
Не будучи экспертом в области связи RS485, я прочитал много руководств и документации, чтобы понять, как настроить обе стороны. (С++ и Python). Можете ли вы сказать мне, вызван ли множественный прием неправильной конфигурацией RS485? Я не знаю, исходит ли проблема со стороны C++ или Python.
Минималистический код
В каждом сторона у меня есть поток для приема и еще один для отправки данных.
Python:
import threading, struct
from .GenericMessage import crc_16
import serial
class SerialManager:
# Constructor
def __init__(self):
# Update parameter for the RS485 connection
self.serialPortName_read = "/dev/ttyUSB1"
self.serialPortName_send = "/dev/ttyUSB0"
self.serialPort_read = serial.Serial()
self.serialPort_send = serial.Serial()
# Create sockets and start listening thread
self.createRS485connection()
self.receiverThread = threading.Thread(target=self.listeningThread)
self.receiverThread.daemon = True
self.receiverThread.start()
def createRS485connection(self):
# Configure sending device
self.serialPort_send.port = self.serialPortName_send # Set device name
self.serialPort_send.baudrate = 115200 # Set baud rate at 115 200 baud
self.serialPort_send.bytesize = serial.EIGHTBITS # Set Number of data bits for a byte = 8
self.serialPort_send.parity = serial.PARITY_EVEN # Set parity bit to even
self.serialPort_send.stopbits = serial.STOPBITS_ONE # Set stop bit to 1
# Open sending device
self.serialPort_send.open()
# Configure receiving device
self.serialPort_read.port = self.serialPortName_read # Set device name
self.serialPort_read.baudrate = 115200 # Set baud rate at 115 200 baud
self.serialPort_read.bytesize = serial.EIGHTBITS # Set Number of data bits for a byte = 8
self.serialPort_read.parity = serial.PARITY_EVEN # Set parity bit to even
self.serialPort_read.stopbits = serial.STOPBITS_ONE # Set stop bit to 1
self.serialPort_read.timeout = 0.0001 # Set timeout to read to 0.0001 second
# Open reading device
self.serialPort_read.open()
# Reset all previous data received
self.serialPort_read.reset_input_buffer()
return
def sendMessage(self, message):
bytesSent = self.serialPort_send.write(message)
if bytesSent < 0:
print("Message not sending")
elif bytesSent != len(message):
print("Message not sent completely")
else:
return
def listeningThread(self):
# Initialize variables
dataReceived = b''
while self.isListening:
# Wait for data to read
if self.serialPort_read.in_waiting > 0:
# Read byte one by one
for i in range(self.serialPort_read.in_waiting):
dataReceived += self.serialPort_read.read(1)
# Function to manage character one by one and reconstruct the original message to deal with
C++
#include "../inc/SerialManager.h"
SerialManager::SerialManager()
{
m_RS485_serialPortName_sending = "/dev/ttyUSB0";
m_RS485_serialPortName_reading = "/dev/ttyUSB1";
// Configure RS485 devices
configureRS485sendingSide();
configureRS485readingSide();
// Create a new thread for listening and one for sending
m_threadListeningServer = std::thread(&SerialManager::listenWhileLoop, this);
m_threadListeningServer.detach();
m_threadSendingServer = std::thread(&SerialManager::sendWhileLoop, this);
m_threadSendingServer.detach();
}
SerialManager::~SerialManager()
{
// Close the RS485 devices when finished
if (close(m_RS485_serialPort_reading) < 0)
qDebug()
Подробнее здесь: https://stackoverflow.com/questions/788 ... ve-in-mult
Связь RS485 между C++ и Python, разделение сообщений и получение нескольких приемов ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Связь C++/Python RS485 через USB, можем ли мы заблокировать уже открытый порт?
Anonymous » » в форуме Python - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-