Связь RS485 между C++ и Python, разделение сообщений и получение нескольких приемовPython

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

Сообщение Anonymous »

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Связь C++/Python RS485 через USB, можем ли мы заблокировать уже открытый порт?
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Связь через RS485
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Android AVC отклонил RS485
    Anonymous » » в форуме Android
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Как написать код C++ для запуска на Raspberry Pi для отправки данных через rs485? [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как написать код C++ для запуска на Raspberry Pi для отправки данных через rs485? [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

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