当前位置: 首页 > 知识库问答 >
问题:

Epoll读取错误的字节

微生翼
2023-03-14

所有消息的尾部都有2个字节的crc。11 b5表示消息开始。消息长度应为36字节。72 b5是另一个消息开始标记。112字节长度。73 b5也是消息标记。36字节。请找到蓝色下划线:这是一条好消息。小红胖胖的红是不好的。它是37字节长度。我有一个额外的字节和crc不匹配。下一个好的(绿色)。下一个坏消息。它是114字节而不是112字节,当然crc不匹配。

这是我的代码:

... All necessary includes

#define SERIAL_BAUD 921600
#define MAXEVENTS 1024

int openSerial()
{
struct termios options;
int fd;

if ((fd = open("/dev/ttyUSB0", O_RDWR)) == -1)
{
    return -1;
}

if (tcgetattr(fd, &options) < 0)
{
    printf("Unable to get options with tcgetattr\n");
    return -1;
}

if (cfsetispeed(&options, SERIAL_BAUD) < 0)
{
    printf("Unable to set input speed with cfsetispeed\n");
    return -1;
}

if (cfsetospeed(&options, SERIAL_BAUD) < 0)
{
    printf("Unable to set output speed with cfsetispeed\n");
    return -1;
}

cfmakeraw(&options);

//options.c_cflag |= SERIAL_BAUD; // Set Baudrate first time
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~CRTSCTS;

options.c_cflag &= ~ECHO; // Disable echoing of input characters
options.c_cflag &= ~ECHOE;

 // set to 8N1
options.c_cflag &= ~PARENB; // no parity
options.c_cflag &= ~CSTOPB; // 1 stop bit
options.c_cflag &= ~CSIZE; // Mask the character size bits
options.c_cflag |= CS8; // 8 data bits

options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);

options.c_oflag = 0;

options.c_cc[VTIME] = 2; // inter-character timer
options.c_cc[VMIN] = 1; // blocking read until

if (tcflush(fd, TCIFLUSH) < 0)
{
    printf("Unable to flush fd with tcflush\n");
    return -1;
}

if (tcsetattr(fd, TCSANOW, &options) != 0)
{
    printf("Unable to set options with tcsetattr\n");
    return -1;
}

return fd;
}

int main(void)
{
int fd;
int efd;
struct epoll_event event;
struct epoll_event* events;
int length;
unsigned char buff[512];

if ((fd = openSerial()) < 0)
{
    printf("Exiting because of openSerial failure\n");
    return 1;
}

efd = epoll_create1(0);

event.data.fd = fd;
event.events = EPOLLIN;

if (epoll_ctl(efd, EPOLL_CTL_ADD, fd, &event) < 0)
{
    printf("Epoll_ctl error occured\n");
    return 1;
}

events = (epoll_event*) calloc(MAXEVENTS, sizeof(event));

for(;;)
{
    int n = epoll_wait(efd, events, MAXEVENTS, 5000);

    if (n < 0)
    {
        // No ready descriptors, so wait a bit longer
        continue;
    }

    if(events[0].events & EPOLLIN)
    {
        length = read(events[0].data.fd, buff, sizeof(buff) / 2);

        if(length > 0)
        {
            printf("\n------MESSAGE START-------\n");
            for (int i = 0 ; i < length ; ++i)
            {
                if (i && i % 16 == 0)
                {
                    printf("\n");
                }
                printf("%02x ", buff[i]);
            }

            printf("\n------MESSAGE FINISH-------\n");
        }
    }
    else if(events[0].events & EPOLLOUT)
    {
        // TODO Write here to serial
    }
    else if(events[0].events & EPOLLHUP || events[0].events & EPOLLERR)
    {
        printf("Error occured on serial port\n");
    }
    else
    {
        printf("No data whthin 5 seconds.\n");
    }
}

free(events);
close(fd);

return 0;
}

共有1个答案

常波鸿
2023-03-14

您的问题是,read()返回的字节无法满足您的期望。我认为没有理由相信埃波尔与此有关。

我也看不出有任何理由认为,read()传递的字节与从设备dev/ttyUSB0接收的字节不同。如果这些与您预期的不同,那么我倾向于认为要么是设备出现故障,要么是您的预期不正确(或者至少不完整)。

 类似资料:
  • 我是一名铁锈新手,尝试阅读两个数字并计算它们的商: 但是当我试图编译它时,我得到了以下错误重复了几次: src/safe_div.rs:12: 12:12:21错误:不匹配类型:预期

  • 我正在尝试用auto连接aws上的我的经纪人。创造话题。在我的服务器中enable=true。属性文件。当我试图连接Java代理时,出现了以下错误。 1197[Kafka制作人网络线程|制作人-1]错误组织。阿帕奇。Kafka。客户。制作人内部。发送方-Kafka制作人I/O线程中的未捕获错误:org。阿帕奇。Kafka。常见的协议类型。SchemaException:读取字段“topic_met

  • Logcat错误 这是我使用robospice的代码 注意:这些相同的代码可以很好地运行一些json输出,一些不同类型的json,我得到了这个错误,我试图找出json结构的确切位置,但我感觉两者都是一样的,所以我很困惑,同时我喊出了这个错误的原因

  • 问题内容: 我正在尝试使用Java读取CSV文件。有些文件的开头可能有字节顺序标记,但不是全部。如果存在,字节顺序将与第一行的其余部分一起读取,从而导致字符串比较出现问题。 是否存在一种跳过字节顺序标记的简单方法? 问题答案: 你正在以这种方式使用它:

  • 我想知道是否有人能够在基于ARM的Debian发行版上成功地使用Netty Epoll本机传输?我已经下载了netty-transport-native-epoll-4.1。1.Final-20160526.120605-1。jar文件并将其放置在我的类路径中,但是当我尝试运行我的应用程序时,我得到以下错误: 我之前看到一篇文章谈到使用纯java实现,这就是我认为我正在使用的,但是基于ELFCLA

  • 我想在我的角度项目中添加钢系列。我有createad html-compass组件,但我收到了这个错误: _services错误类型错误:无法读取未定义的属性(读取主题)在ProjectService…/app/Subject.js:53/_next(node_modules)在_esm5__tryOrUnsub[EventEmitter.push.](node_modules)在_esm5…/c