cfmakeraw

cfmakeraw sets the terminal attributes as follows:
            termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
                            |INLCR|IGNCR|ICRNL|IXON);
            termios_p->c_oflag &= ~OPOST;
            termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
            termios_p->c_cflag &= ~(CSIZE|PARENB);
            termios_p->c_cflag |= CS8;
就是将终端设置为原始模式,该模式下所有的输入数据以字节为单位被处理。在原始模式下,终端是不可回显的,而且所有特定的终端输入/输出模式不可用。
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <termios.h> #include <pthread.h> //串口初始化功能函数,fd:串口驱动设备的文件描述符 int tty_init(int fd) { //串口参数结构体 struct termios old_uart,new_uart; //清空结构体变量内容,memset bzero(&old_uart,sizeof(struct termios)); bzero(&new_uart,sizeof(struct termios)); //获取串口属性,旧的串口 tcgetattr(fd,&old_uart); //设置原始属性,重新设置属性 cfmakeraw(&new_uart); //激活本地连接CLOCAL与接收使能CREAD的选项 new_uart.c_cflag |= CLOCAL|CREAD; //设置输出、输入波特率 cfsetospeed(&new_uart, B115200); cfsetispeed(&new_uart, B115200); //设置数据位为8位 new_uart.c_cflag &= ~CSIZE; new_uart.c_cflag |= CS8; //无校验位 new_uart.c_cflag &= ~PARENB; //1个停止位 new_uart.c_cflag &= ~CSTOPB; //设置等待时间、最小接收字符个数 new_uart.c_cc[VTIME] = 0; new_uart.c_cc[VMIN] = 1; new_uart.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //本地模式设置为原始模式 //清空缓冲区 tcflush(fd,TCIOFLUSH); //设置串口属性到文件中 -- 生效属性 tcsetattr(fd, TCSANOW,&new_uart); return 0; } void *BLE_Send(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *s_msg = (char *)malloc(1024); //申请写入数据的空间 while(1) { printf("send:"); //从键盘输入数据保存到msg中 fgets(s_msg,1024,stdin); write(ble_fd,s_msg,strlen(s_msg)); //写数据 if(strncmp(s_msg,"quit",4)==0) { memset(s_msg,0,1024); break; } //清空内存 memset(s_msg,0,1024); } //释放堆空间 free(s_msg); } void *BLE_Recv(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *r_msg = (char *)malloc(1024); //申请接收数据的空间 while(1) { //读取串口接收的数据 read(ble_fd,r_msg,1024); printf("recv:%s\n",r_msg); if(strncmp(r_msg,"quit",4)==0) { memset(r_msg,0,1024); break; } //清空内存 memset(r_msg,0,1024); } //释放堆空间 free(r_msg); } int main(int argc,char *argv[]) { pthread_t ble_tid1=0,ble_tid2=0; //访问串口1驱动 int ble_fd = open("/dev/ttySAC1",O_RDWR); if(ble_fd==-1) { printf("open BLE error...\n"); return -1; } //串口初始化 tty_init(ble_fd); //串口数据读写线程 pthread_create(&ble_tid1,NULL,BLE_Send,(void *)&ble_fd); pthread_create(&ble_tid2,NULL,BLE_Recv,(void *)&ble_fd); //接合线程 pthread_join(ble_tid1,NULL); pthread_join(ble_tid2,NULL); //关闭文件 close(ble_fd); return 0; }#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <termios.h> #include <pthread.h> //串口初始化功能函数,fd:串口驱动设备的文件描述符 int tty_init(int fd) { //串口参数结构体 struct termios old_uart,new_uart; //清空结构体变量内容,memset bzero(&old_uart,sizeof(struct termios)); bzero(&new_uart,sizeof(struct termios)); //获取串口属性,旧的串口 tcgetattr(fd,&old_uart); //设置原始属性,重新设置属性 cfmakeraw(&new_uart); //激活本地连接CLOCAL与接收使能CREAD的选项 new_uart.c_cflag |= CLOCAL|CREAD; //设置输出、输入波特率 cfsetospeed(&new_uart, B115200); cfsetispeed(&new_uart, B115200); //设置数据位为8位 new_uart.c_cflag &= ~CSIZE; new_uart.c_cflag |= CS8; //无校验位 new_uart.c_cflag &= ~PARENB; //1个停止位 new_uart.c_cflag &= ~CSTOPB; //设置等待时间、最小接收字符个数 new_uart.c_cc[VTIME] = 0; new_uart.c_cc[VMIN] = 1; new_uart.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //本地模式设置为原始模式 //清空缓冲区 tcflush(fd,TCIOFLUSH); //设置串口属性到文件中 -- 生效属性 tcsetattr(fd, TCSANOW,&new_uart); return 0; } void *BLE_Send(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *s_msg = (char *)malloc(1024); //申请写入数据的空间 while(1) { printf("send:"); //从键盘输入数据保存到msg中 fgets(s_msg,1024,stdin); write(ble_fd,s_msg,strlen(s_msg)); //写数据 if(strncmp(s_msg,"quit",4)==0) { memset(s_msg,0,1024); break; } //清空内存 memset(s_msg,0,1024); } //释放堆空间 free(s_msg); } void *BLE_Recv(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *r_msg = (char *)malloc(1024); //申请接收数据的空间 while(1) { //读取串口接收的数据 read(ble_fd,r_msg,1024); printf("recv:%s\n",r_msg); if(strncmp(r_msg,"quit",4)==0) { memset(r_msg,0,1024); break; } //清空内存 memset(r_msg,0,1024); } //释放堆空间 free(r_msg); } int main(int argc,char *argv[]) { pthread_t ble_tid1=0,ble_tid2=0; //访问串口1驱动 int ble_fd = open("/dev/ttySAC1",O_RDWR); if(ble_fd==-1) { printf("open BLE error...\n"); return -1; } //串口初始化 tty_init(ble_fd); //串口数据读写线程 pthread_create(&ble_tid1,NULL,BLE_Send,(void *)&ble_fd); pthread_create(&ble_tid2,NULL,BLE_Recv,(void *)&ble_fd); //接合线程 pthread_join(ble_tid1,NULL); pthread_join(ble_tid2,NULL); //关闭文件 close(ble_fd); return 0; }#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <termios.h> #include <pthread.h> //串口初始化功能函数,fd:串口驱动设备的文件描述符 int tty_init(int fd) { //串口参数结构体 struct termios old_uart,new_uart; //清空结构体变量内容,memset bzero(&old_uart,sizeof(struct termios)); bzero(&new_uart,sizeof(struct termios)); //获取串口属性,旧的串口 tcgetattr(fd,&old_uart); //设置原始属性,重新设置属性 cfmakeraw(&new_uart); //激活本地连接CLOCAL与接收使能CREAD的选项 new_uart.c_cflag |= CLOCAL|CREAD; //设置输出、输入波特率 cfsetospeed(&new_uart, B115200); cfsetispeed(&new_uart, B115200); //设置数据位为8位 new_uart.c_cflag &= ~CSIZE; new_uart.c_cflag |= CS8; //无校验位 new_uart.c_cflag &= ~PARENB; //1个停止位 new_uart.c_cflag &= ~CSTOPB; //设置等待时间、最小接收字符个数 new_uart.c_cc[VTIME] = 0; new_uart.c_cc[VMIN] = 1; new_uart.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //本地模式设置为原始模式 //清空缓冲区 tcflush(fd,TCIOFLUSH); //设置串口属性到文件中 -- 生效属性 tcsetattr(fd, TCSANOW,&new_uart); return 0; } void *BLE_Send(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *s_msg = (char *)malloc(1024); //申请写入数据的空间 while(1) { printf("send:"); //从键盘输入数据保存到msg中 fgets(s_msg,1024,stdin); write(ble_fd,s_msg,strlen(s_msg)); //写数据 if(strncmp(s_msg,"quit",4)==0) { memset(s_msg,0,1024); break; } //清空内存 memset(s_msg,0,1024); } //释放堆空间 free(s_msg); } void *BLE_Recv(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *r_msg = (char *)malloc(1024); //申请接收数据的空间 while(1) { //读取串口接收的数据 read(ble_fd,r_msg,1024); printf("recv:%s\n",r_msg); if(strncmp(r_msg,"quit",4)==0) { memset(r_msg,0,1024); break; } //清空内存 memset(r_msg,0,1024); } //释放堆空间 free(r_msg); } int main(int argc,char *argv[]) { pthread_t ble_tid1=0,ble_tid2=0; //访问串口1驱动 int ble_fd = open("/dev/ttySAC1",O_RDWR); if(ble_fd==-1) { printf("open BLE error...\n"); return -1; } //串口初始化 tty_init(ble_fd); //串口数据读写线程 pthread_create(&ble_tid1,NULL,BLE_Send,(void *)&ble_fd); pthread_create(&ble_tid2,NULL,BLE_Recv,(void *)&ble_fd); //接合线程 pthread_join(ble_tid1,NULL); pthread_join(ble_tid2,NULL); //关闭文件 close(ble_fd); return 0; }#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include <termios.h> #include <pthread.h> //串口初始化功能函数,fd:串口驱动设备的文件描述符 int tty_init(int fd) { //串口参数结构体 struct termios old_uart,new_uart; //清空结构体变量内容,memset bzero(&old_uart,sizeof(struct termios)); bzero(&new_uart,sizeof(struct termios)); //获取串口属性,旧的串口 tcgetattr(fd,&old_uart); //设置原始属性,重新设置属性 cfmakeraw(&new_uart); //激活本地连接CLOCAL与接收使能CREAD的选项 new_uart.c_cflag |= CLOCAL|CREAD; //设置输出、输入波特率 cfsetospeed(&new_uart, B115200); cfsetispeed(&new_uart, B115200); //设置数据位为8位 new_uart.c_cflag &= ~CSIZE; new_uart.c_cflag |= CS8; //无校验位 new_uart.c_cflag &= ~PARENB; //1个停止位 new_uart.c_cflag &= ~CSTOPB; //设置等待时间、最小接收字符个数 new_uart.c_cc[VTIME] = 0; new_uart.c_cc[VMIN] = 1; new_uart.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //本地模式设置为原始模式 //清空缓冲区 tcflush(fd,TCIOFLUSH); //设置串口属性到文件中 -- 生效属性 tcsetattr(fd, TCSANOW,&new_uart); return 0; } void *BLE_Send(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *s_msg = (char *)malloc(1024); //申请写入数据的空间 while(1) { printf("send:"); //从键盘输入数据保存到msg中 fgets(s_msg,1024,stdin); write(ble_fd,s_msg,strlen(s_msg)); //写数据 if(strncmp(s_msg,"quit",4)==0) { memset(s_msg,0,1024); break; } //清空内存 memset(s_msg,0,1024); } //释放堆空间 free(s_msg); } void *BLE_Recv(void *arg) { int ble_fd = *(int *)arg; //获取文件描述符 char *r_msg = (char *)malloc(1024); //申请接收数据的空间 while(1) { //读取串口接收的数据 read(ble_fd,r_msg,1024); printf("recv:%s\n",r_msg); if(strncmp(r_msg,"quit",4)==0) { memset(r_msg,0,1024); break; } //清空内存 memset(r_msg,0,1024); } //释放堆空间 free(r_msg); } int main(int argc,char *argv[]) { pthread_t ble_tid1=0,ble_tid2=0; //访问串口1驱动 int ble_fd = open("/dev/ttySAC1",O_RDWR); if(ble_fd==-1) { printf("open BLE error...\n"); return -1; } //串口初始化 tty_init(ble_fd); //串口数据读写线程 pthread_create(&ble_tid1,NULL,BLE_Send,(void *)&ble_fd); pthread_create(&ble_tid2,NULL,BLE_Recv,(void *)&ble_fd); //接合线程 pthread_join(ble_tid1,NULL); pthread_join(ble_tid2,NULL); //关闭文件 close(ble_fd); return 0; }练习:使用蓝牙通信,手机发送“prev”显示上一张图片,发送"next"显示下一张图片
最新发布
07-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值