• 正文
  • 相关推荐
申请入驻 产业图谱

飞凌嵌入式ElfBoard-串口编写程序

08/03 11:12
197
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

打开串口设备

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);

相关推荐