0

ファイル記述子 (シリアル ポート) からのデータを待機するスレッドを作成したいと思います。その間、このポートを介してデータを送信できる必要があります。

pthreadpollを使用しようとしていましたが、プログラムが最初からハング (スリープ) しており、メイン関数で最初のコマンドを実行していません。

問題は確かにポーリング機能にあります-時間を制限すると、すべての指示がこの時間後に実行されました。

これが私のコードです:

#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

遅れてすみません。問題はポーリングではなく、実際には printf です。read を使用すると、文字列の末尾にヌル ターミネータが配置されません。代わりに文字列の長さを返します。読み取りで printf を使用する場合、 を使用して、読み取りが書き込みを指示する文字数の後に停止するように printf に指示しますprintf("RX: %*.s", rc, buff)。これでrc、ヌル ターミネータが見つかるまで、書き込みの代わりに文字が書き込まれます。

于 2017-12-31T05:04:50.187 に答える