-1

我从 C 语言开始。我正在尝试编写一个从串行端口获取信息的程序(它不是文件)。串口不断发送信息。我写了一个小程序,但我不断收到分段错误:11。主要目标是获取我们通过串行端口获取的信息以存储在文件中。谢谢您的帮助。

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

int open_port();

main()
{

    printf("\n\nStarting...\n\n");
    open_port();

    return (1);
}

int open_port()
{
    int fd;
    int bytes;
    int string;

    char *input;


    struct termios options;

    /* open usb entry */
    fd = open("/dev/cu.usbserial-FTF6001E", O_RDWR | O_NOCTTY | O_NDELAY);


    /* check it could be opened */
    if (fd == -1)
    {
        perror("\n\nopen_port: Unable to open /dev/cu.usbserial-FTF6001E - ");
    }    
    else{

        ioctl(fd, FIONREAD, &bytes);
        printf("\n\nbytes: %d\n\n", bytes);



        fcntl(fd, F_SETFL, 0);

        /* get port options currently set*/
        tcgetattr(fd, &options);

        options.c_cflag &= ~PARENB;
        options.c_cflag &= ~CSTOPB;
        options.c_cflag &= ~CSIZE;
        options.c_cflag |= CS8;

        /* Set the baud rates to 19200...*/
        cfsetispeed(&options, B9600);
        cfsetospeed(&options, B9600);

        /* Enable the receiver and set local mode...*/
        options.c_cflag |= (CLOCAL | CREAD);

        /*Set the new options for the port...*/
        tcsetattr(fd, TCSANOW, &options);

        *input = (char) malloc (string * sizeof(char));

        if (input == 0){

            fputs("\n\nUps! Failed to allocate memory!!!\n\n",stdout);

        }

        if ( fgets (input , 100 , fd) != NULL ){
            puts (input);
            fclose (fd);
        }

        printf("input = %s", input);

    }
4

1 回答 1

2

你的问题出在这里:

*input = (char) malloc (string * sizeof(char));

首先,您要分配给input,而不是*input。因为input还不是指向任何地方的有效指针,*input所以是未定义的行为。

然而,即使你解决了这个问题,你也会遇到问题(a)。您的string变量尚未初始化,因此将设置为程序启动时堆栈上的任何垃圾。malloc这意味着无论如何您都不太可能获得正确数量的内存返回。

此外,您将返回值malloc转换为 a char!您永远不应该在 C 中malloc转换(例如 to char *)的返回值,因为它隐藏了某些错误,这些错误可能会在以后导致其他问题。

当然不应该将其转换为 a char,因为这几乎肯定会丢失信息。显式转换是您告诉编译器您知道自己在做什么-我认为这在这里不太准确:-)

事实上,我不确定你为什么要动态分配内存,因为你只读取了 100 个字节。抛弃malloc并定义input如下:

char input[100];
input[0] = '\0';

(a)甚至可能还有更多问题,它们只是我立即想到的问题。但是,我建议先修复这些,因为它们绝对是您的段错误的原因。

然后,如果仍有问题,请返回另一个问题。

于 2012-08-14T08:45:50.407 回答