打开串口设备
| fd = open(”/dev/ttyS9”, O_RDWR | O_NOCTTY | O_NDELAY);
if (fd < 0) { perror(dev); printf("Can't Open Serial Port %s \n", dev); exit(0); } else { //设置串口参数 ... } |
首先我们使用open()函数打开串口设备/dev/ttyS9,设备使用了O_RDWR | O_NOCTTY | O_NDELAY标志,分别代表以读写方式打开、不让设备成为控制终端且设置非阻塞模式,也就是当无法打开设备时,不会在原地等待,会马上返回;
上面使用了if语句判断文件描述符fd,如果open()返回的文件描述符<0,则代表设备打开失败,输出“Can't Open Serial Port /dev/ttyS9”。
获取配置参数
我们前面介绍过tcgetattr()函数的用法,在这里就是获取上面open()函数返回的文件描述符fd作为tcgetattr()的参数,然后创建一个termios名为oldtio来储存串口旧的参数。
写配置
程序中是对newtio结构体中的c_cflag加上CLOCAL | CREAD,意为使驱动程序启动接收字符装置,同时忽略串口信号线的状态。
另外对c_cflag与上了~CSIZE,即设置数据位。
| struct termios newtio, oldtio;
if (tcgetattr(fd, &oldtio) != 0) { perror("tcgetattr"); return -1; } bzero(&newtio, sizeof(newtio)); newtio.c_cflag |= CLOCAL | CREAD; newtio.c_cflag &= ~CSIZE; |
清空缓冲区
| tcflush(fd, TCIFLUSH); |
使用tcflush()函数清空缓冲区,避免本次将之前残存的数据发送出去引起混乱。
配置生效
前面已经完成了对 struct termios 结构体各个成员进行配置,但是配置还未生效,我们需要将配置参数写入到终端设备(串口硬件),使其生效。通过 tcsetattr()函数将配置参数写入到硬件设备。
| ((tcsetattr(fd, TCSANOW, &newtio)) != 0){
perror("com set error"); return -1; } |
串口接收函数
使用read()函数读缓冲区的数据,即串口接收:
| read(fd, p_receive_buff, count); //读串口 |
串口发送函数
使用write()函数发送缓冲区的数据,即串口发送:
| write(fd, p_send_buff, count);//发送 |
关闭串口设备
使用close()函数关闭串口设备
| close(fd); |
197