Запись строк в последовательный порт в C ++ Linux - PullRequest
7 голосов
/ 18 февраля 2012

Я знаю, что этот вопрос разбросан по всему Интернету, но тем не менее, меня пока что ничто не может до конца понять Я хочу записать данные в последовательный порт на C ++ (linux) для платы Propeller. Программа работает нормально при получении ввода с консоли, но когда я записываю в нее строки, всегда возвращаю: ERROR - Invalid command с устройства. Я попытался создать массив char с шестнадцатеричными значениями, тогда это сработало. вот рабочий код, ниже. Но как я смогу просто предоставить строковую переменную команды и отправить ее на последовательный порт? возможно, как мне преобразовать его в шестнадцатеричные значения, если это единственный способ? Спасибо всем

примечание: цикл должен использовать пользовательский ввод с консоли. Мне нужен способ отправки строковой переменной на последовательный порт.

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

int main(int argc,char** argv){
    struct termios tio;
    struct termios stdio;
    int tty_fd;
    fd_set rdset;

    unsigned char c='D';

    printf("Please start with %s /dev/ttyS1 (for example)\n",argv[0]);
    memset(&stdio,0,sizeof(stdio));
    stdio.c_iflag=0;
    stdio.c_oflag=0;
    stdio.c_cflag=0;
    stdio.c_lflag=0;
    stdio.c_cc[VMIN]=1;
    stdio.c_cc[VTIME]=0;
    tcsetattr(STDOUT_FILENO,TCSANOW,&stdio);
    tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio);
    fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);       // make the reads non-blocking

    memset(&tio,0,sizeof(tio));
    tio.c_iflag=0;
    tio.c_oflag=0;
    tio.c_cflag=CS8|CREAD|CLOCAL;           // 8n1, see termios.h for more information
    tio.c_lflag=0;
    tio.c_cc[VMIN]=1;
    tio.c_cc[VTIME]=5;

    tty_fd=open(argv[1], O_RDWR | O_NONBLOCK);      
    cfsetospeed(&tio,B115200);            // 115200 baud
    cfsetispeed(&tio,B115200);            // 115200 baud

    tcsetattr(tty_fd,TCSANOW,&tio);

    //char str[] = {'V','E','R','\r'};
    //the above str[] doesn't work although it's exactly the same as the following
    char str[] = {0x56, 0x45, 0x52, 0x0D}; 
    write(tty_fd,str,strlen(str));
    if (read(tty_fd,&c,1)>0)
        write(STDOUT_FILENO,&c,1);

    while (c!='q')
    {
            if (read(tty_fd,&c,1)>0)        write(STDOUT_FILENO,&c,1); // if new data is available on the serial port, print it out
            if (read(STDIN_FILENO,&c,1)>0) 
                if(c!='q')
                    write(tty_fd,&c,1);        // if new data is available on the console, send it to the serial port
    }

    close(tty_fd);
}

Ответы [ 2 ]

9 голосов
/ 19 февраля 2012

Я счастлив решить свое собственное решение, но все же разочарован тем, что не увидел тривиальный вопрос намного раньше. char по умолчанию равно signed в c ++, что делает его держащим диапазон от -128 до 127. Однако мы ожидаем, что значения ASCII будут от 0 до 255. Следовательно, это так же просто, как объявить его unsigned char str[] все остальное должно работать. Глупый я, Глупый я.

Тем не менее, спасибо всем за помощь !!!

2 голосов
/ 18 февраля 2012

Вы уверены, что должны заканчиваться на '\ r'?При вводе текста с консоли клавиша возврата будет содержать символ '\ n' (в Linux), а не '\ r'

. Также в большинстве функций отсутствует проверка ошибок (open(), fcntl(),так далее.).Может быть, одна из этих функций не работает.Чтобы узнать, как проверить наличие ошибок, прочитайте справочную страницу (например, man 2 open для команды open(). В случае open() справочная страница объясняет, что возвращает -1, когда не удается открыть файл / порт.

После вашего редактирования вы написали:

char str[] = {0x56, 0x45, 0x52, 0x0D}; 
write(tty_fd,str,strlen(str));

, что неверно. strlen ожидает завершенную строку '\ 0', которая, очевидно, не является str, теперь она отправляет ваши данные и все, что естьв памяти, пока он не увидит «\ 0». Вам нужно добавить 0x00 в ваш массив str.

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