Как заставить программу C взаимодействовать с программой Python, используя виртуальные последовательные порты Linux? - PullRequest
1 голос
/ 23 марта 2019

Я хотел бы отправить данные из C-программы в Python-программу, которая будет визуализировать эти данные.Средой разработки является компьютер Linux (Ubuntu 18.04LTS).Проще говоря, обе программы работают на одном и том же компьютере.

Я использую termios для открытия последовательного порта в программе на C, а pySerial на стороне Python.Что касается последовательного порта, я использую "ttyS0".Проблема в том, что когда я посылаю «Hello» из C-программы в Python-программу и печатаю его на терминале, я вижу пробел, в основном я получаю это «».

У меня вопрос: могу ли я использовать для этой цели последовательный порт "ttyS0" (я думаю, это виртуальный порт)?

Вот код C:

#include <stdint.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>
#include <time.h>

// Termios init functions are not posted because the configuration
// is correct and proved that they are working.

int main()
{
    char *portname = "/dev/ttyS0";
    int fd;
    int wlen;
    unsigned char writeBuffer[] = "Hello!";

    fd = open(portname, O_RDWR | O_NOCTTY | O_SYNC);
    if (fd < 0) {
        printf("Error opening %s: %s\n", portname, strerror(errno));
        return -1;
    }
    /*baudrate 115200, 8 bits, no parity, 1 stop bit */
    set_interface_attribs(fd, B115200);

    do{
        wlen = write(fd, writeBuffer, sizeof(writeBuffer));
        printf("Sent data is: \"%s\"\n", writeBuffer);
        delay(500);
    } while(1);
}

Код Python:

import serial
from time import sleep

port = "/dev/ttyS0"
ser = serial.Serial(port, 115200, timeout=0.5)

while True:
    data = ser.readline()   
    print(str(data.decode('utf-8')))
ser.close()

1 Ответ

3 голосов
/ 23 марта 2019

ttyS0 - это последовательный порт вашего компьютера - в этом нет ничего «виртуального». Запись на это устройство попытается передать данные с компьютера через этот порт, а чтение с устройства попытается получить данные от внешнего устройства, подключенного к порту. Две программы на одном компьютере не могут с пользой общаться через последовательный порт.

Я думаю, что вы ищете здесь либо трубу , пару сокетов , либо pty . Какой из них наиболее подходит, зависит от ваших конкретных требований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...