Чтение последовательных данных из C (OSX / dev / tty) - PullRequest
0 голосов
/ 24 марта 2010

Я пытаюсь прочитать данные со сканера штрих-кода Bluetooth (KDC300), используя C. Вот код, который у меня есть, и программа успешно устанавливает соединение Bluetooth со сканером, но при сканировании штрих-кода нет ввода отображается на экране (в конце концов, с данными будет сделано больше, но мы должны сначала заставить их работать, верно).

Вот программа:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <sys/ioctl.h>

int main (int argc, const char * argv[]) {

    // define vars
    int STOP = 0;
    //char buf[255];

    if(argv[1])
    {
        int fd = open("/dev/tty.KDC1", O_RDONLY);
        if(fd == -1)
        {
            printf("%s", strcat("Unable to open /dev/tty.", argv[1]));
        }

        int res;
        while(STOP == 0)
        {
            while((res = read(fd,buf,255)) == 0);
            {
                if(res > 0)
                {
                    buf[res]=0;
                    printf("%s:%d\n", buf, res);
                    if(buf[sizeof(buf)]=='\n') break;   
                }
            }
        }
    }

    return 0;
}

Если у кого-то есть идеи, я пока в замешательстве. Если это поможет, я могу запустить screen /dev/tty.KDC1 и все штрих-коды, отсканированные на сканере, появятся в терминале, я просто не могу ничего сделать с данными.

Джуд

Ответы [ 4 ]

7 голосов
/ 24 марта 2010

Эта строка:

        while((res = read(fd,buf,255)) == 0);

Не делает то, что вы думаете, что делает. Это цикл while с пустым телом.

1 голос
/ 03 марта 2011

Здесь - лучшая информация, которую я нашел.

Программа на C, использующая termios, работала просто путем добавления

#include<string.h>

И изменение скорости передачи в соответствии с моими потребностями.

1 голос
/ 24 марта 2010

@ tommieb75, оператор strcat был с самого начала "go" в программе, я взял переменную из argv [1] и добавил ее в /dev/tty.*, чтобы вы могли выбрать, какое устройство вы хотите отслеживать.

Я не уверен, почему я закомментировал buf, возможно, это связано с тем, что я слишком много смотрю на код / ​​пробую разные подходы и забываю, где я находился (не так много программиста на C, именно так я могу потеряться 30 LOC).

@ caf, Хорошо поймать лишнюю точку с запятой после цикла while, к сожалению, даже после исправления программа работает некорректно.

Я продолжаю исследовать проблему. Я могу проверить (с помощью osx packetlogger), что компьютер получает данные, но в буфере никогда не помещаются никакие данные.

-Jud

--------------- -------------- Edit

Я решил проблему после небольшой проб и ошибок. Добавление следующего кода для настройки последовательного соединения решило все проблемы:

struct termios theTermios;

memset(&theTermios, 0, sizeof(struct termios));
cfmakeraw(&theTermios);
cfsetspeed(&theTermios, 115200);

theTermios.c_cflag = CREAD | CLOCAL;     // turn on READ
theTermios.c_cflag |= CS8;
theTermios.c_cc[VMIN] = 0;
theTermios.c_cc[VTIME] = 10;     // 1 sec timeout
ioctl(fileDescriptor, TIOCSETA, &theTermios);

Спасибо за ответы на другие вопросы.

0 голосов
/ 24 марта 2010

В вашем коде

printf("%s", strcat("Unable to open /dev/tty.", argv[1]));

Почему вы это сделали?Было бы проще сделать это следующим образом:

printf("%s: Unable to open /dev/tty.KDC1", argv[0]); 

Почему параметр ссылается на командную строку?

res = read(fd,buf,255)

Почему у вас было buf объявление, закомментированное выше?

...