LINUX C++ serial port block问题

最近在LINUX下做串口通信,串口通信很重要的问题就是阻塞与非阻塞两个问题,同时,阻塞与非阻塞是否能够真正起作用和内存分配也有很大关系,下面以阻塞设置来举例说明一下:阻塞何时会正常作用,又何时不能作用。

首先,我们当然是把串口打开,并设置为阻塞模式啦,串口设置共有三种模式,为:

O_RDWR , O_NOCTTY ,O_NDELAY 

我们不选择最后一个非阻塞模式O_NDELAY选项即可。

如下打开串口:

fd_ = open(dev_, O_RDWR | O_NOCTTY )

设置联合体

    typedef union 
    {
        float* point_;
        uint8_t* send_msg_[14];
    } write_ ;

//联合体的使用需要对内存有严重的关切!!!
//不能堆内存和栈内存混用,如果你用如下形式设置,那么将得不到结构体
/*

   typedef union 
    {
       float point_[3];
       uint8_t* send_msg_;
    } write_ ;

    write_ b;
    b.send_msg_ = new uint8_t[12];
原因在于,数组[]使用栈内存,而new分配了堆内存。

*/

设置VTIME和VMIN,前者表示读取字符时间隔时间(单位:0.1s),后者表示串口缓冲区能被读取的最少字符数

options_.c_cc[VTIME] = 0.1; /* 1读取一个字符等待1*(1/10)s */    
options_.c_cc[VMIN] = 14; /* 1读取字符的最少个数为1 */  

好啦,接下来就是测试读取了,什么情况下阻塞正常起作用呢?

read(fd_, test_.send_msg_, 14)

我们知道read第3个参数为buffer size,因此当串口缓冲区中的字符数大于等于14时,串口正常读取,

当小于14时,串口就被阻塞。

好了 ,当什么情况下阻塞不起作用呢?满足两个情况:

1、第三个参数小于14,

2、同时串口缓冲区字符数大于等于第三个参数buffer size时,阻塞相当于没有用了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值