首页 > 系统相关 >linux系统epoll的ET/LT模式-附串口接收代码

linux系统epoll的ET/LT模式-附串口接收代码

时间:2024-10-12 13:21:42浏览次数:9  
标签:epoll read 模式 LT 串口 ET event

  • LT 模式下,读事件触发后,可以按需收取想要的字节数,不用把本次接收到的数据收取干净(即不用循环到 recv 或者 read 函数返回 -1,错误码为 EWOULDBLOCK 或 EAGAIN);ET 模式下,读事件必须把数据收取干净,因为你不一定有下一次机会再收取数据了,即使有机会,也可能存在上次没读完的数据没有及时处理,造成客户端响应延迟。
  • LT 模式下,不需要写事件一定要及时移除,避免不必要的触发,浪费 CPU 资源;ET 模式下,写事件触发后,如果还需要下一次的写事件触发来驱动任务(例如发上次剩余的数据),你需要继续注册一次检测可写事件。
  • LT 模式和 ET 模式各有优缺点,无所谓孰优孰劣。使用 LT 模式,我们可以自由决定每次收取多少字节(对于普通 socket)或何时接收连接(对于侦听 socket),但是可能会导致多次触发;使用 ET 模式,我们必须每次都要将数据收完(对于普通 socket)或必须理解调用 accept 接收连接(对于侦听socket),其优点是触发次数少。

 

void *thread_roverdata(void* arg)
{

    int i, ret;



    // Allocate memory for read buffer, set size according to your needs
    unsigned char read_buf [DATA_LEN];

    // Normally you wouldn't do this memset() call, but since we will just receive
    // ASCII data for this example, we'll set everything to 0 so we can
    // call printf() easily.
    memset(&read_buf, '\0', sizeof(read_buf));

    // Read bytes. The behaviour of read() (e.g. does it block?,
    // how long does it block for?) depends on the configuration
    // settings above, specifically VMIN and VTIME
    int num_bytes = 0;
    int len = 0;

    int epfd, nfds;
    struct epoll_event event;
      struct epoll_event* events;

      events=calloc(10, sizeof(event));  
    epfd = epoll_create(10); // 创建epoll实例

    event.data.fd = uart5; // 添加标准输入到epoll
    event.events = EPOLLIN; //  EPOLLET: epoll中的边沿触发的意思是只对新到的数据进行通知,而内核缓冲区中如果是旧数据则不进行通知
     epoll_ctl(epfd, EPOLL_CTL_ADD, uart5, &event);

    for(;;)
    {
        ret = epoll_wait(epfd, events, 10, -1);// -1 :wait until it happen
        for(i=0; i<ret; i++)
        {
            if (events[i].data.fd == uart5) {
                num_bytes = read(events[i].data.fd, read_buf, DATA_LEN);

                if (num_bytes < 0) 
                {
                    UARTSendData((char*)"Error reading: %s\r\n", strerror(errno));
                    //while(1);
                }
                RTK_LOCATION_HandleRoverData(read_buf, num_bytes);
                // WriteFIFO(&save_fifo,read_buf, num_bytes);
                num_bytes = 0;
            }
        }
    }
    close(uart5);
}

 

标签:epoll,read,模式,LT,串口,ET,event
From: https://www.cnblogs.com/boring-luobo/p/18460329

相关文章

  • deltas的翻译
    在这个表达式 deltas=dx-dx2 中,deltas 的翻译取决于其上下文和用途,但通常可以翻译为“差值”、“差异量”或“变化量”。差值:如果 dx 和 dx2 代表两个数值,那么 deltas 可以理解为这两个数值之间的差值。差异量:这个翻译也强调了 dx 和 dx2 之间的差异,适用于需......
  • 三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解
    二、默认过滤器链1、默认配置系统启动日志2、默认配置的过滤器及顺序如下org.springframework.security.web.session.DisableEncodeUrlFilterorg.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilterorg.springframework.security.web.c......
  • java.util.Collections#sort(java.util.List<T>)
    java.util.ArrayList/java.util.LinkedList/***java.util.Collections#sort(java.util.List)*publicstatic<TextendsComparable<?superT>>voidsort(List<T>list){*list.sort(null);*......
  • Non-terminating decimal expansion; no exact representable decimal result.
    使用Bigdecimal做除法publicstaticvoidmain(String[]args){//1、不设置保留位数System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3)));//2、divide以后再设置保留位数System.out.println(BigDecimal.valueOf(......
  • 串口屏在充电桩行业应用
    随着电动汽车销量和保有量的迅速增长,充电需求持续上升,新基建政策的支持使得充电桩建设进入快速发展期。充电桩作为新能源汽车补能的主流方式,其建设和完善对于推广新能源汽车至关重要。串口屏的应用串口屏在充电桩行业的应用主要体现在以下几个方面:信息显示:串口屏可以连接充......
  • 3.6 使用Ultralytics YOLO进行模型基准测试
    3.6使用UltralyticsYOLO进行模型基准测试UltralyticsYOLO生态系统及其集成引言当您的模型完成训练和验证后,下一步就是评估其在各种现实场景中的表现。UltralyticsYOLO11的基准测试模式通过提供一个强大的框架,用于评估模型在各种导出格式下的速度和准确性。观看视频:Ult......
  • resultmap返回字符串set集合
    在resultmap中写好数组实体层的set集合(不用list是因为要去重,要用list的话把set改为list,再下面的sql查询把DISTINCT去掉就可)这里的selectCategoryNumber对应图一中的selectCategoryNumberwhere语句中的recods_id对应图一的column的recods_id最后只要再定义的resultmap......
  • 绿盟防火墙忘记密码串口重置
    密码重置1、设备本身开启了密码恢复功能password-recoveryenable(系统默认开启)重启设备,在设备重启过程中根据提示或者不停按键“ctrl+B”进入bootware界面,查看界面显示botware界面,选择“8”-skipauthenticationforconsolepassword,将console口登录认证删除或者重置console密码......
  • Oracle中alter table的常用用法
    首发微信公众号:SQL数据库运维原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247486440&idx=1&sn=b8a50ce5e993b4ab196ddda705077d95&chksm=ea375f98dd40d68ea079d90ac6084078e8ec9e1a4b1f4cc266fb97976dc2c72f452a61f55850&token=1175589249&la......
  • Result Maps collection already contains value for xxx.xxx.dao.BaseResultMap错误
    重复引入jar包问题解决方法,在pom文件中排除这个jar包原:<dependency><groupId>com.hedu</groupId><artifactId>sweet-template-webapp</artifactId><version>1.0</version></dependency>排除后:&......