Связь C++/Python RS485 через USB, можем ли мы заблокировать уже открытый порт?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Связь C++/Python RS485 через USB, можем ли мы заблокировать уже открытый порт?

Сообщение Anonymous »

Контекст
Я работаю над личным проектом, в котором мне нужно подключить сценарий 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Связь RS485 между C++ и Python, разделение сообщений и получение нескольких приемов
    Anonymous » » в форуме Python
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • Связь через RS485
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • PySerial – как убедиться, что открытый порт USB закрыт перед повторным запуском приложения
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Последовательный порт через USB-связь
    Anonymous » » в форуме Android
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Последовательный порт через USB-связь
    Anonymous » » в форуме Android
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»