0

我想创建将等待来自文件描述符(串行端口)的数据的线程。在那个时候我必须能够通过这个端口发送数据。

我试图使用pthreadpoll,但是程序从一开始就挂起(休眠),甚至不在 main 函数中执行第一个命令。

问题肯定是轮询功能 - 当我限制时间时,所有指令都在此时间之后执行。

这是我的代码:

#define SERIAL_DEVICE "/dev/ttyUSB0"
#define SERIAL_BAUD 2400

#include <wiringSerial.h>
#include <stdio.h>
#include <pthread.h>
#include <poll.h>


//deklaracje
void *receiving( void *ptr )
{
    printf("New thread started");
    int fd= (int)ptr;
    struct pollfd fds[1];
    fds[0].fd = fd;
    fds[0].events = POLLIN ;
    int pollrc=-1;

    while(1)
    {
        pollrc = poll( fds, 1, -1);
        if (pollrc < 0)
        {
            perror("poll");
        }
        else if( pollrc > 0)
        {
            if( fds[0].revents & POLLIN )
            {
                unsigned char buff[1024];
                ssize_t rc = read(fd, buff, sizeof(buff) );
                if (rc > 0)
                {
                    printf("RX: %s",buff);
                }

            }
        }
    }
}


int main(int argc, char *argv[])
{
    int fd = serialOpen(SERIAL_DEVICE, SERIAL_BAUD);

    if (fd<0)
    {
        printf("Serial opening error");
        return 1;
    }

    pthread_t serialReceiver;
    printf("-----");
    int thr=pthread_create(&serialReceiver,NULL,receiving,fd);
    printf("%i",thr);
    if(thr!=0)
    {
        printf("Error during creating serialReceiver thread.");
        return 1;
    }

    int status;
    pthread_join(serialReceiver,(void **)&status);

    printf("%i",status);

    return 0;
}
4

2 回答 2

0

您可以使用select()等待文件描述符,直到有一些数据要读取。

您可以在此处阅读有关用法的信息。

于 2013-10-20T08:06:15.947 回答
0

对不起,我来晚了。您遇到的问题不是您的民意调查,而是您的 printf。当您使用 read 时,它不会在字符串末尾放置一个空终止符。它改为返回字符串的长度。将 printf 与 read 一起使用时,您想通过使用printf("RX: %*.s", rc, buff). 现在,它将写入rc字符而不是写入,直到找到空终止符。

于 2017-12-31T05:04:50.187 回答