最近在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时,阻塞相当于没有用了。