Я работаю над личным проектом, в котором мне нужно подключить сценарий Python (3.7) к приложению QML (Qt 5.2, C ++17), все они работают на дистрибутиве Linux RHEL8.
Аппаратные подключения
У меня есть два компьютера с двумя USB-порты и 2 самодельных кабеля с преобразователями USB/RS485 с каждой стороны.
Что работает
Я могу общаться от ПК1 к ПК2 по первому кабелю и в другую сторону по второму кабелю.
Что не так
Я хочу чтобы иметь возможность определить, что порт уже используется, если я дважды запускаю свое программное обеспечение, чтобы избежать второго открытия и возврата сообщения об ошибке. Сначала на C++, затем на Python.
Конфигурация RS485
- 1 стартовый бит установлен в значение ' 0',
- 8 бит, составляющих байт,
- 1 бит четности,
- 1 стоповый бит установлено значение «1»,
- Состояние ожидания линий данных между кадрами установлено на «1»,
Скорость передачи данных: 115200 бод.
Я попробовал много решений, которые пока не сработали (например, : использование ioctl с другим флагом, ...). Можно ли хотя бы заблокировать отверстие для такой конфигурации (связь RS485 на порту USB и на портах RS485 в конце)?
Минималистский код
На каждой стороне у меня есть поток для приема и еще один для отправки данных.
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/789 ... pened-port